【发布时间】:2019-10-29 08:22:57
【问题描述】:
我知道,在 ReactJS 中我可以将状态传递给组件。
父 jsx:
<Display active={this.state.dispActive} />
并像这样在子 jsx 渲染中使用它(示例):
<div>Display: {this.props.active ? 'Active' : 'Inactive'}</div>
但是当我尝试在孩子自己的状态下使用它时,它不起作用:
state = {
isActive: this.props.active
}
可能状态在构造函数中被初始化一次,然后就没有改变了。
我想在这里调用一个函数,在孩子中,当道具的状态发生变化时。我发现解决这个问题的唯一方法是将所有子代码包含到父代码中,然后作为代码的结果传递状态
家长:
handleDisplayChange = (e) => {
//Code here then use this.setState to change parent's this.state
//which then reflects on the passed props in the child
}
但是,如果子对象包含某种逻辑上不属于父对象的库,我想说设置该对象的某个属性在子对象中?
this.display = new Display();
this.display.setActive = this.state.isActive
this.display 是在子级中构造的。它不属于父母的上下文。我需要
- 设置 this.display.setActive 的子函数
- 设置子本身的 this.state.isActive。
这不属于 Parent.jsx,因为 parent 应该将显示放置在一个 jsx 构造函数中,而将按钮工具栏放置在另一个中:
<div className="App">
<Toggle toggleState={this.toggleState} active={this.state.dispActive}/>
<Display active={this.state.dispActive} />
</div>
编辑:粘贴了错误的代码,进行了编辑以使其更有意义。
【问题讨论】:
-
你可以使用componentDidUpdate()来检测变化
-
@ShoebMirza 我试过这个,但它不起作用。事实上它有效,但总是为时已晚。 ReactJS 似乎更新了孩子的 jsx,然后运行 did update 来改变状态。我单击切换,显示显示“活动”,但孩子中的 this.state.isActive 仍然显示为 false。第二次单击后,this.state.isActive 变为 true,但现在应该显示为非活动状态。 this.state.isActive 总是后退一步。
-
你能用你试过的
componentDidUpdate部分更新吗? -
你可以从你的 parent.js 发送函数到你的子组件并从子组件触发
-
@ShoebMirza 更正,我用 componentWillUpdate() 试过了。组件确实更新了。但是,只有当我检查 this.state.isActive !== this.props.active 之前,否则我会收到最大更新深度错误。
标签: reactjs