前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >9. Vue v-for指令的使用方式以及使用key解决组件问题

9. Vue v-for指令的使用方式以及使用key解决组件问题

作者头像
Devops海洋的渔夫
发布2022-01-17 09:15:46
1.3K0
发布2022-01-17 09:15:46
举报
文章被收录于专栏:Devops专栏Devops专栏

前言

「vue」框架中,如果需要遍历渲染模板数据,那么就需要使用v-for命令,其中还有随之而来的「key」问题,下面来看看如何基本使用、以及问题解决!!

Vue指令之v-forkey属性

  1. 迭代数组
代码语言:javascript
复制
<ul>
  <li v-for="(item, i) in list">索引:{{i}} --- 姓名:{{item.name}} --- 年龄:{{item.age}}</li>
</ul>
  1. 迭代对象中的属性
代码语言:javascript
复制
<!-- 循环遍历对象身上的属性 -->
<div v-for="(val, key, i) in userInfo">{{val}} --- {{key}} --- {{i}}</div>
  1. 迭代数字
代码语言:javascript
复制
<p v-for="i in 10">这是第 {{i}} 个P标签</p>

❝2.2.0+ 的版本里,「当在组件中使用」 v-for 时,key 现在是必须的。 ❞

当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用 “「就地复用」” 策略。如果数据项的顺序被改变,Vue将「不是移动 DOM 元素来匹配数据项的顺序」, 而是「简单复用此处每个元素」,并且确保它在特定索引下显示已被渲染过的每个元素。

为了给 Vue 一个提示,「以便它能跟踪每个节点的身份,从而重用和重新排序现有元素」,你需要为每项提供一个唯一 key 属性。

示例1:迭代数组

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>

    <div id="app">

        <ul>
            <li v-for="(item, i) in list">索引:{{i}} --- 姓名:{{item.name}} --- 年龄:{{item.age}}</li>
        </ul>

    </div>

    <!--  1.导入vue.js库  -->
    <script src="lib/vue.js"></script>

    <script>
        // 2. 创建一个Vue的实例
        var vm = new Vue({
            el: '#app',
            data: {
                list: [
                    { "name":"张一", "age": 31},
                    { "name":"张二", "age": 21},
                    { "name":"张三", "age": 41},
                    { "name":"张四", "age": 51},
                    { "name":"张五", "age": 61},
                ],
            },
            methods:{}
        })
    </script>

</body>
</html>

浏览器显示如下:

示例2:迭代对象中的属性

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>

    <div id="app">

        <!-- 循环遍历对象身上的属性 -->
        <div v-for="(val, key, i) in userInfo">value值:{{val}} --- key值:{{key}} --- 索引:{{i}}</div>

    </div>

    <!--  1.导入vue.js库  -->
    <script src="lib/vue.js"></script>

    <script>
        // 2. 创建一个Vue的实例
        var vm = new Vue({
            el: '#app',
            data: {
                userInfo: {
                    userid: 1,
                    username: "张三",
                    age: 30
                }
            },
            methods:{}
        })
    </script>

</body>
</html>

浏览器显示如下:

示例3:迭代数字

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>

    <div id="app">

        <p v-for="i in 15">这是第 {{i}} 个P标签</p>

    </div>

    <!--  1.导入vue.js库  -->
    <script src="lib/vue.js"></script>

    <script>
        // 2. 创建一个Vue的实例
        var vm = new Vue({
            el: '#app',
            data: {},
            methods:{}
        })
    </script>

</body>
</html>

浏览器显示如下:

v-for中使用key的注意事项

2.2.0+ 的版本里,当在组件中使用 v-for 时,key 现在是必须的,因为没有key来保障循环中的唯一性,那么组件则会被打乱。

下面来看一个例子,明确当不用key的时候会出现什么样的问题。

不用key的问题示例
代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>

    <div id="app">

        <div>
            <label>Id:
                <input type="text" v-model="id">
            </label>

            <label>Name:
                <input type="text" v-model="name">
            </label>

            <input type="button" value="添加" @click="add">
        </div>


        <p v-for="item in list" >
            <input type="checkbox">{{item.id}} --- {{item.name}}
        </p>

    </div>

    <!--  1.导入vue.js库  -->
    <script src="lib/vue.js"></script>

    <script>
        // 2. 创建一个Vue的实例
        var vm = new Vue({
            el: '#app',
            data: {
                id: '',
                name: '',
                list: [
                    { id: 1, name: '李斯' },
                    { id: 2, name: '嬴政' },
                    { id: 3, name: '赵高' },
                    { id: 4, name: '韩非' },
                    { id: 5, name: '荀子' }
                ]
            },
            methods:{
                add(){
                    // 添加新的数据到队列最后
                    this.list.push({ id: this.id, name: this.name })
                }
            }
        })
    </script>

</body>
</html>

浏览器显示如下:

可以从上面的示例中看到,当添加数据到最后的情况下,原来勾选的「5 --- 荀子」并没有影响到顺序。

下面看看,如果将数据插入到前面会怎么样?

使用unshift() 方法,将数据添加到队列的最前面,如下:

那么,再来执行一下上面的示例,如下:

代码语言:javascript
复制
        <p v-for="item in list" >
            <input type="checkbox">{{item.id}} --- {{item.name}}
        </p>

那么这时候就要给上面的组件设置一个「key」,并且绑定一个「string/number」类型的数据来保障循环数据的唯一性。

这样才能保障渲染。

使用v-bind设置key的值,保障渲染的数据顺序

代码语言:javascript
复制
        <!-- 注意:v-for 循环的时候,key 属性只能使用 number获取string -->
        <!-- 注意:key 在使用的时候,必须使用 v-bind 属性绑定的形式,指定 key 的值 -->
        <!-- 在组件中,使用v-for循环的时候,或者在一些特殊情况中,如果 v-for 有问题,必须 在使用 v-for 的同时,指定 唯一的 字符串/数字 类型 :key 值 -->
        <p v-for="item in list" :key="item.id">
            <input type="checkbox">{{item.id}} --- {{item.name}}
        </p>

再次执行一下刚才错误的过程,如下:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海洋的渔夫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Vue指令之v-for和key属性
    • 示例1:迭代数组
      • 示例2:迭代对象中的属性
        • 示例3:迭代数字
          • v-for中使用key的注意事项
            • 不用key的问题示例
          • 使用v-bind设置key的值,保障渲染的数据顺序
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档