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

为了防止模板复用

在vue中,为了提高渲染效率会尽可能复用模板。
例如:

    <div id="app">
        <template>
            <div>
                <label for="" v-if="type==='name'">
                    <span>name:</span><input type="text" name="" id="" placeholder="输入name">
                </label>
                <label for="" v-else>
                    <span>email:</span><input type="text" name="" id="" placeholder="输入email">
                </label>
            </div>
        </template>
        <button @click='change'>change</button>
    </div>

    <script>
        var app = new Vue({
            el: "#app",
            data: {
                type: 'name'
            },
            methods: {
                change() {
                    this.type = this.type === 'name' ? 'mail' : 'name';
                }
            },
            filters: {},
            directives: {},
            components: {},
            watch: {},
            computed: {}
        });
    </script>

得到结果:
输入数据,未点击:

点击后:

通过设置key值来阻止复用

                <label for="" v-if="type==='name'">
                    <span>name:</span><input type="text" name="" id="" placeholder="输入name" key="name">
                </label>
                <label for="" v-else>
                    <span>email:</span><input type="text" name="" id="" placeholder="输入email" key="email">
                </label>

v-for与动态绑定key值

  • v-for循环的时候,key属性只能使用number获取string
  • key在使用的时候,必须使用v-bind属性绑定的形式,指定key的值,绑定的是循环的那个对象。

代码示例:

<div id="app">
        <label for="id">
            <input type="text" v-model="n1">
        </label>
        <label for="name">
            <input type="text" v-model="n2">
        </label>
        <input type="button" value="push" @click="push">
        <input type="button" value="unshift" @click="unshift">
        <p v-for="person in arrObj" :key="person">
            <input type="checkbox">id:{{person.id}}--name:{{person.name}}
        </p>
    <!--前两个input用v-model双向绑定数据n1,n2,对之后两个button绑定click事件处理程序-->
    <!--对p标签使用v-for循环对象数组,获取到的每一个数组的元素都是对象,它们在写入过程都保存在person之中,此时的person对象只保存当前的数组对象-->
    <!--v-bind绑定key特性为当前的person对象,这样做得到的结果是:选中循环得到的某一个多选框,在执行添加的过程中它被选中的状态不会因为顺序的改变而被改变,因为选中的状态与当前对象是绑定的-->
    </div>
var vm = new Vue({
            el: "#app",
            data: {
                n1: 1,
                n2: 1,
                arrObj: [{
                    id: 1,
                    name:'name1'
                }, {
                    id: 2,
                    name: "name2"
                }, {
                    id: 3,
                    name: "name3"
                }, {
                    id: 4,
                    name: "name4"
                }, {
                    id: 5,
                    name: "name5"
                }, {
                    id: 6,
                    name: "name6"
                }]
            },
            methods: {
                unshift() {
                    this.arrObj.unshift({
                        id: this.n1,
                        name: this.n2
                    });
                },
                push() {
                    this.arrObj.push({
                        id: this.n1,
                        name: this.n2
                    });
                }
            }
        });
posted @ 2020-03-15 17:26  Syinho  阅读(816)  评论(0编辑  收藏  举报