ES6 - 警告:setState(…):无法在现有状态转换期间更新

2023-12-26

我正在重写一些旧的 ReactJS 代码,并在修复此错误时陷入困境(该错误在控制台中重复了大约 1700 次,DOM 根本不渲染):

警告:setState(...):无法在现有状态期间更新 过渡(例如在render或其他组件的 构造函数)。渲染方法应该是 props 的纯函数 状态;构造函数副作用是一种反模式,但可以移动 到componentWillMount.

我是一个将其状态传递给应该呈现一些控件的组件的组件。根据单击的控件,状态应该发生变化,并且应该呈现新的控件。

这是我的容器组件:

class TeaTimer extends Component {
    constructor(props) {
        super(props);
        this.state = {
            count: 120,
            countdownStatus: 'started'
        }
    }

    componentDidUpdate(prevProps, prevState) {
        if (this.state.countdownStatus !== prevState.countdownStatus) {
            switch (this.state.countdownStatus) {
                case 'started':
                    this.startTimer();
                    break;
                case 'stopped':
                    this.setState({count:0});
            }
        }
    }

    componentWillUnmount() {
        clearInterval(this.timer);
        delete this.timer;
    }

    startTimer() {
        this.timer = setInterval(() => {
            let newCount = this.state.count -1;
            this.setState({
                count: newCount >= 0 ? newCount : 0
            });
            if(newCount === 0) {
                this.setState({countdownStatus: 'stopped'});
            }
        }, 1000)
    }

    handleStatusChange(newStatus) {
        this.setState({ countdownStatus: newStatus });
    }

    render() {
        let {count, countdownStatus} = this.state;
        let renderStartStop = () => {
            if (countdownStatus !== 'stopped') {
                return <StartStop countdownStatus={countdownStatus} onStatusChange={this.handleStatusChange()}/>
            } else {
                return <div>This will be the slider form</div>
            }
        };
        return(
            <div className={styles.container}>
                <p>This is the TeaTimer component</p>
                <Clock totalSeconds={count}/>
                {renderStartStop()}
            </div>
        )
    }
}

这是我的控件组件:

class StartStop extends Component {
    constructor(props) {
        super(props);
    }

    onStatusChange(newStatus) {
        return() => {
            this.props.onStatusChange(newStatus);
        }
    }

    render() {
        let {countdownStatus} = this.props;

        let renderStartStopButton = () => {
            if(countdownStatus === 'started') {
                return <button onClick={()=> this.onStatusChange('stopped')}>Reset</button>;
            } else {
                return <button onClick={()=> this.onStatusChange('started')}>Start</button>
            }
        };

        return(
            <div className={styles.tt.Controls}>
                {renderStartStopButton()}
            </div>
        )
    }
}

StartStop.propTypes = {
    countdownStatus: React.PropTypes.string.isRequired,
    onStatusChange: React.PropTypes.func.isRequired
};

我对文字墙感到抱歉,但我真的无法弄清楚错误来自哪里 - 因此不知道我可以省略哪一部分代码。

我尝试实施在看似相关的问题 https://stackoverflow.com/questions/37387351/reactjs-warning-setstate-cannot-update-during-an-existing-state-transiti,但也无法让它工作。


我认为你在这一行有一个错字:

return <StartStop countdownStatus={countdownStatus} onStatusChange={this.handleStatusChange()}/> 

它应该是:

return <StartStop countdownStatus={countdownStatus} onStatusChange={() => this.handleStatusChange}/>

您似乎正在调用该方法handleStatusChange而不是将其作为回调传递。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES6 - 警告:setState(…):无法在现有状态转换期间更新 的相关文章

随机推荐

  • 从 C# 远程调用 unix shell 脚本

    在我当前的项目中 我需要从 C 应用程序调用 Unix shell 脚本 我还需要获取响应 无论脚本是否已成功执行或发生任何错误 C 程序在 Windows 机器上运行 我需要连接到 Unix 机器并执行脚本 谁能告诉我如何使用 C 来完成
  • 如何判断当前线程是否是 UI 线程?

    我正在开发 UWP 的用户控件 它会在某些调用时更新其一些视觉效果 但是 由于核心 NET 库已发生变化并且线程类已被严重削减 我不知道如何从用户控件中的方法识别调用线程是否是 UI 线程 因此它知道是否使用调度程序来更改依赖属性 有人知道
  • 如何从同一 Swift 项目中的任何文件访问自定义函数?

    如果自定义函数的后缀运算符是在文件范围内声明的 如我的上一篇文章 https stackoverflow com questions 40932230 member operator must have at least one argum
  • MySQL Django 模型中的布尔字段?

    在姜戈 MySQL 中的布尔字段存储为 TINYINT http docs djangoproject com en dev ref models fields 当我检索它时 我得到 0 或 1 我不应该得到 False 或 True 吗
  • Python 中的嵌入式 Web 服务器? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 你能推荐一个简约的 Python Web 服务器吗 我可以将其嵌入到我的桌面应用程序中 有多简约以及目
  • 具有常量整数除数的高效浮点除法

    最近question https stackoverflow com questions 35506226 will the compiler optimize division into multiplication 是否允许编译器用浮点
  • Django:连接两个表

    这是我目前拥有的 class Sessions models Model sessionId models AutoField primary key True class Ip models Model ipId models AutoF
  • Prometheus 端点不工作 Spring Boot 2.0.0.RC1 Spring Webflux 已启用

    我按照这里的文档进行操作 https docs spring io spring boot docs 2 0 0 RC1 reference htmlsingle product ready endpoints enabling endpo
  • 包和 R 路径及安装错误

    我在尝试将软件包从根目录移动到用户帐户时弄乱了 R 安装 我尝试通过 apt get install 卸载 使用 purge 并重新安装 R r base r base dev 但我得到了错误 usr bin R line 236 usr
  • MVC SessionStateAttribute 不能用作全局属性

    如何在 MVC3 中将 SessionStateAttribute 设置为全局过滤器 在我的 Global asax 中 我在 RegisterGlobalFilters 方法中有这个 filters Add new SessionStat
  • 分层布局:未按照同一级别中的插入顺序创建节点

    我已经为每个节点分配了级别 现在 在每个级别上 我希望节点以其插入顺序出现 甚至文档也是这么说的 我见过很多发生这种情况的例子 与我的情况唯一的区别是 X 轴上也有边缘 这是一个片段 function main var graph node
  • 是否可以通过 Flash Builder 中的 file:// 调试ExternalInterface?

    我有一个使用 Adob e Flash Builder 4 5 用 ActionScript 3 编写的项目 它在一个中注册了几个函数ExternalInterface 以便可以从 JavaScript 调用它们 例如 如果我访问服务器上的
  • 从同一解决方案中的项目引用 Nuget 包所需的解决方案

    我有一个包含项目的解决方案 这些项目将作为通用 nuget 包在我的组织之间共享 该解决方案包含在一个 git 存储库中 并且我们有 TeamCity 为我们运行构建 尽管我们并不太先进 因为当我们准备好为给定项目生成 发布新的 Nuget
  • 从容器内的 docker-compose 命令运行 shell 脚本

    我正在尝试通过在 docker 容器内使用 docker compose 来运行 shell 脚本 我正在使用 Dockerfile 构建容器环境并安装所有依赖项 然后 我将所有项目文件复制到容器中 据我所知 这很有效 我对 docker
  • 如何在 Java 中清除控制台 - Eclipse

    如何在 Eclipse 中执行 打印一些语句后清除控制台 我已经使用了flush 但没有工作 只是发布示例代码 System out println execute System out println these set of lines
  • 使用“全局命名空间”;

    我只是想知道是否有一种方法可以使用 use 关键字使类的行为就像在全局命名空间中一样 因此该类只能从类的外部表现为命名空间类 就像是 namespace wherever somewhere deep deep inside use roo
  • Ruby on Rails 的弹出窗口

    我有用于 Popup 的 javascript 作为 POPUP JS 在我看来我想使用弹出窗口 它显示为 HTML a href exam groups 1 answers answer class submit button a
  • chrome 请求长时间未决

    在 Chrome 上测试我的网络应用程序时 我注意到一个请求需要很长时间才能加载 有时需要 20 秒 根据heroku日志 at info method GET path 1 message feeds competition id xxx
  • 将哈希值传递给 Powershell 函数问题

    我肯定错过了什么 我必须变量 var1 和 var2 var1 gm TypeName System Collections Hashtable 每个都有 IP 和 Port 属性 例如 var1 0 ip 1 1 1 1 var1 0 p
  • ES6 - 警告:setState(…):无法在现有状态转换期间更新

    我正在重写一些旧的 ReactJS 代码 并在修复此错误时陷入困境 该错误在控制台中重复了大约 1700 次 DOM 根本不渲染 警告 setState 无法在现有状态期间更新 过渡 例如在render或其他组件的 构造函数 渲染方法应该是