【问题标题】: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 绑定!

标签: vue.js


【解决方案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 验证比不正确的验证要好。

          【讨论】:

            猜你喜欢
            • 2021-10-13
            • 2021-03-26
            • 2020-09-25
            • 2019-06-11
            • 2021-06-22
            • 2020-10-09
            • 1970-01-01
            • 2021-07-28
            • 2018-10-24
            相关资源
            最近更新 更多