【问题标题】:React component's state has different values in render from values in setStateReact 组件的状态在渲染中的值与 setState 中的值不同
【发布时间】:2019-01-05 06:24:25
【问题描述】:

我在组件的按钮单击和该组件的渲染之间发生了一个奇怪的问题。在按钮单击的处理程序中,我设置了组件的状态。对于其中一个状态值,我将一个空对象压入数组并增加另一个状态值。在渲染时,我添加空对象的状态值变成一个整数。

我在函数 componentWillUpdatecomponentDidUpdate 中添加了在到达这些函数之前查看状态是否已经改变,并且确实如此。

class ItemGrouping extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            items: this.props.items,
            count: this.props.count,
            groupingName: this.props.groupingName
        };
        this.addItem = this.addItem.bind(this);
    }

    addItem(event) {
        event.preventDefault();
        this.setState((previousState, previousProps) => {
            return {
                count: previousState.count + 1,
                items: previousState.items.push({}),
                groupingName: previousState.groupingName
            };
        });
    }

    render() {
        let count = this.state.count;
        let items = this.state.items.map((item, index) => {
             let currentIndex = count;
             count += 1;
             return (
                 <EditableItem key={count} item={item} count={currentIndex} />
             );
        });

        return (
            <section className="card">
                {this.state.groupingName != '' &&
                    <h3 className="card-header">{this.state.groupingName}</h3>
                }
                <div className="card-body">
                     <div className="row item-grouping" data-grouping={this.state.groupingName}>
                        <div className="col-12">
                            {items}
                        </div>
                    </div>
                </div>
                <div className="card-footer">
                    <div className="d-flex justify-content-center">
                        <button className="btn btn-success" onClick={this.addItem} type="button"><i className="dripicons-plus"></i> Add an Item</button>
                     </div>
                </div>
            </section>
        );
    }
}

初始渲染:

 state.count: 1,
 state.items: [{id: '', value: ''}]

addItem 后的预期结果:

state.count: 2,
state.items: [{id: '', value: ''}, {}]

addItem 后的实际结果:

state.count: 2,
state.items: 3

子组件会导致状态改变吗?页面上没有会触发该组件状态更改的父组件,所以我有点迷茫。

【问题讨论】:

标签: javascript reactjs


【解决方案1】:

问题似乎是这样的:items: previousState.items.push({})push 方法返回数组的长度而不是结果数组。

除了push,你可以使用类似这样的东西:items: [...previousState.items, {}],或items: previousState.items.concat({})

【讨论】:

  • 非常感谢泰特斯。看来我需要复习一下 MDN 文档。
猜你喜欢
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 2019-04-11
  • 2021-04-28
  • 2022-11-02
  • 2020-04-07
  • 2018-10-15
相关资源
最近更新 更多