vue.js - 在 Vue 中,为什么当 if 和 for 在标签上时会发生键重复?
问题描述
以下代码会报错:key duplication
<option-group
v-if="dataSource[0] && dataSource[0].options"
v-for="item in dataSource"
:key="item.label"
:label="item.label"
>
...
</option-group>
<Option
v-else
v-for="option in dataSource"
:label="option.label"
:value="option.value"
:key="option.value"
></Option>
但是当我用“模板”标签包装代码时,以下代码不会报告错误:
<template v-if="dataSource[0] && dataSource[0].options">
<option-group
v-for="item in dataSource"
:key="item.label"
:label="item.label"
>
...
</option-group>
</template>
<template v-else>
<Option
v-for="option in dataSource"
:label="option.label"
:value="option.value"
:key="option.value"
></Option>
</template>
我想知道为什么?
解决方案
这是因为在您的第一个示例中,option-group
和Option
组件都被渲染,因此相同的键位于两个不同的元素中,一个 inoption-group
和一个 in Option
。
两者都被渲染是因为您同时使用了v-for
和v-if
。不推荐,因为
VueJS 将 v-for 指令优先于 v-if 指令。所以在底层,它循环遍历每个元素,然后检查 v-if 条件。
你可以在这里阅读更多关于它的信息
推荐阅读
- c# - 使用 GSMComm 库获取 USSD 结果
- javascript - 为什么 Javascript ES6 不能调用匿名超函数?
- docker - 如何将配置文件推送到新的 oryd/hydra docker 镜像?
- selenium-webdriver - 如果结果没有按常规显示,我如何按类名查找元素?
- appium-android - 如何滚动/滑动页面的一部分?
- vue.js - Vue CLI 更新 cookie 还是更新存储?
- javascript - 与之前使用 getBoundingClientRect 放置的位置相比,元素的位置不会保持不变
- c# - Azure Web 服务 - 如何限制对公共站点的访问以实现合规性?
- pandas - Pandas 0.25.0:分类上的 groupby
- apache-poi - 如何从 Apache POI XWPFDocument 中获取脚注和段落?