代码之家  ›  专栏  ›  技术社区  ›  bvdb

当更改一个特定的状态设置时,是否需要重述所有其他状态设置?

  •  1
  • bvdb  · 技术社区  · 7 年前

    constructor(props) {
      super(props);
    
      this.state = {
        setting_a: "value-1",
        setting_b: "color-green"
      }
    }
    

    setting_a ),我不需要其他设置(例如。 setting_b ...state ).

    this.setState( {...this.state, setting_a: "value-2"});
    

    自从引入 Component#getDerivedStateFromProps

    static getDerivedStateFromProps(props, state) {
      const oldSetting = state.setting_a;
      const newSetting = props.setting_a;
    
      if (oldSetting !== newSetting) {
        // this is a very similar situation.
        return ({ ...state, state.setting_a: props.setting_a});
      }
      return null;
    }
    

    同样,在上面的示例中,我添加了所有以前的设置(即。 …状态

    在这两种情况下,相同的问题是: 我是否需要特别重复已经在状态中的值?或者状态总是增量合并,而不删除?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Bhojendra Rauniyar    7 年前

    使用setState更新状态时,不需要复制状态(使用spread操作符或任何想法)。这个 setState 方法仅更新所需的状态:

    this.setState( {setting_a: "value-2"});
    

    所以,现在你仍然会得到:

    state = {
        setting_a: "value-2",
        setting_b: "color-green"
      }
    

    类似地,当您返回 getDerivedStateFromProps . 返回值应用于没有变异的状态。


    // initial state
    this.state = {
      settings: {
        a: 'value-1',
        b: 'color-green'
      }
    }
    

    现在,我们有 a b settings 州。现在,如果你想更新 ,则需要复制 设置

    this.setState((state) => ({settings: {...state.settings, a: 'value-2' } }))
    

    前面的例子是设置对象。你可以用类似的状态数组来思考。你可以在谷歌上搜索

        2
  •  0
  •   deorst    7 年前

    视情况而定。 在第一种情况下,您可以:

    this.setState( prevState => {  
        prevState.setting_a = "value-2";  
        return prevState
    });
    

    this.setState({ setting_a: "value-2" });
    

    根据 React Docs