当前位置: 首页 > 知识库问答 >
问题:

无法在React中的现有状态转换错误期间更新

郭翰墨
2023-03-14

在我的渲染返回()我有这些:

<button onClick={ this.selectTimeframe('Today') }
        className={ this.setActiveIf('Today') } type="button">Today</button>

这个功能是什么:

selectTimeframe(timeframe) {
    // this.setState({ timeframe });
}

^我现在必须注释掉setState,否则我会得到上面发布的错误,应用程序会崩溃。

我的构造器中有:

这个。选择timeframe=this。选择时间表。捆绑(这个)

我在这里找到了这个答案,但它没有意义,我该如何传递变量?还是说每个独特的按钮都需要独特的功能?为了避免在渲染内部调用它?

import React from 'react';

export class TimeframeFilter extends React.Component {

    constructor(props) {
        super(props);

        this.state = {
            timeframe: 'Today'
        };

        this.selectTimeframe = this.selectTimeframe.bind(this);
        this.setActiveIf = this.setActiveIf.bind(this);
    }

    componentDidMount() {
        console.log('%c TimeframeFilter componentDidMount', 'background: #393939; color: #bada55', this.state);
    }

    selectTimeframe(timeframe) {
        // this.setState({ timeframe });
    }

    setActiveIf(timeframe) {
        return this.state.timeframe === timeframe ? 'btn btn-default active' : 'btn btn-default';
    }

    render() {
        return (
            <div className="fl">
                <span className="label label-default mr10">Timeframe</span>
                <div className="btn-group btn-group-sm mr20" role="group">
                    <button onClick={ this.selectTimeframe('Today') }
                            className={ this.setActiveIf('Today') } type="button">Today</button>
                    <button onClick={ this.selectTimeframe('Week') }
                            className={ this.setActiveIf('Week') } type="button">Week</button>
                    <button onClick={ this.selectTimeframe('Month') }
                            className={ this.setActiveIf('Month') } type="button">Month</button>
                    <button onClick={ this.selectTimeframe('Year') }
                            className={ this.setActiveIf('Year') } type="button">Year</button>
                    <button onClick={ this.selectTimeframe('All') }
                            className={ this.setActiveIf('All') } type="button">All</button>
                </div>
            </div>
        );
    }
}

export default TimeframeFilter;

共有2个答案

翁建弼
2023-03-14

当前您调用此。在渲染方法中选择TimeFrame('Today')。你可能想

点击={()=

还是更聪明一点

<button onClick={ this.selectTimeframe.bind(this, 'Today') } className={ this.setActiveIf('Today') } type="button">Today</button>

selectTimeframe.bind(key) {
  switch(key){
    case 'Today':
      //your logic
      break;
  }
}

寿意远
2023-03-14

您应该使用箭头函数或bind方法将值传递给onClick函数,否则每次重新加载时,它只是执行以将值返回到onClick,如果您在其中使用setState,它将调用一个rerender和要再次调用的函数,从而重复该过程。

喜欢吗

<button onClick={ ()=> this.selectTimeframe('Today') }
        className={ this.setActiveIf('Today') } type="button">Today</button>

<button onClick={ this.selectTimeframe.bind(this, 'Today') }
        className={ this.setActiveIf('Today') } type="button">Today</button>

希望我能给你解释清楚。:)

编辑:虽然上述方法解决了问题,但由于性能原因,这不是最佳方法。我们应该避免在渲染中绑定方法,因为在重新渲染过程中,它会创建新的方法,而不是使用旧的方法,这将影响性能。

有关如何避免在渲染方法内部绑定,请参见此答案

 类似资料:
  • 问题内容: 我正在尝试执行本ReactJS教程的第15步:对只了解足够的jQuery的人们的React.js简介 作者建议以下内容: 我尝试执行以下操作(对我来说似乎不错): 而且我在Chrome开发者工具的控制台中收到以下错误: 在现有状态转换期间(例如在内部或另一个组件的构造函数中)无法更新。渲染方法应该纯粹是道具和状态的函数;构造函数的副作用是反模式,但可以移至。 这是一个JSbin演示。为

  • 当我试图插入一个新的食谱元素时,我的项目总是崩溃。我使用在能够根据需要更新食谱(例如删除,编辑等)。 如果我将语句切换到,我可以插入元素而没有问题,但是由于删除,我无法删除触发状态更改,并需要状态更改来反映更新而不是道具。有人对这个问题有什么建议吗?谢谢! 配方列表: 配方容器: 配方表:

  • 无法在现有状态转换期间更新(例如在“呈现”中)。呈现方法应该是道具和状态的纯函数。 我如何修复这种情况,使它将加载项目,并单击链接将重新呈现表单?

  • 我已经创建了以下代码,但是我经常得到以下错误(很多)。看起来应用程序进入了一个循环: 下面是我使用的代码:

  • 将此添加到函数组件并报告错误:警告:无法在现有状态转换期间更新(例如在内)。渲染方法应该是道具和状态的纯粹功能。

  • 我正在开发一个简单的待办事项列表反应应用程序(新的React.js)。我已经将项目添加到工作列表中,但删除项目会引起一个问题。在我的父反应组件中,我有以下代码: 我的组件: 运行此代码将带来: 警告:setState(...):无法在现有状态转换期间更新 问题: 为什么的渲染在添加项时立即执行回调,即: 但是,添加以删除Callback ie。