Reactjs 如何更改渲染中的状态?

Reactjs 如何更改渲染中的状态?,reactjs,Reactjs,我得到了一个段落数组,每个段落都有一个章节号。我把章节号保持在状态 我的起始值是1。因为我想让他们从第一章开始读 当某些段落没有任何章节时,问题就开始了。当这种情况发生时,我想展示一切 因此,我在render中检查“chapters”数组是否为空,如果为空,我希望更改章节号为0的状态(然后设置为如果为0,则显示所有内容) 我收到一条错误信息- 无法在现有状态转换期间更新(例如在渲染中)。渲染方法应该是道具和状态的纯函数 我阅读并发现,在render中更改此选项是不值得的。但我看不到另一个地方可以

我得到了一个段落数组,每个段落都有一个章节号。我把章节号保持在状态

我的起始值是1。因为我想让他们从第一章开始读

当某些段落没有任何章节时,问题就开始了。当这种情况发生时,我想展示一切

因此,我在render中检查“chapters”数组是否为空,如果为空,我希望更改章节号为0的状态(然后设置为如果为0,则显示所有内容)

我收到一条错误信息-

无法在现有状态转换期间更新(例如在
渲染中)。渲染方法应该是道具和状态的纯函数

我阅读并发现,在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();
            }
        }
    }
}