道具变更时如何更新状态

时间:2019-02-18 12:16:46

标签: javascript reactjs lifecycle

我有一个组件Parent,它呈现了很大的形式。 父组件具有表示子组件Child1-Child4,用于呈现输入。

更改Parent.props时,应将Child1-Child4的值从props中删除为默认值。 用户必须具有通过父方法更改ChildN值的功能。

我需要诸如componentWillReceiveProps之类的东西, 在仅更改Parent.props时计算新的Parent.state。

我不能使用getDerivedStateFromProps,因为我需要访问旧的道具和新的道具。 getDerivedStateFromProps仅提供对新道具的访问。 我不想使用componentWillReceiveProps。

class Parent extends Component {
state = {
    value: Object.assign({}, this.props.value)
};
handleInputChange(event) {
    this.setState({
        value: event.currentTarget.value
    });
}
render() {
    return (
        <Child
            onChange={this.handleInputChange.bind(this)}
            value={this.state.value}/>

    )
}}class Child extends Component {
render() {
    return (
        <input type="text"
           name="input"
           value={this.props.value}
           onChange={this.props.onChange.bind(this)}
        />

    )
}}

1 个答案:

答案 0 :(得分:0)

有两种选择:

shouldComponentUpdate(nextProps, nextState) {
if (this.props.value.id !== nextProps.value.id) {
    this.setState({
        value: Object.assign({}, nextProps.value)
    });
}
return true;}

减号:如果更改道具,则组件重新渲染两次。 另一种选择:

shouldComponentUpdate(nextProps, nextState) {
if (this.props.value.id !== nextProps.value.id) {
    this.state.value: Object.assign({}, nextProps.value)
}
return true;}
负号:直接突变,但render()已被调用。 我不喜欢这两个选项(以及使用componentDidUpdate),它们看起来并不是最佳实践。