reactjs - React 中“无法在现有状态转换期间更新(例如在`render`中)”错误的解决方案是什么?
问题描述
我正在尝试编写一个 React 应用程序,其中父组件将回调函数传递给子组件,调用回调函数并传递一个参数,并更新父组件中的状态变量,将其设置为参数。但我一直遇到这个错误:
警告:在现有状态转换期间无法更新(例如在 内
render
)。渲染方法应该是 props 和 state 的纯函数。
我在这里找到了有关此问题的其他问题,并阅读了有关错误含义的解释,但是有关如何解决该错误的所有解释都涉及更复杂的组件结构,因为我才刚刚开始与反应。我希望有人能告诉我如何修改这个简单的组件结构来做我想做的事,同时避免这个错误(我在 codepen.io 环境中这样做,如果这很重要的话):
class Parent extends React.Component {
constructor(props) {
super(props)
this.state = { word: 'hello' }
}
myCallback = (dataFromChild) => {
this.setState({ word: dataFromChild })
}
render() {
return (
<div>
<p>{this.state.word}</p>
<Child callbackFromParent={this.myCallback} />
</div>
)
}
}
function Child(props) {
return (
<div>
<button onClick={props.callbackFromParent('goodbye')}>Say goodbye</button>
</div>
)
}
// ========================================
ReactDOM.render(<Parent />, document.getElementById('root'));
解决方案
添加一个()
for myCallback 函数
myCallback = dataFromChild => () => {
尝试文本演示:
function Child(props) {
return (
<div>
<button onClick={props.callbackFromParent("goodbye")}>Say goodbye</button>
</div>
);
}
class App extends React.Component {
constructor(props) {
super(props);
this.state = { word: "hello" };
}
myCallback = dataFromChild => () => {
this.setState({ word: dataFromChild });
};
render() {
return (
<div>
<p>{this.state.word}</p>
<Child callbackFromParent={this.myCallback} />
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById("root"));
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.12.0/umd/react-dom.production.min.js"></script>
推荐阅读
- git - vscode git, sftp 配置
- java - Request.getParameter 错误地解码了字符串
- algorithm - 最短路径长度与最小切割能力的关系
- sql - 如何在 excel microsoft 查询中将变量声明为参数?
- ios - 未声明 T 的 Swift 泛型
- flutter - 如果单击颤动中的后退箭头,网页视图页面为空?
- firebase - 我正在尝试使用 firstore 和 swiftui 编写一些测试,我可以创建和读取,但现在我不知道如何列出唯一数据,
- html - 为什么字体真棒在这个html代码中不起作用?
- java - 我正在尝试在 android studio 中使用 MQTT 协议。我也更新了 gradle.properties
- performance - 初始渲染时如何增加 Ionic4 项目的加载时间?