Javascript 状态更新但不渲染
我是ReactJS新手,尝试管理状态更改失败。初始状态按预期进行渲染,状态成功更改,但元素随后不会渲染。DOM控制台中没有要关闭的错误。我已经确保在组件类的构造函数中设置初始状态,并且我还尝试绑定我在构造函数中使用的方法,因为我已经读到自动绑定不是ES6的一部分。相关部件代码如下所示:Javascript 状态更新但不渲染,javascript,reactjs,Javascript,Reactjs,我是ReactJS新手,尝试管理状态更改失败。初始状态按预期进行渲染,状态成功更改,但元素随后不会渲染。DOM控制台中没有要关闭的错误。我已经确保在组件类的构造函数中设置初始状态,并且我还尝试绑定我在构造函数中使用的方法,因为我已经读到自动绑定不是ES6的一部分。相关部件代码如下所示: class MyComponent extends Component { constructor(props) { super(props); this.stat
class MyComponent extends Component {
constructor(props) {
super(props);
this.state = {
myIDs: Array(6).fill('0')
};
this.getMyIDs = this.getMyIDs.bind(this);
};
componentDidMount() {
var ids = this.getMyIDs();
ids.then((result)=> {
this.setState({ myIDs: result }, () => {
console.log(this.state.myIDs)
});
})
};
componentWillUnmount() {
this.setState({
myIDs: Array(6).fill('0')
});
};
getMyIDs() {
return fetch('/api/endpoint').then((response) =>{
return response.json();
}).then((myIDs) => {
return myIDs.result
})
};
render() {
return (
<Tweet tweetId={this.state.myIDs[0]} />
<Tweet tweetId={this.state.myIDs[1]} />
);
}
}
export default MyComponent
与React docs一样:
componentWillMount()在装入之前被调用。它是
在render()之前调用,因此在中同步调用setState()
此方法不会触发额外的渲染。一般来说,我们
建议改为使用构造函数()
避免在这种方法中引入任何副作用或订阅。
对于这些用例,请改用componentDidMount()
在componentWillMount
在内部调用ajax:componentDidMount
另一件事:你为什么要使用
组件将卸载
对象将被删除,没有理由在那里进行调用。与React docs中一样:
componentWillMount()在装入之前被调用。它是
在render()之前调用,因此在中同步调用setState()
此方法不会触发额外的渲染。一般来说,我们
建议改为使用构造函数()
避免在这种方法中引入任何副作用或订阅。
对于这些用例,请改用componentDidMount()
在componentWillMount
在内部调用ajax:componentDidMount
另一件事:你为什么要使用
组件将卸载
对象将被删除,没有理由在那里进行调用。当前代码中存在的唯一问题是返回多个元素组件实例,而没有将它们包装在
React.Fragment
或包装器div
的数组中。使用最新版本的react,您必须编写
render() {
return (
<React.Fragment>
<Element Id={this.state.myIDs[0]} />
<Element Id={this.state.myIDs[1]} />
</React.Fragment>
);
}
}
render(){
返回(
);
}
}
另外,作为一种实践,您必须在componentDidMount
中进行异步调用,而不是像React文档建议的那样在componentWillMount
中进行异步调用。您可能需要阅读更多详细信息
在元素组件中使用prop
Id
时,您必须记住的另一件事是,componentWillMount
和componentDidMount
生命周期函数仅在初始渲染时调用,而不是在初始渲染之后调用,因此,如果您在Element component中的其中一个函数中使用this.props.Id
,则您将无法看到更新,因为异步请求的结果将只在稍后出现,检查如何解决这种情况当前代码中存在的唯一问题是返回多个元素组件实例,而没有将它们包装在React.Fragment
或包装器div
数组中。使用最新版本的react,您必须编写
render() {
return (
<React.Fragment>
<Element Id={this.state.myIDs[0]} />
<Element Id={this.state.myIDs[1]} />
</React.Fragment>
);
}
}
render(){
返回(
);
}
}
另外,作为一种实践,您必须在componentDidMount
中进行异步调用,而不是像React文档建议的那样在componentWillMount
中进行异步调用。您可能需要阅读更多详细信息
在元素组件中使用prop
Id
时,您必须记住的另一件事是,componentWillMount
和componentDidMount
生命周期函数仅在初始渲染时调用,而不是在初始渲染之后调用,因此,如果您在Element组件中的其中一个函数中使用this.props.Id
,那么您将无法看到更新,因为异步请求的结果只会在稍后出现,请检查如何处理这种情况确保result
是一个数组。什么是console.log(this.state.myIDs)
outputArray.isArray(result)返回true,因此我确信结果是一个数组。当我打印出this.state.myIDs时,它会返回一个包含更新ID列表的列表。这就是我如何确认状态确实发生了更改,只是没有呈现。Element component包含什么?Element component是什么样子的,您是在component中使用此.props.Id还是Element的componentDidMount生命周期钩子确保结果
是一个数组。console.log(this.state.myIDs)包含什么outputArray.isArray(result)返回true,因此我确信结果是一个数组。当我打印出this.state.myIDs时,它会返回一个包含更新ID列表的列表。这就是我如何确认状态确实发生了更改,只是没有呈现。Element component包含什么?Element component是什么样子的,您是在component Willmount中使用这个.props.Id还是在component DidMount中使用Element的生命周期钩子,这对OP用例没有任何影响。这是一种必须遵循的实践,而不是在该方法中同步调用setState()不会触发额外渲染的问题的原因。但是OP正在componentWillMount
中异步调用setState
。我已尝试了componentWillMount和ComponentDidMount,但均未成功。请选择“console.log(this.state)”在您的呈现方法中,让我们查看页面加载的输出这是在呈现函数中记录this.state的控制台输出,我已将唯一ID更改为stars:“(6)[*************************”、“*******************************”、“*******************************”、“*******************************”、“**********************************”、*********************************************************************************************************************************************************************************************************************************************,************************************************************************************************************这对OP用例没有任何影响。这是一种必须遵循的实践,而不是在该方法中同步调用setState()不会触发额外渲染的问题的原因。但是OP正在打电话