当前位置: 首页 > 面试题库 >

反应,未捕获RangeError:超出最大调用堆栈大小

淳于思淼
2023-03-14
问题内容

我正在做反应,基本上我想用工具提示制作一个按钮,现在我正在制作工具提示。我正在更改css
display属性,以使其在鼠标进入和离开时不可见。但是有一个错误,我不知道该怎么办…

这是我的代码:

import React from 'react';
import ReactDOM from 'react-dom';
import Style from 'style-it'; 
var Ink = require('react-ink');
import FontIcon from '../FontIcon/FontIcon';

var IconButton = React.createClass({

  getInitialState() {
      return {
          iconStyle: "",
          style: "",
          cursorPos: {},
      };
  },

  extend(obj, src) {
      Object.keys(src).forEach(function(key) { obj[key] = src[key]; });
      return obj;
  },

    Tooltip(props) {

        var style = {};

        if (this.tooltipDisplay) {
            style.display = "block";
        } else if (!this.tooltipDisplay) {
            style.display = "none";
        };

        return <div className="tooltip" style={style}>{_props.tooltip}</div>;
    },

    showTooltip(){
        this.tooltipDisplay = true;
    },

    removeTooltip(){
        this.tooltipDisplay = false;
    },

  render() {

    var _props = this.props,
      tooltip = this.Tooltip,
      opts,
      tooltipDisplay = false,
      disabled = false,
      rippleOpacity,
        outterStyleMy = {
        border: "none",
            outline: "none",
            padding: "8px 10px",
        "background-color": "red",
        "border-radius": 100 + "%",
        cursor: "pointer",
        },
        iconStyleMy = {
            "font-size": 12 + "px",
            "text-decoration": "none",
            "text-align": "center",
            display: 'flex',
            'justify-content': 'center',
            'align-items': 'center',
        },
      rippleStyle = {
        color: "rgba(0,0,0,0.5)",
      };

    if (_props.disabled || _props.disableTouchRipple) {
      rippleStyle.opacity = 0;
    };

    this.setState({
      iconStyle: _props.iconStyle
    });

    this.setState({
      style: _props.style
    });

    if (_props.disabled) {
       disabled = true;
    };

    if (this.state.labelStyle) {
        iconStyleMy = this.state.iconStyle;
    };

    if (this.state.style) {
      outterStyleMy = this.state.style;
    };

    if (_props.href) {
      opts.href = _props.href;
    };

        var buttonStyle = this.extend(outterStyleMy, iconStyleMy);

        return(
        <Style>
        {`
          .IconButton{
            position: relative;
          }
          .IconButton:disabled{
            color: ${_props.disabledColor};
          }
          .btnhref{
            text-decoration: none;
          }
        `}
         <a {...opts} className="btnhref" > 
          <tooltip text={this.props.tooltip} position={this.options} />
          <button ref="button" className={"IconButton" + _props.className} disabled={disabled} style={buttonStyle}
          onMouseEnter={this.showTooltip} onMouseLeave={this.removeTooltip} >
            <Ink background={true} style={rippleStyle} opacity={rippleOpacity} />
            <FontIcon className={_props.iconClassName}/>
          </button>
        </a>
        </Style>
        );

  }
});



ReactDOM.render(
 <IconButton href="" className="" iconStyle="" style="" iconClassName="face" disabled="" disableTouchRipple="" tooltip="aaaaa" />,
 document.getElementById('app')
);

在控制台中,我收到此错误:

Uncaught RangeError: Maximum call stack size exceeded
at defineRefPropWarningGetter (App.js:1053)
at Object.ReactElement.createElement (App.js:1220)
at Object.createElement (App.js:3329)
at Constructor.render (App.js:43403)
at App.js:15952
at measureLifeCyclePerf (App.js:15233)
at ReactCompositeComponentWrapper._renderValidatedComponentWithoutOwnerOrContext (App.js:15951)
at ReactCompositeComponentWrapper._renderValidatedComponent (App.js:15978)
at ReactCompositeComponentWrapper._updateRenderedComponent (App.js:15902)
at ReactCompositeComponentWrapper._performComponentUpdate (App.js:15880)

我找不到问题所在。我知道这可能与调用一个函数有关,后者又调用另一个函数。但是我在代码中看不到这样的东西,而且不确定是否全部。感谢帮助 :)


问题答案:

每当您看到setStaterender函数内部调用的代码时,它都应该唤起与人类movie电影相同的情感。状态更改仅应发生以下更改:用户单击按钮,调整浏览器窗口的大小,拍摄照片等。

这是问题代码:

render () {
    ...
    this.setState({
      iconStyle: _props.iconStyle
    });

    this.setState({
      style: _props.style
    });
    ...
}

[嘴里吐]

上面的代码将导致无限循环,因为setState会导致render被调用。由于iconStylestyle是道具,并且道具无法更改,因此您应该使用这些道具来建立初始状态。

getInitialState() {
  return {
      iconStyle: this.props.iconStyle,
      style: this.props.style,
      cursorPos: {},
  };
}

以后,如果有人单击按钮并且您想要更改iconStyle,则将创建一个单击处理程序来更新您的状态:

handleClick () {
  this.setState({
    iconStyle: 'clicked'
  });
}

这将导致您的组件被重新渲染,并且新状态将得到反映。

将您的“状态”想象为正在做饭的人,我们将为他们做饭的照片。在 初始状态 是“蛋破碎: 没有 ,面粉倒: 没有 ,蔬菜切碎:
没有 ”,你拿这个状态的照片。然后厨师做点什么-将鸡蛋弄碎。现在状态已更改,您可以对其进行拍照。然后她切蔬菜。同样,状态已更改,您需要拍照。

类比中的每张照片都代表您的“渲染”功能-
在特定时间点的“状态”快照。如果每次拍摄照片时面粉都倒了,那我们就不得不再拍张照片,因为面粉刚倒了。拍摄另一张照片会导致倒出更多的面粉,因此我们不得不拍摄另一张照片。最终,您会在腹腔的噩梦中将厨房装满天花板,并使房间里的所有人窒息而死。您还会用完相机上的胶卷或硬盘空间。



 类似资料:
  • React.js用props给后代组件发值错了? 我编写了前面的演示来测试使用向后代组件发送信息。但它导致了错误: 未捕获的范围错误:对象超过了最大调用堆栈大小。克隆元素 但是我在演示运行良好后才写,所以你能告诉我是什么原因导致错误吗?

  • 我在我的应用程序中使用react路由器v4。我正在开发一个仪表板,它有一个顶部导航,侧导航和主体布局。侧边导航有一个链接列表,当点击它的时候,它会转到它们的组件,并在另一个被称为主体的组件中呈现它们的组件。我已经将仪表板组件分解为顶部、侧面和主要部分。在索引中,我创建了一个路由列表,并将这些路由作为道具发送到主体,以便我可以呈现路由组件。 这样,我得到的误差为 已超出最大调用堆栈大小 为什么会这样

  • 我在chrome上收到错误“未捕获的范围错误:超出最大调用堆栈大小”。这是我的j查询函数 从这行

  • 我在使用jQuery ajax时遇到了一个问题。我有javascript 这段代码产生错误“UncaughtRangeError:Maximum call stack size exceeded”,我不明白为什么。我没有触发器,我使用了preventDefault和stopPropagation,但我仍然有这个错误。有人能帮我吗?

  • 问题内容: 我想这意味着有一个循环引用,但是对于我的一生,我无法猜测如何解决它。 有人有主意吗? http://plnkr.co/edit/aNcBcU?p=预览 检查Chrome中的调试控制台(例如),您将看到错误。冒犯的行是 通过以下方式在控制器上对scope.map进行“ $ watched” 问题答案: 这是因为您要比较对象是否相等,而不是参考。将您的声明更改为此:

  • 这是我在React中的第一个应用程序。在localhost中,一切正常,当我使用Github Pages部署时,我的应用程序(Info/Images/evenements)中的一些页面无法呈现。每次单击他们的链接访问他们时,我都会在控制台上看到一个白色页面和此错误: range error:object . tostring处超出了最大调用堆栈大小 同样,当我刷新页面时,github pages返