如果状态是不可变的,那么整个状态是否会因任何变化而被取代?

时间:2017-07-06 18:06:18

标签: javascript reactjs redux

如果state是不可变的,那么在任何变化时都需要替换整个州吗?否则,你会改变状态。顶级键是否作为单独的不可变对象保存?

根据定义,任何更改都不需要更换整个东西?这是如何由Redux处理的?不会取代完整的状态中断PureComponents吗?

感谢您的任何澄清。

2 个答案:

答案 0 :(得分:1)

让我们一步一步地分解它:

  1. {color:'red'}
  2. 有一个初始的redux商店
  3. 用户点击按钮
  4. 生成一个动作,比如CHANGE_COLOR
  5. Redux通过商店(步骤1)和操作调用您的reducer。 reducer返回一个新商店,比如{color:'blue'}
  6. 然后,假设您class Square extends PureComponent mapStateToProps(store) => { color: store.color }

    现在发生的是,当商店发生变化时,redux-react每次都会运行mapStateToProps。然后它会生成新的道具。这些道具被送去做出反应。

    如果你和我一起到目前为止TL;还原和反应如何协同工作的DR就是每当redux存储发生变化时,每个mapStateToProp都会运行,这会为你的反应组件生成新的道具。

    从这一点开始,它是标准的React。当React组件的道具发生变化时,它会运行componentWillReceiveProps,然后是shouldComponentUpdate

    对于PureComponent,基本上这意味着shouldComponentUpdate只对你的新道具进行浅层相等检查,并从那里开始。

    好的,通过这种基本理解,嵌套对象的行为类似。

    如果我们有这样的商店,那么取代{color: 'red'}的商店:

    {
      allMyData: {
        color: 'red'
        key1: 'someData',
        key2: 'lotsMoreData',
        bigData: {
         nestedKey: 'EvenMoreNestedData',
        }
    
    }
    

    然后,您的减速器可能看起来像这样:

    const reducer = (store, action) => {
      if (action == CHANGE_COLOR) {
        let newStore = Object.assign({}, store);
        newStore.allMyData = Object.assign({}, newStore.allMyData, { color: 'blue' });
    
      }
    }
    

    请注意,有更好的工具可以执行深度不可变合并。我想在此处展示的一个要点是,虽然newStore是一个不同的对象,但storenewStore都指向 SAME {{1} }键和其他未更改的值。不变性部分允许这种事情发挥作用。

    此后,步骤基本相同。每次更改商店后,bigData都会运行并生成一个新的道具对象。 Redux-react然后将新的prop对象传递给React,在这种情况下,如果prop值具有相同的标识(mapStateToProps

    ,则PureComponent将不会呈现

    请注意,redux-react有一些性能优化,可以避免调用对新道具的反应,但为了讨论的目的,我省略了这一步。

    希望这有助于澄清您的问题。

    TL; DR:每个redux操作都会返回一个新商店。每次生成新商店时,mapStateToProps都会为每个===反应组件生成新的道具。如果react组件是pureComponent,它将不会重新渲染,因为props没有更改。

    您的问题的关键在于,因为您的商店是不可变的,您可以在不同商店中重复使用相同的内部对象,甚至可以通过mapStateToProps将那些传递到您的反应组件中。

答案 1 :(得分:0)

Redux从不说国家是不可改变的。它说构成应用程序的存储或状态的reducer应该是不可变的,并且应该是纯函数 是的,顶级密钥被单独认为是不可变的 因此,在任何更改或Redux术语中,任何操作都会完成,我们会在每个操作上触发一个导致状态更改的缩减器。