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 上不起作用,因为插槽是抽象的出口并且可能扩展到多个元素。请改用包装元素上的键。 你能回答吗...我会投票给它...我可以在 包装器上添加 :key 绑定! 【参考方案1】:

这个问题得到了很好的回答,但我想添加一个示例和文档链接:

这种结构导致上述错误:

<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' 指令的主要内容,如果未能解决你的问题,请参考以下文章

Python中的迭代器

Python中的“迭代”详解

python中的迭代器有啥用

搞懂python中的可迭代对象和迭代器对象(即迭代器)

Java中的迭代器模式

python中的迭代器