我在react中工作,基本上我想做一个带工具提示的按钮,现在我正在做工具提示。我正在更改css显示属性,以使它在鼠标进入和离开时可见或不可见。但是有一个错误,我不知道该怎么办...
这是我的代码:
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)
我找不到问题出在哪里。我知道这可能是关于调用一个函数,而这个函数又调用另一个函数。但是我在代码中看不到这样的东西,我不确定是否都是这样。谢谢帮助:)
我也遇到了同样的问题,我安装了“reactime”扩展,那个扩展给我带来了这个问题。从chrome中删除那个扩展,解决了这个问题。
多亏了@RyanWheale,我注意到了我的错误。
在我的渲染函数中,我返回了一个按钮元素,该元素调用了一个改变特定状态的函数。返回的按钮如下所示:
<button onclick={this.edit()} className="button-primary">Edit</button>
我的edit
函数改变了一些状态,如下所示:
edit: function () {
this.setState({editing: true});
}
我的错误是,我不小心在< code>this.edit后面输入了括号。因此,当按钮元素被呈现时,编辑函数实际上被调用,混乱发生了。现在,当我写下
而不是
它工作得完美无瑕。我希望我能帮助某人节省宝贵生命中的几个小时。
干杯:)
问题是您正在从渲染函数内部调用 setState
。状态更改只能作为某些更改的结果发生:用户单击按钮,调整浏览器窗口大小,拍摄照片等。
永远不要在渲染时更新状态(重复最后一句话20次,永远不要忘记)。
以下是问题代码:
render () {
...
this.setState({
iconStyle: _props.iconStyle
});
this.setState({
style: _props.style
});
...
}
上述代码将导致无限循环排序,因为setState
会导致调用render
。由于iconStyle
和style
是道具,道具不能更改,因此您应该使用这些道具来构建初始状态。
getInitialState() {
return {
iconStyle: this.props.iconStyle,
style: this.props.style,
cursorPos: {},
};
}
稍后,如果有人单击按钮,并且您希望 iconStyle 更改,则可以创建一个单击处理程序来更新您的状态:
handleClick () {
this.setState({
iconStyle: 'clicked'
});
}
这将导致您的组件被重新渲染,并反映新的状态。
把你的“状态”想象成某人在做饭,我们要拍下他们做饭的照片。初始状态是“鸡蛋裂开了:没有,面粉倒了:没有,蔬菜切碎了:没有”,你拍下这个状态。然后厨师做了一些事情-打鸡蛋。现在状态变了,你拍一张。然后她切蔬菜。再一次,状态改变了,你拍了一张照片。
类比中的每一张照片都代表了你的“渲染”功能——特定时间点“状态”的快照。如果每次你拍一张照片,面粉都被倒进去了,那么我们将不得不再拍一张照片,因为面粉刚刚被倒进去了。再拍一张照片会导致更多的面粉被倒进去,所以我们必须再拍一张照片。最终,你会让厨房里的天花板充满乳糜泻的噩梦,让房间里的每个人窒息。你的相机上的胶卷或硬盘空间也会用完。
我在玩React,我得到了我想要的功能,但是由于某个地方的无限循环,它非常慢。我相信它在组件生命周期方法中,但我不知道如何重新格式化下面的代码,使其具有相同的功能,但没有无限循环。任何关于最佳实践的建议都将不胜感激。
我是React的初学者。js并试图理解道具的概念 我有两个组件 - UserData.jsx UserDataResult.jsx 在UserData中。jsx我用过这个。用户记录的状态。我想通过子组件UserDataResult.jsx显示此记录。 不知道我做错了什么,所以我在控制台日志中得到错误。 错误是:未捕获的范围错误:超出最大调用堆栈大小 代码: **UserData.jsx** **用
下面的代码抛出了问题标题中提到的堆栈溢出。我正试图让一个方框阴影以脉冲效果显示在一个圆形图像的周围。有人能指出递归吗?我是一个Javascript新手,看不出来。谢谢你。 断续器 CSS 脚本
我刚刚开始使用角度2。所以我尝试使用Web服务从数据库显示类别。 这是我的论坛.服务.ts文件 forum.component.ts: forum.component.html: 请帮忙,先谢了
我正在检查要设置的配置值,如果是,我想重定向到子路由。如果不是像往常一样显示。代码确实按预期更新了URL,但随后进入了无限循环。
我正在使用对话框,并从Material-UI和React中选择组件。 只是一个例子: 在点击select之后,我从Modal.js得到了这个错误: "未捕获的RangeError:最大调用堆栈大小超出。在HTMLDocument.Modal._this.enforceFocus(Modal.js?86a5:197)" 有什么想法吗?