vue.js - vuejs v-for 有无子组件的执行差异
问题描述
考虑您有一个要迭代的对象列表,其中每个对象都包含一个名为 的数组f
。此外,您还有一个 log 函数,它从参数打印字符串并返回 true。在这里您可以看到相应的模板部分:
<template>
<div>
<div v-for="o in objArr" v-if="log('base')">
<div v-for="a in o.f" v-if="log('subbase')">
</div>
</div>
</div>
</template>
以下是使用过的数据示例:
objArr: [
{ a : 1, b : 2, c : 3, d : 4, e : 5, f : [10,9,8]},
{ a : 1, b : 2, c : 3, d : 4, e : 5, f : [10,9,8]},
],
现在我更改其中一个对象中的随机数组元素。我在控制台上执行此操作:(
$vm.objArr[3].f.splice(2,1,4);
这将更改第 4 个对象,并在该对象中将第 3 个数组元素替换为 4)。
由于 vue 的反应能力,它会检测到变化并重新渲染必要的组件。想象一下 objArr 有 2 个元素,而我们正在更改的对象数组有 3 个元素。输出将是:
base
subbase
subbase
subbase
base
subbase
subbase
subbase
现在我想使用组件作为包装器。我将上面更改为:
<div>
<div >
<performance-test v-for="o in objArr" v-if="log('base')" :mydata="o">
</performance-test>
</div>
</div>
在我们得到的性能测试组件内部:
<div>
<div v-for="a in mydata.f" v-if="log('basesub')">
</div>
</div>
我们在 for 循环中仍然有一个 for 循环,我使用与上面相同的方法来更改base
components 数组,但是 vue 这次决定更新不同的。输出是:
subbase
subbase
subbase
我现在拿不定主意。如果我不想在我的子组件中有任何数据(和逻辑)。即使单个对象中只有一个数组发生更改,我如何防止 vue 遍及整个对象?
希望你能帮忙。
解决方案
似乎问题是您没有在 a:key
中使用performance-test
(自定义组件)时声明 a v-for
。尝试:
<performance-test v-for="o in objArr" v-if="log('base')" :mydata="o" :key="o.a">
</performance-test>
注意:o.a
每个 ! 必须是唯一的o
!
推荐阅读
- amazon-web-services - AWS EventBridge putEvents 不接受详细 JSON 数组
- javascript - 自定义选择下拉列表中的 onchange 不起作用
- firebase - 使用 Firebase 托管,我可以将所有路由设置为具有相同的目的地,同时还具有 api 路由吗?
- react-native - 无法在 Expo for Firebase Analytics 上运行 setDebugModeEnabled
- c - Codelite Clang 错误:没有这样的文件或目录 @./build-Debug
- angular - Angular 10:有条件地渲染 fontAwesome 图标
- python - 库存物品的网页抓取
- python - 在python中使用正则表达式拆分多个单词的字符串
- javascript - 错误:“无法读取未定义的属性“div””
- java - Spring Boot 导入额外的无扩展属性