Vue基础篇--5列表渲染v-for

时间:2020-01-20 00:19:28   收藏:0   阅读:131

Vue基础篇--5列表渲染v-for

1.用v-for把一个数组对弈为一组元素

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<script src="./vue.js"></script>
<body>
    <ul id="exp1">
        <li v-for="item in items">
            {{item.message}}
        </li>
    </ul>
</body>
<script>
    var vm =new Vue({
        el:"#exp1",
        data:{
            items:[
                {message:"Foo"},
                {message:"Bar"},
            ]
        }
    })
</script>
</html>
<ul id="exp2">
        <li v-for="(item,index) in items">
            {{parentMsg}}-{{item.message}}-{{index}}
        </li>
</ul>
    var vm =new Vue({
        el:"#exp2",
        data:{
            parentMsg:"parent",
            items:[
                {message:"Foo"},
                {message:"Bar"},
                {message:"Der"},
            ]
        }
    })
<div v-for="item of items"></div>

2.一个对象v-for

<ul id="exp1">
    <li v-for="value in object">
        {{value}}
    </li>
</ul>
var vm = new Vue({
    el:"#exp1",
    data:{
        object:{
            firstName:"Xu",
            lastName:"Junkai",
            age:20
        }
    }
})
<ul id="exp1">
        <li v-for="(value,key) in object">
            {{key}}:{{value}}
        </li>
    </ul>
<ul id="exp1">
    <li v-for="(value,key,index) in object">
    {{index}}-{{key}}:{{value}}
    </li>
</ul>

3.key

4.数组更新检测

变异方法

替换数组

var vm =new Vue({
        el:"#exp2",
        data:{
            parentMsg:"parent",
            items:[
                {message:"Foo"},
                {message:"Foo"},
                {message:"Der"},
            ]
        }
    });
    var tm = vm.items.filter(function (item) {
        return item.message.match(/Foo/)
    });

你可能认为这将导致 Vue 丢弃现有 DOM 并重新渲染整个列表。幸运的是,事实并非如此。Vue 为了使得 DOM 元素得到最大范围的重用而实现了一些智能的、启发式的方法,所以用一个含有相同元素的数组去替换原来的数组是非常高效的操作。

注意事项

5.对象更改检测注意事项

<ul id="exp">
    <li v-for="value in userProfile">
        {{value}}
    </li>
</ul>
var vm = new Vue({
    el:"#exp",
    data:{
        userProfile:{
            name:"Anika",
        }
    }
});
Vue.set(vm.userProfile,"age",27)
// 比如在Console输入
vm.$set(vm.userProfile,"addr","beijing")
Object.assign(vm.userProfile,{hobby:'sleep',gender:'male'})
//没有响应变化
vm.userProfile = Object.assign({},vm.userProfile,{hobby:'sleep',gender:'male'})

6.显示过滤、排序结果

<ul id="exp">
    <li v-for="n in evenNumbers">
        {{n}}
    </li>
</ul>
// 筛选 除2 余数 为0
var vm = new Vue({
    el:"#exp",
    data:{
        numbers:[1,2,3,4,5]
    },
    computed:{
        evenNumbers:function () {
            return this.numbers.filter(function(number){
                return number % 2 === 0
            })
        }
    }
})
data: {
  numbers: [ 1, 2, 3, 4, 5 ]
},
methods: {
  even: function (numbers) {
    return numbers.filter(function (number) {
      return number % 2 === 0
    })
  }
}

7.一段取值范围的v-for

<div id="exp">
    <span v-for="n in 10">{{n}}</span>
</div>
new Vue({
    el:"#exp"
})

8.v-for on a <template>

<ul id="exp">
    <template v-for="item in items">
        <li>{{item.msg}}</li>
        <li class="divier" role="presentation"></li>
    </template>
</ul>
new Vue({
    el:"#exp",
    data:{
        items:[
            {msg:"one"},
            {msg:"two"},
            {msg:"three"},
        ]
    }
})

9.v-for with v-if

<ul id="exp">
    <li v-for="todo in todos" v-if="!todo.isComplete">
        {{todo.msg}}
    </li>
</ul>
new Vue({
    el:"#exp",
    data:{
        todos:[
            {isComplete:true,msg:1},
            {isComplete:false,msg:2},
            {isComplete:true,msg:3},
        ]
    }
})
<div id="exp2">
    <ul v-if="todos.length">
        <li v-for="todo in todos">{{todo}}</li>
    </ul>
    <p v-else>No todos left!</p>
</div>
new Vue({
    el:"#exp2",
    data:{
        todos:[1,2,3]
    }
});

10.一个组件的v-for

<my-component
  v-for="(item, index) in items"
  v-bind:item="item"
  v-bind:index="index"
  v-bind:key="item.id"
></my-component>
<div id="todo-list-example">
    <!-- 提交事件不再重载页面 -->
    <form v-on:submit.prevent="addNewTodo">
        <label for="new-todo">Add a todo</label>
        <input type="text" v-model="newTodoText" id="new-todo" placeholder="E.g.">
        <button>Add</button>
    </form>
    <ul>

        <li is="todo-item" v-for="(todo,index) in todos"
            v-bind:key="todo.id"
            v-bind:title="todo.title"
            <!-- 这里定义remove事件 -->
            v-on:remove="todos.splice(index,1)"></li>
    </ul>
</div>
// props 用来接收父组件传递给子组件的数据。
//  子组件通过$emit 触发父组件remove事件。
Vue.component('todo-item',{
    template:`
    <li>
        {{ title }}
        <button v-on:click="$emit('remove')">Remove</button>
    </li>`,
    props:['title']
});
new Vue({
    el:"#todo-list-example",
    data:{
        newTodoText:"",
        todos:[
            { id:1,title:"Do the dishes"},
            { id:2,title:"Take out the trash"},
            { id:3,title:"Now the lawn"},
        ],
        nextTodoId:4
    },
    methods:{
        addNewTodo:function () {
            console.log(this);
            this.todos.push({
                id:this.nextTodoId++,
                title:this.newTodoText
            });
            this.newTodoText = ''
        }
    }
})

参照文献:Vue.js列表渲染

原文:https://www.cnblogs.com/xujunkai/p/12215949.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!