javascript - 为什么一个组件的多个实例共享相同的状态?

标签 javascript reactjs

我正在构建一个待办事项列表,其中一个功能是在单击“已完成”文本时显示已完成任务的列表,并在再次单击时隐藏该列表。但是,我无法执行第一步 - 保存列表的状态(无论是显示还是隐藏)。

有几个这样的“CompletedRow”组件(用于不同类别的任务),虽然单击文本确实成功切换了状态,但似乎所有这些“CompletedRow”组件共享相同的状态 - 它们不是独立的。当我已经为这些组件分配了 key 时,为什么会出现这种情况?如何解决这个问题?

var CompletedRow = React.createClass({    
    getInitialState: function () {
        return {
            show: false
        };
    },
    handleChange: function() {
        this.setState.show = !this.setState.show;
        console.log(this.state.show);
    },
    render: function() {        

        return (<tr>
                <td 
                    className="completed" colSpan="3" onClick={this.handleChange} 
                    > {this.props.count} tasks completed
                </td>
            </tr>);
    }
});

var TaskTable = React.createClass({
    // other code omitted for simplicity
    render: function() {
    var rows = [];
    var completedTasks = 0;

    this.state.taskList.forEach(function(task, index) {

        // do something
         if (completedTasks > 0) {
                rows.push(<CompletedRow 
                    count={completedTasks} 
                    key={getKey()} 
                    taskList={this.state.taskList}                        
                    />);
                completedTasks = 0;
            }

    }.bind(this));

        return (
            <div>            
                <table>
                    <tbody>{rows}</tbody>
                </table>
            </div>
        );
    }
});

最佳答案

这可能是一个拼写错误,但 handleChange 中有一行正在切换附加到 setState 函数的属性。这是所有组件共享的

this.setState.show = !this.setState.show;

该行应该是

this.setState({show: !this.state.show});

此外,下一行的 console.log 将反射(reflect)旧状态,因为 setState 是异步的,允许批量状态更改。

关于javascript - 为什么一个组件的多个实例共享相同的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32669250/

相关文章:

javascript - 仅允许输入数字

javascript - 当代码是字符串时,将 Javascript ES6 重新编译为 ES5 代码

javascript - 如何将动画类添加到 div

reactjs - Material UI useMediaQuery hooks 渲染两次到 React Component,你有什么解决方案吗?

javascript - 尝试以编程方式使用传单 JS 将标记与弹出消息绑定(bind)

javascript - 注册应用程序以访问 UBER API 时,Origin URI 应该是什么

javascript - 在 React 中向高阶组件添加方法

javascript - HTMLElement.blur 方法在 componentWillReceiveProps 中不起作用

javascript - 从 URL 到排序数组的 JSON ReactJS

javascript - 当子组件发生变化时,使用 useEffect 重新渲染组件