gpt4 book ai didi

javascript - 子组件 props 不反射(reflect)父组件的状态变化

转载 作者:行者123 更新时间:2023-12-02 23:18:10 25 4
gpt4 key购买 nike

我的应用程序的相关部分使用了 4 个组件,1 个父组件和 3 个子组件。正如预期的那样,父组件处理所有状态并通过 props 将值传递给子组件。

父组件包含更新状态更改的方法,也通过 props 传递下来。子组件除了组件方法之外没有状态,它们仅使用可视数据的 props。

我遇到的问题是,当我调用更新父状态的方法时,父状态已成功更新(通过控制台验证),但是通过其 Prop 反射(reflect)此状态的子组件却没有直观地呈现状态变化。

代码如下,我将尽力解释:

父组件更新状态方法:

handleUpvoteState(blurtIndex) {
let blurts = [...this.state.followingBlurts],
updatedBlurt = {...blurts[blurtIndex]};
updatedBlurt.vote++;
blurts[blurtIndex] = updatedBlurt;
this.setState({
followingBlurts: blurts
});
console.log(this.state.followingBlurts[blurtIndex].vote); // State change reflected.
}

父组件将状态传递给子组件:

<LazyBlurtsPanel
appendDate={this.state.appendDate}
random={this.state.randomize}
blurts={this.state.followingBlurts}
handleLazyState={this.handleLazyState}
handleUpvoteState={this.handleUpvoteState}
lazyElement='lzyfollowing'
apiMethod={this.state.apiMethod}
currentUser={false}
/>

惰性面板组件(上图)然后通过 props 将数据发送到页脚子组件:

<BlurtFooter 
voteCount={this.props.blurts[i].vote}
currentUser={this.props.currentUser}
blurtId={this.props.blurts[i]._id}
blurtIndex={i}
handleUpvoteState={this.props.handleUpvoteState}
/>

当我打电话时

this.props.handleUpvoteState(index)

在我的子页脚组件中,父状态已成功更新。但是,页脚组件不会重新呈现以反射(reflect)父级的更新状态。

这是未重新渲染的页脚组件代码:

render() {
return (
<div className="blurt-panel-footer">
<UpvoteCount voteCount={this.props.voteCount}/>

非常感谢任何帮助。

编辑:对于如何调用 blrtfooter 存在一些困惑,因此我包含了如何在 LazyBlurtPanel 组件内的循环内构建面板的代码。这是代码:

for(let i=numRendered; i<renderCount; i++) {
if (this.props.blurts[i]) {
renderBlurts.push(
<div className='blurt-panel' id={(((i + 1) % 6) === 0) ? this.props.lazyElement : 'false'} key={i}>
<BlurtHeader blurt={this.props.blurts[i]} />
<div className='blurt-panel-body'>
<Sanitizer dirty={ this.props.blurts[i].text } />
{
(this.props.blurts[i].blurtImg !== 'false')? <img src={'/images/blurt/' + this.props.blurts[i].blurtImg} /> : ''
}
</div>
<BlurtFooter
voteCount={this.props.blurts[i].vote}
currentUser={this.props.currentUser}
blurtId={this.props.blurts[i]._id}
blurtIndex={i}
handleUpvoteState={this.props.handleUpvoteState}
key={this.props.blurts[i]._id} //Tried with and without key here..
/>
</div>
);
}
}

最佳答案

尝试更改 BlurtFooter 的调用方式。即使这不能解决问题,它仍然是更易于维护的代码

render() {
const { currentUser, blurts, lazyElement, handleUpvoteState } = this.props;
return (
<Fragment>
{
blurts.filter(x => x).map((blurt, index) => (
<div className="blurt-panel" id={(((index + 1) % 6) === 0) ? lazyElement : 'false'} key={blurt._id}>
<BlurtHeader blurt={blurt} />
<div className="blurt-panel-body">
<Sanitizer dirty={blurt.text} />
{
blurt.blurtImg !== 'false' &&
<img src={`/images/blurt/${blurt.blurtImg}`} />
}
</div>
<BlurtFooter
voteCount={blurt.vote}
currentUser={currentUser}
blurtId={blurt._id}
blurtIndex={index}
handleUpvoteState={handleUpvoteState}
/>
</div>
)
}
</Fragment>
);
}

还有很多其他改进可以做,但看看它是如何工作的,特别是正确设置 key 是必须的。

我不确定 div 上的 id 是什么,但它看起来也很可疑,不应该在那里。

另外,不需要 blurts.filter(x => x) 部分,因此应该改进状态以不需要它

更新:确保采用上面的最新代码

关于javascript - 子组件 props 不反射(reflect)父组件的状态变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57081077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com