gpt4 book ai didi

javascript - 从 setState() 更新 View 不​​会按预期触发重新渲染

转载 作者:行者123 更新时间:2023-11-28 06:31:12 25 4
gpt4 key购买 nike

答案:我是个骨头。虽然已经晚了,但我不想留下一个没有答案的话题,特别是因为我最初的答案是错误。我需要引用我获得的 Prop ,而不是this.props。像往常一样,答案在 documentation 中。 。我在下面更新了自己的答案以反射(reflect)这一点。

编辑 1:我的第一个 fiddle 没有完全显示我的问题,所以我 updated it以更好地展示。由于某种原因,当我调用我的 setState() 时,我相信第一次通过它是未定义的,即使它给定了一个值,但在后续传递中它会按预期工作。看起来我最初的 setState() 调用没有触发重新渲染,但所有其他调用都会触发重新渲染。

与通常的“setState 不更新 View ”问题有点不同,因为 setState() 正在更新我的 View 并使用正确的值。只是不是在我期望的时候。基本上,我触发 setState() 事件应该使用新的 props 重新渲染我的子组件,我相信这应该触发子组件的 componentWillReceiveProps 生命周期事件,然后该事件将在子组件中调用 setState() 并更新其看法。问题是,虽然它确实更新了 View ,但它似乎比预期晚了一个周期。在我的 MVP 中,我在 2 秒时调用 setState(),但它在 4 秒时更新 View 。但我无法确定哪一部分是错误的逻辑。

这是我的 jsFiddle MVP 。感谢您的任何建议。

代码:

class TaskBody extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
componentWillReceiveProps() {
this.setState({
activeTask: this.props.activeTask
});
}
render() {
return <div>
< h4 > {
this.state.activeTask ? this.state.activeTask : 'Task Title'
} < /h4>
< /div > ;
}
}

class Body extends React.Component {
constructor(props) {
super(props);
this.state = {
activeTask: '',
counter: 1
};
this.updateActive = this.updateActive.bind(this);
}
updateActive(task) {
this.setState({
activeTask: task
});
}
componentDidMount(){
var self = this;
setInterval(function(){
if(self.state.counter === 4){
clearInterval(self.clickInterval);
return clearInterval(self.countInterval);
}
self.setState({ counter: self.state.counter + 1 });
}, 1000);
// imagine this was the click event, it should rerender the view
// instantaneously at 2 seconds because I called setState() right?
// which is supposed to trigger a re-render and then TaskBody should
// receive new props triggering it to setState() on its activeTask,
// which should update the view?
self.clickInterval = setInterval(function(){
self.setState({ activeTask: 'took double the time it should' });
}, 2000);
}
render() {
return <div>
< TaskBody activeTask = {
this.state.activeTask
}/>
<div>{this.state.counter}</div>
</div>;
}
}

ReactDOM.render(<Body />, document.querySelector('#body'));

最佳答案

self.setState({ activeTask: 'took double the time it should' });

从未真正被调用过。

原因如下:

您的逻辑位于 componentDidMount 生命周期方法内。如果您阅读the documentation of componentDidMount ,你会看到它清楚地表明:

Invoked once, only on the client (not on the server), immediately after the initial rendering occurs.

因此,当您的应用中调用 componentDidMount 时,您首先要检查计数器并在那里调用 setState。仅此一点就会触发新的渲染。这意味着 componentDidMount 中的第二个代码块将不起作用,因为当您设置该方法时,它永远不会在任何地方被调用。

关于javascript - 从 setState() 更新 View 不​​会按预期触发重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34698066/

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