javascript - 使用 React 在 ToDo App 中设置状态警告

标签 javascript reactjs jsx

我正在尝试使用 React 创建一个简单的 ToDo 应用,下面是我的 app.js 文件:

import React from 'react';
import { render } from 'react-dom'
import ToDoList from './toDoList'
import CreateToDos from './createToDos'
import _ from 'lodash'

let toDos = [
    {
        task: 'task 1',
        isCompleted: true
    },
    {
        task: 'task 2',
        isCompleted: false
    }
];

export default class App extends React.Component {
    constructor(props){
        super(props);

        this.state = {
            toDos
        };

        this.toggleTask()
    }

    render(){
        return (
            <div>
                <h1>Todo App</h1>
                <CreateToDos updateToDoList={ this.updateToDoList.bind(this)}/>
                <ToDoList toDos={this.state.toDos}/>
            </div>
        );
    }

    updateToDoList(task) {
        toDos.push({
            task,
            isCompleted: false
        });
        this.setState({
            toDos
        })
    }

    toggleTask() {
        let updatedToDos = _.map(toDos, function(toDo){
            return _.assign(toDo, {
                task: toDo.task,
                isCompleted: toDo.isCompleted ? false : true
            })
        });
        this.setState({  // <<<<<<<<<<<<<<< Throwing Warning
            toDos: updatedToDos
        })  
    }
}

一切都按预期完美运行,除了我在控制台上收到一条警告:

Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op. Please check the code for the component.

我在上面的代码中标记了抛出警告的行。

最佳答案

实际上警告是因为你从你的构造函数中触发了 setState,这里是 nl

constructor(props){
    super(props);

    this.state = {
        toDos
    };

    this.toggleTask() // <- this line will call the setState
}

由于您在构造函数中,您的组件尚未安装。警告解释得很好。

您现在可以选择使用更合适的方法来处理一般状态

例如,您可以设置 getInitialState() 而不是设置 this.state = { toDos }。至于在安装时更新状态,您可以使用 componentDidMount()

关于javascript - 使用 React 在 ToDo App 中设置状态警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41714082/

相关文章:

javascript - 用于在字符串中查找值的正则表达式

javascript - 如果绑定(bind)空/未定义(带过滤器),Angularjs模板默认值

javascript - django复选框通过jquery全选

reactjs - React native Stack navigation 如何在 Stack Action 中使用 'replace'

reactjs - 我如何将两个 Prop 从 jsx 传递到 scss

javascript - 在 React 中获取从函数返回的字符串而不是 html

javascript - 如何将函数存储到存储变量中?

reactjs - 阅读布局时, `useLayoutEffect` 比 `useEffect` 更可取吗?

javascript - React,列表中的每个 child 都应该有一个唯一的 key prop

javascript - 事件监听器似乎无法识别我的类?