javascript react select onChange返回以前的值而不是当前值

pnwntuvh  于 2023-01-24  发布在  Java
关注(0)|答案(1)|浏览(289)

我正在尝试在用户更新Child组件的select元素的值 * 之后 * 更新Parent组件的状态。
虽然我已经让它工作了一些,但我注意到当我在select上触发onChange事件时,它总是返回 previous 值,而不是刚刚选择的值。

class Parent extends Component{
    constructor(props){
        super(props);
        this.state = { data: {
            condition: "any"
        }};
    }

    update = data => {
        this.setState({ data: { 
            ...this.state.data, 
            ...data 
        }});
        
        // This gets called every time I change the value of my select element.
        console.log(this.state.data);
    }

    render(){
        return (
            <Child
                condition={this.state.data.condition} 
                onUpdate={data => this.update(data)} />
        );
    }
}

class Child extends Component{
    updateParent = data => {
        this.props.onUpdate(data);
    }

    render(){
        const options = [
            ["any", "Any Condition"], 
            ["new", "Brand New"], 
            ["used", "Used"]
        ];

        return (
            <select 
                defaultValue={ props.selected } 
                onChange={({ target }) => this.updateParent({ condition: target.value })}>
                    { options.map(([id, name]) => (
                        <option key={id} value={id}>{ name }</option>
                    )}
            </select>
        );
    }
}

在本例中,如果我选择used,控制台将返回any。然后,如果我选择new,控制台将返回used

dwbf0jvd

dwbf0jvd1#

setState操作本质上是异步的,因此,无论何时完成setState操作,都不能保证在setState语句之后就可以获得状态的更新值
来自React单据
React可以将多个setState()调用批量处理为单个更新,以提高性能。
因为this.props和this.state可能会异步更新,所以不应该依赖它们的值来计算下一个状态。
现在,如果您想使用新的state值,您应该将该值(在本例中为data)存储在一个变量中,设置您的state,但要使用该变量在函数内部执行其他操作,如调用API等。
编辑(正如@Grover所指出的):
setState还提供了第二个参数,这是一个回调函数,在更新操作发生后被触发,用户可以在其中获取更新后的状态值,并使用它来执行更新后的值的操作。

this.setState({foo: 'bar'}, () => { 
    // actions
});

但是React文档建议使用componentDidUpdate而不是setState回调,这个答案试图解释原因:What is the advantage of using componentDidUpdate over the setState callback?

相关问题