我是对的,从对象破坏对象不会创建新对象

时间:2019-07-26 22:45:57

标签: javascript reactjs

销毁对象形式的对象不会创建新对象,因此,如果您使用销毁对象新创建的对象替换要销毁的对象的属性,则React不会重新呈现

里面有一些重击:

const {
      stock: { bag },
} = getState();

更改'bag'的属性并将该对象在reducer中分配给他被销毁的位置(股票属性)不会使rereender重新反应,但是会创建新属性或显式创建新对象并将该对象分配给以下位置他被摧毁将迫使人们作出反应,重新投降

2 个答案:

答案 0 :(得分:1)

您是正确的,破坏对象不会触发重新渲染。

如果此代码在thunk中,则需要分派动作才能触发重新渲染。

如果此代码位于组件中,则需要调用setState(或调度操作)以触发重新渲染。

答案 1 :(得分:0)

只是深入研究可能发生的情况,通过解构分配变量的结果取决于变量的类型。如果它是引用类型(在JS中,大多数情况下为Object),则其属性的任何突变(重新分配)都将导致原始对象的更改:

> const o = { x: { y: { z: 2 } } }
> let { y } = o.x // <- y is a reference to o.x.y and is an object
> y.z = 5
> o
{ x: { y: { z: 5 } } }

但是如果我们继续尝试更改z

> let { z } = o.x.y; // <- z is a number
> z = 20
> o
{ x: { y: { z: 5 } } }

对于分配到源对象深处的分配同样有效,即,在左侧有很多括号:

> let { x: { y: { z } } } = o
> z = 100
> o
{ x: { y: { z: 5 } } }

鉴于此,您的情况下bag可能是引用类型的值(您还提到过更改其属性)。 React执行引用相等检查,对对象的旧引用与新对象相等,这意味着状态没有改变,这说明了为什么不重新呈现组件的原因。