Javascript 如果状态是不可变的,那么整个状态是否在任何更改中被替换?

Javascript 如果状态是不可变的,那么整个状态是否在任何更改中被替换?,javascript,reactjs,redux,Javascript,Reactjs,Redux,如果状态是不可变的,那么在任何更改中不需要替换整个状态吗?否则,你就是在改变状态。顶级键是否作为独立的不可变对象持有 根据定义,难道不需要任何改变来取代整个东西吗?Redux如何处理这个问题?替换完整状态不会破坏PureComponents吗 感谢您的澄清。让我们一步一步地将其分解: 有一个初始redux存储{color:'red'} 用户单击一个按钮 一个动作被生成,比如说改变颜色 Redux使用存储(从步骤1开始)和操作调用reducer。还原程序返回一个新的存储,比如{color:'blu

如果
状态
是不可变的,那么在任何更改中不需要替换整个状态吗?否则,你就是在改变状态。顶级键是否作为独立的不可变对象持有

根据定义,难道不需要任何改变来取代整个东西吗?Redux如何处理这个问题?替换完整状态不会破坏PureComponents吗


感谢您的澄清。

让我们一步一步地将其分解:

  • 有一个初始redux存储{color:'red'}
  • 用户单击一个按钮
  • 一个动作被生成,比如说改变颜色
  • Redux使用存储(从步骤1开始)和操作调用reducer。还原程序返回一个新的存储,比如{color:'blue'}
  • 然后,假设您有一个
    类Square扩展了PureComponent
    mapStateToProps
    作为
    (store)=>{color:store.color}

    现在发生的是,当存储更改时,
    redux react
    每次都运行MapStateTrops。然后生成新的道具。这些道具被派去反应

    如果到目前为止你和我在一起;redux和react如何协同工作的关键在于,每当redux存储发生更改时,每个MapStateTops都会运行,这会为react组件生成新的道具

    从这一点上说,这是标准的反应。当React组件的道具更改时,它运行
    componentWillReceiveProps
    ,然后运行
    shouldComponentUpdate

    对于一个
    PureComponent
    ,基本上这意味着shouldComponentUpdate只需对你的新道具做一个简单的平等性检查,然后就开始了


    好的,有了这个基本的理解,嵌套对象的行为类似

    如果我们有一个这样的商店,那会怎么样

    {
      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
    是一个不同的对象,但是
    store
    newStore
    都指向相同的
    bigData
    键和其他不变的值。不变性部分允许这种事情发生

    之后,步骤基本相同。每次商店更改后,
    mapstatetops
    运行并生成一个新的道具对象。Redux react然后将新的prop对象传递给react,在这种情况下,如果prop值具有相同的标识(
    ==
    ),则不会呈现
    PureComponent

    请注意,redux react有一些性能优化,可以避免使用新的道具调用react,但出于讨论的目的,我省略了这一步

    希望这有助于澄清你的问题

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


    您的问题的关键在于,因为您的存储是不可变的,所以您可以在不同的存储中重复使用相同的内部对象,甚至可以通过MapStateTrops将这些对象传递到react组件中。

    Redux从不说状态是不可变的。它说,构成应用程序的存储或状态的约简应该是不可变的,并且应该是纯函数。
    是的,顶级键单独被认为是不可变的。

    因此,在任何更改或Redux术语中,任何操作完成后,我们都会在导致状态更改的每个操作上触发一个reducer。

    好的,状态被替换,因为它是不可变的,但只有reducer的状态片。减速机不重新创建整个商店,只是当计算下一个状态时它是自己的切片。如果这是有用的,考虑一下回答的答案并标记它正确:- YeahI试图投票,但不能,因为我的帐户是新的,很抱歉。在redux中,如果您的操作/还原程序更新了
    foo.bar
    ,并且您连接的组件
    mapStateToProps
    (store)=>{foo:store.foo}
    ,然后将
    foo={foo}
    传递给PureComponent子组件,那么还有一个后续问题。当
    foo.bar
    更改时,孩子不会重新启动,对吗?这就是为什么他们建议尽量保持平面?再次感谢你