Reactjs 如何更改渲染中的状态?
我得到了一个段落数组,每个段落都有一个章节号。我把章节号保持在状态 我的起始值是1。因为我想让他们从第一章开始读 当某些段落没有任何章节时,问题就开始了。当这种情况发生时,我想展示一切 因此,我在render中检查“chapters”数组是否为空,如果为空,我希望更改章节号为0的状态(然后设置为如果为0,则显示所有内容) 我收到一条错误信息- 无法在现有状态转换期间更新(例如在Reactjs 如何更改渲染中的状态?,reactjs,Reactjs,我得到了一个段落数组,每个段落都有一个章节号。我把章节号保持在状态 我的起始值是1。因为我想让他们从第一章开始读 当某些段落没有任何章节时,问题就开始了。当这种情况发生时,我想展示一切 因此,我在render中检查“chapters”数组是否为空,如果为空,我希望更改章节号为0的状态(然后设置为如果为0,则显示所有内容) 我收到一条错误信息- 无法在现有状态转换期间更新(例如在渲染中)。渲染方法应该是道具和状态的纯函数 我阅读并发现,在render中更改此选项是不值得的。但我看不到另一个地方可以
渲染中)。渲染方法应该是道具和状态的纯函数
我阅读并发现,在render中更改此选项是不值得的。但我看不到另一个地方可以放置它,因为在render中,我从give数据库获取数组
let contents = this.state.loading
? <p><em>loading...</em></p>
: ShiurId.renderForecastsTable(this.state.forecasts, this.state.currentChapter);
const allChapters = [... new Set(this.state.forecasts.filter(num => num.chapter != 0 && num.chapter != null ).map(data => data.chapter))];
if (!this.state.loading) {
if (allChapters.length <= 1) {
if (this.state.currentChapter == 1) {
this.stateChange();
}
}
}
有人对在何处更改状态有什么建议吗?是的,将状态更改直接放在渲染
中可能会导致递归,但您可以将其放在组件安装
中(如果您希望只发生一次)
或者componentdiddupdate
(如果您希望每次出现任何更改状态或道具时都会发生),如下所示:
componentDidMount() {
let contents = this.state.loading
? <p><em>loading...</em></p>
: ShiurId.renderForecastsTable(this.state.forecasts, this.state.currentChapter);
const allChapters = [... new Set(this.state.forecasts.filter(num => num.chapter != 0 && num.chapter != null ).map(data => data.chapter))];
if (!this.state.loading) {
if (allChapters.length <= 1) {
if (this.state.currentChapter == 1) {
this.stateChange();
}
}
}
}
componentDidMount(){
让内容=this.state.loading
加载
:ShiurId.renderForecastsTable(this.state.forecastStable,this.state.currentChapter);
const allChapters=[…新集合(this.state.forecast.filter(num=>num.chapter!=0&&num.chapter!=null).map(data=>data.chapter));
如果(!this.state.loading){
if(allChapters.length)您应该在componentDidUpdate
生命周期方法内部或在useEffect
回调中处理此类逻辑。Render()应该只查看当前数据并显示适当的UI状态,而不进行任何状态更改。
componentDidMount() {
let contents = this.state.loading
? <p><em>loading...</em></p>
: ShiurId.renderForecastsTable(this.state.forecasts, this.state.currentChapter);
const allChapters = [... new Set(this.state.forecasts.filter(num => num.chapter != 0 && num.chapter != null ).map(data => data.chapter))];
if (!this.state.loading) {
if (allChapters.length <= 1) {
if (this.state.currentChapter == 1) {
this.stateChange();
}
}
}
}