vue-language-server :迭代中的元素期望有 'v-bind:key' 指令
Posted
技术标签:
【中文标题】vue-language-server :迭代中的元素期望有 \'v-bind:key\' 指令【英文标题】:vue-language-server : Elements in iteration expect to have 'v-bind:key' directivesvue-language-server :迭代中的元素期望有 'v-bind:key' 指令 【发布时间】:2018-05-16 10:39:01 【问题描述】:Vue.js 2.5 / Visual Studio 代码编辑器
我收到了这个 es-lint 警告,我该如何摆脱它?
<template :slot="slotName" slot-scope="props" v-for="slotName in $scopedSlots?Object.keys($scopedSlots):null">
<slot :name="slotName" :row-data="props.rowData" :row-index="props.rowIndex" :row-field="props.rowField"></slot>
</template>
我尝试添加索引,但没有解决这个问题
<template :slot="slotName" slot-scope="props" v-for="(slotName, index) in $scopedSlots?Object.keys($scopedSlots):null" :key="index">
<slot :name="slotName" :row-data="props.rowData" :row-index="props.rowIndex" :row-field="props.rowField"></slot>
</template>
【问题讨论】:
可能将key
放在slot
元素上而不是template
元素上?
@Roy,感谢您的反馈...我试过了,es-lint 警告消失了,但是 git 出现编译错误:-key
在 这个问题得到了很好的回答,但我想添加一个示例和文档链接:
这种结构导致上述错误:
<div v-for="(item, index) in items">
index. item.name
</div>
您可以通过更改如下语法来修复它:
<div v-for="(item, index) in items" :key="item.id">
index. item.name
</div>
如果您的商品没有任何唯一的 id 字段,您可以写 :key="item"
。
但是,出于性能原因,您的数据应该有一个 id 字段。
https://vuejs.org/v2/guide/list.html#key
【讨论】:
使用:key="item"
解决了我输出字符串数组的问题。【参考方案2】:
您可以放心地忽略该警告。它来自 vue 的 eslint 插件,这是一个错误,got fixed a month ago 但可能 vetur 仍在使用旧版本的插件。
必须将 key 属性添加到您传递给组件的内容中
【讨论】:
感谢反馈...我可以忽略它,但我也可以在插槽中的包装元素内添加 :key 绑定 是的,你可以 :),如果你知道如何从数据中提取key
会更容易。但是,如果您的组件正在呈现任意数据,您别无选择,只能让组件的用户提供该信息(例如:虚拟滚动条)
谢谢..如果数据中没有键,我可以添加索引并使用它...它也运行良好
不使用索引作为键,这是没有key
时的默认行为
有趣的是,我将我的 eslint-plugin-vue 升级到了 5.0.0-beta.1(修复版),它报告为错误而不是警告。【参考方案3】:
我们来看一个简单的例子!
我正在构建一个待办事项列表应用程序。所以我构建了一个名为Todo
的组件,在我的TodoList
组件中,我将像这样调用Todo
组件
<todo v-for="todo in todos" v-bind:key="todo" v-bind:todo="todo"></todo>
希望对你有帮助!
【讨论】:
【参考方案4】:希望这行得通。
父组件
<template>
<ul>
<VideoListItem v-for="video in videos" v-bind:key="video.title" v-bind:video="video"></VideoListItem>
</ul>
</template>
<script>
import VideoListItem from "./VideoListItem";
export default
name: "VideoList",
components: VideoListItem ,
props: ["videos"]
;
</script>
子组件
<template>
<li> video.snippet.title</li>
</template>
<script>
export default
name: "VideoListItem",
props: ["video"]
;
</script>
<style scoped>
</style>
================================================ =======
Listen => 当你提供 v-for 属性时,我们需要提供 v-key 属性。 它提高了渲染我们的项目列表的性能。
【讨论】:
请添加此代码为提高答案质量所做的说明。【参考方案5】:<li class="list-group-item" v-for="server in Servers" v-bind:key="server">
像这样在标签中指定唯一键。
【讨论】:
【参考方案6】:假设您正在迭代一个名为 users 的数组,那么您可以执行以下操作:
<div v-for="(user,id) in users" :key="id" >
<div class="card" >
...........................
</div>
</div>
【讨论】:
【参考方案7】:这对我有用
<div :class="sliderClass()" v-for="(slide,index) in slides" :key="index">
<div :class="sliderClass()" v-for="slide in slides" :key="slide.SliderID">
【讨论】:
【参考方案8】:这是eslint-plugin-vue
中的the discussion,建议采用以下解决方法:
"vetur.validation.template": false,
对应于这个 UI 选项:
猜测 html 中没有 eslint 验证比不正确的验证要好。
【讨论】:
以上是关于vue-language-server :迭代中的元素期望有 'v-bind:key' 指令的主要内容,如果未能解决你的问题,请参考以下文章