Vue 组件无故更新(重新渲染)
Vue component updated (rerendered) without reason
我有一个组件在更改父数据项时无故更新(重新呈现),即使它与相关组件无关。
这是一个简单的复制 https://codesandbox.io/s/gracious-cannon-s6jgp?file=/public/index.html 如果任何人都可以阐明这一点。 (单击按钮将触发组件中的更新事件)
如果我删除其 class 被 vue 更改的元素(或删除动态 class),它会按预期工作。
因为在每次渲染时,您都会为 something
属性:
定义新对象
<hello-world :something="[{prop: 'vvv'},{prop: 'rrr'}]"></hello-world>
- 通过单击该按钮,您可以更新全局数据。重新呈现根元素。
- 在渲染期间,将创建一个包含新对象的新数组,并在您的组件中分配给
something
属性。虽然在每次渲染时创建的对象是相等的,但它们是不同的(即它们映射到不同的内存点)
- 您的组件发现 属性
something
更改了它的引用,因此重新呈现。
如果您在数据中创建 items
属性 并将该引用作为 prop 传递,则不会再次重新渲染该组件:
main.js:
data: {
active: false,
items: [{ prop: "vvv" }, { prop: "rrr" }]
},
index.html:
<hello-world :something="items"></hello-world>
请注意,出现此行为是因为您传递的是 array
8,它与 object
相同。对于原始类型(例如 string、int、boolean、float)的常量变量不会发生这种情况,例如 :something="'string'"
我有一个组件在更改父数据项时无故更新(重新呈现),即使它与相关组件无关。
这是一个简单的复制 https://codesandbox.io/s/gracious-cannon-s6jgp?file=/public/index.html 如果任何人都可以阐明这一点。 (单击按钮将触发组件中的更新事件)
如果我删除其 class 被 vue 更改的元素(或删除动态 class),它会按预期工作。
因为在每次渲染时,您都会为 something
属性:
<hello-world :something="[{prop: 'vvv'},{prop: 'rrr'}]"></hello-world>
- 通过单击该按钮,您可以更新全局数据。重新呈现根元素。
- 在渲染期间,将创建一个包含新对象的新数组,并在您的组件中分配给
something
属性。虽然在每次渲染时创建的对象是相等的,但它们是不同的(即它们映射到不同的内存点) - 您的组件发现 属性
something
更改了它的引用,因此重新呈现。
如果您在数据中创建 items
属性 并将该引用作为 prop 传递,则不会再次重新渲染该组件:
main.js:
data: {
active: false,
items: [{ prop: "vvv" }, { prop: "rrr" }]
},
index.html:
<hello-world :something="items"></hello-world>
请注意,出现此行为是因为您传递的是 array
8,它与 object
相同。对于原始类型(例如 string、int、boolean、float)的常量变量不会发生这种情况,例如 :something="'string'"