Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我说的从object中销毁object不';不要创建新对象_Javascript_Reactjs - Fatal编程技术网

Javascript 我说的从object中销毁object不';不要创建新对象

Javascript 我说的从object中销毁object不';不要创建新对象,javascript,reactjs,Javascript,Reactjs,销毁对象表单对象不会创建新对象,所以如果您用新创建的通过销毁对象替换我们从中销毁的对象的属性,React将不会重新渲染 在一些砰砰声中: const { stock: { bag }, } = getState(); 更改“bag”的属性并在reducer中将此对象分配到其被销毁的位置(库存属性)不会使react Reender,但创建新属性或显式创建新对象并将此对象分配到其被销毁的位置将强制react Reender您是对的,分解对象不会触发重新渲染 如果此代码在thunk中,则

销毁对象表单对象不会创建新对象,所以如果您用新创建的通过销毁对象替换我们从中销毁的对象的属性,React将不会重新渲染

在一些砰砰声中:

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

更改“bag”的属性并在reducer中将此对象分配到其被销毁的位置(库存属性)不会使react Reender,但创建新属性或显式创建新对象并将此对象分配到其被销毁的位置将强制react Reender

您是对的,分解对象不会触发重新渲染

如果此代码在thunk中,则需要调度一个操作以触发重新加载


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

如果您是正确的,则对对象进行分解不会触发重新渲染器

如果此代码在thunk中,则需要调度一个操作以触发重新加载


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

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

> 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 } } }
同样适用于深入源对象的赋值,即左侧有许多括号:

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

考虑到这一点,在您的例子中,
bag
可能是一个引用类型的值(您还提到了更改它的属性)。React执行引用相等性检查,对对象的旧引用与新引用相等,这意味着状态没有改变,这解释了组件没有重新渲染的原因。

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

> 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 } } }
同样适用于深入源对象的赋值,即左侧有许多括号:

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

考虑到这一点,在您的例子中,
bag
可能是一个引用类型的值(您还提到了更改它的属性)。React执行引用相等性检查,对对象的旧引用与新引用相等,这意味着状态没有更改,这解释了组件没有重新呈现的原因。

抱歉,问题不正确,我从对象A中解构了对象B,并将对象A中的对象替换为从对象A中解构的对象。我使用dispatch来执行此操作,等等。只有当我用新创建的对象({…old,A:'changes')重新分配解构的对象时,它才会重新开始。我不清楚您的意思。你能用一个更完整的代码示例更新你的问题吗,包括发送?我将在接下来的几天在codesandbox上制作一个简单的应用程序来显示这个问题的更多细节对不起,问题不正确,我从对象A中解构了对象B,并将对象A中的对象替换为从对象A中解构的对象。我使用dispatch来执行此操作,等等。只有当我用新创建的对象({…old,A:'changes')重新分配解构的对象时,它才会重新开始。我不清楚您的意思。你能用一个更完整的代码示例更新你的问题吗,包括发送?我将在接下来的几天在codesandbox上制作一个简单的应用程序,以更详细地显示这个问题