Vue.js(五)列表渲染 v-for

v-for="item in items "  //  数组更新检测  //  对象更改检测注意事项  //  显示过滤 / 排序结果  //  一段取值范围的 v-for  //  

v-for

  • 数组:我们用 v-for 指令根据一组数组的选项列表进行渲染。v-for 指令需要使用 item in items 形式的特殊语法,items 是源数据数组并且 item 是数组元素迭代的别名。

    <ul id="example-1">
        <li v-for="item in items">
        {{ item.message }}
        </li>
    </ul>
    
    var example1 = new Vue({
        el: ‘#example-1‘,
        data: {
            items: [
                { message: ‘Foo‘ },
                { message: ‘Bar‘ }
            ]
        }
    })
    
    ==>
    · Foo
    · Bar

    在 v-for 块中,我们拥有对父作用域属性的完全访问权限。v-for 还支持一个可选的第二个参数为当前项的索引

    <ul id="example-2">
        <li v-for="(item, index) in items">
            {{ parentMessage }} - {{ index }} - {{ item.message }}
        </li>
    </ul>
    
    var example2 = new Vue({
        el: ‘#example-2‘,
        data: {
            parentMessage: ‘Parent‘,
            items: [
                { message: ‘Foo‘ },
                { message: ‘Bar‘ }
            ]
        }
    })
    
    你也可以用 of 替代 in 作为分隔符,因为它是最接近 JavaScript 迭代器的语法:
    <div v-for="item of items"></div>
  • 对象:用 v-for 通过一个对象的属性来迭代

    <ul>
        <li v-for="value in object">
            {{ value }}
        </li>
    </ul>
    
    var app = new Vue({
        el:"#app",
        data:{
            object:{
                tit:"标题",
                con:"内容",
                time:"中午"
            }
        }
    })
    
    ==>
    ·标题
    ·内容

    可以提供第二个的参数为键名

    <ul>
        <li v-for="(value,key) in object">
            {{ key }} : {{ value }}
        </li>
    </ul>
    
    ==>
    ·tit : 标题
    ·con : 内容
    ·time : 中午

    第三个参数为索引

    <ul>
        <li v-for="(value,key) in object">
            {{ index }}. : {{ key }} : {{ value }}
        </li>
    </ul>
    
    ==>
    ·0. tit : 标题
    ·1. con : 内容
    ·2. time : 中午

    在遍历对象时,是按 Object.keys() 的结果遍历,但是不能保证它的结果在不同的 JavaScript 引擎下是一致的

  • key

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

    这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出。

    为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性。理想的 key 值是每项都有的且唯一的 id。这个特殊的属性相当于 Vue 1.x 的 track-by ,但它的工作方式类似于一个属性,所以你需要用 v-bind 来绑定动态值 (在这里使用简写):

    <div v-for="item in items" :key="item.id">
        <!-- 内容 -->
    </div>

    建议尽可能在使用 v-for 时提供 key,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。

    因为它是 Vue 识别节点的一个通用机制,key 并不与 v-for 特别关联,key 还具有其他用途,我们将在后面的指南中看到其他用途。

数组更新检测

  • 变异方法:Vue 包含一组观察数组的变异方法,所以它们也将会触发视图更新。这些方法如下:

    * push()
    * pop()
    * shift()
    * unshift()
    * splice()
    * sort()
    * reverse()

    以上例子:app.object.push({ message: ‘Baz‘ })

    将在列表尾部增加 Baz

  • 数组替换:变异方法 (mutation method),顾名思义,会改变被这些方法调用的原始数组。相比之下,也有非变异 (non-mutating method) 方法,例如:filter(), concat() 和 slice() 。这些不会改变原始数组,但总是返回一个新数组。当使用非变异方法时,可以用新数组替换旧数组:

    example1.items = example1.items.filter(function (item) {
        return item.message.match(/Foo/)
    })

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

  • 注意事项

    由于 JavaScript 的限制,Vue 不能检测以下变动的数组:

    1. 当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
    2. 当你修改数组的长度时,例如:vm.items.length = newLength

    举个例子:

    var vm = new Vue({
        data: {
            items: [‘a‘, ‘b‘, ‘c‘]
        }
    })
    vm.items[1] = ‘x‘ // 不是响应性的
    vm.items.length = 2 // 不是响应性的

    为了解决第一类问题,以下两种方式都可以实现和 vm.items[indexOfItem] = newValue 相同的效果,同时也将触发状态更新:

    // Vue.set
    Vue.set(vm.items, indexOfItem, newValue)
    
    // Array.prototype.splice
    vm.items.splice(indexOfItem, 1, newValue)

    你也可以使用 vm.$set 实例方法,该方法是全局方法 Vue.set 的一个别名

    vm.$set(vm.items, indexOfItem, newValue)

    为了解决第二类问题,你可以使用 splice:

    vm.items.splice(newLength)

对象更改检测注意事项

  • 还是由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除:

    var vm = new Vue({
        data: {
            a: 1
        }
    })
    // `vm.a` 现在是响应式的
    
    vm.b = 2
    // `vm.b` 不是响应式的
  • 对于已经创建的实例,Vue 不能动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, key, value) 方法向嵌套对象添加响应式属性。例如,对于:

    var vm = new Vue({
        data: {
            userProfile: {
                name: ‘Anika‘
            }
        }
    })

    你可以添加一个新的 age 属性到嵌套的 userProfile 对象:

    Vue.set(vm.userProfile, ‘age‘, 27)

    你还可以使用 vm.$set 实例方法,它只是全局 Vue.set 的别名:

    vm.$set(vm.userProfile, ‘age‘, 27)

    有时你可能需要为已有对象赋予多个新属性,比如使用 Object.assign() 或 _.extend()。在这种情况下,你应该用两个对象的属性创建一个新的对象。所以,如果你想添加新的响应式属性,不要像这样:

    Object.assign(vm.userProfile, {
        age: 27,
        favoriteColor: ‘Vue Green‘
    })

    你应该这样做:

    vm.userProfile = Object.assign({ }, vm.userProfile, {
        age: 27,
        favoriteColor: ‘Vue Green‘
    })

显示过滤 / 排序结果

  • 有时,我们想要显示一个数组的过滤或排序副本,而不实际改变或重置原始数据。
  • 在这种情况下,可以创建返回过滤或排序数组的计算属性。

    例如:  

    <li v-for="n in evenNumbers">{{ n }}</li>
    
    data: {
        numbers: [ 1, 2, 3, 4, 5 ]
    },
    computed: {
        evenNumbers: function () {
            return this.numbers.filter(function (number) {
                return number % 2 === 0
            })
        }
    }

    在计算属性不适用的情况下 (例如,在嵌套 v-for 循环中) 你可以使用一个 method 方法:

    <li v-for="n in even(numbers)">{{ n }}</li>
    
    data: {
        numbers: [ 1, 2, 3, 4, 5 ]
    },
    methods: {
        even: function (numbers) {
            return numbers.filter(function (number) {
                return number % 2 === 0
            })
        }
    }

一段取值范围的 v-for

  • v-for 也可以取整数。在这种情况下,它将重复多次模板

    <div>
        <span v-for="n in 10">{{ n }} </span>
    </div>
    ==>
    1 2 3 4 5 6 7 8 9 10
  • v-for on a <template>

    类似于 v-if,你也可以利用带有 v-for 的 <template> 渲染多个元素。比如:

    <ul>
        <template v-for="item in items">
            <li>{{ item.msg }}</li>
            <li class="divider"></li>
        </template>
    </ul>
  • v-for with v-if

    <ul v-if="todos.length">
        <li v-for="todo in todos">
            {{ todo }}
        </li>
    </ul>
    <p v-else>No todos left!</p>

------- end -------

原文地址:https://www.cnblogs.com/blueDr/p/9229775.html

时间: 2024-10-16 15:48:00

Vue.js(五)列表渲染 v-for的相关文章

关于vue.js中列表渲染练习

html: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>列表渲染</title></head><body> <!-- v-for可以将一组数组渲染到列表当中 --> <!-- 以item in items的形式 其中 items是源数据 item是他的别名 --&

vue中的列表渲染

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue中列表渲染</title> <script src="./vue.js"></script> </head> <body> <div id="app">

关于vue.js中条件渲染的联系

html: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>条件渲染</title></head><body> <!-- v-if 作为判断条件 如果满足则展示它所附着的元素的内容--> <!-- 除了v-if 还可以配合使用v-else--> <div

3-7 Vue中的列表渲染

 举个案例:循环data中的list的值在div中,并显示相应的index值. 关于数组的循环: //显示效果如下图: //一般的列表渲染最好带一个key值,要把key值设置为唯一值的话,可以选择index.但在频繁操作DOM元素相对应的数据的时候,它还是有点浪费性能,可能让Vue没法充分复用DOM节点,所以不太建议用index来做key值 //所以一般的项目中的后端会传递过来一些数据,这些数据可以把它作为key值来使用(一般会携带一个后端或数据库相关的一个唯一的数据条目标识符,例如:id) /

Vue之vue.js声明式渲染

Html: <div id="app"> {{ message }} </div> Vue: var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } }) 本例子由HTML模板(View)+Vue实例(ViewModel)组成. 创建Vue的实例,需传入一个选项对象,如: 数据(data):Vue 将会递归将 data 的属性转换为 getter/setter,从而让 data 的属性能够响

Vue.js根据列表某列值更新filter

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script src="../Scripts/jquery-1.10.2.min.js"></script> </head> <body> <div id="matchList"

vue.js中如何渲染本地数据库中的图片

// 带参数传值 <router-link :to="{'name':'foot',params:{'id':scene_list.id}}">本地美食</router-link> <template> <div> <h1>美食</h1> <table border="1"> <tr> <td>美食</td> <td>美食图片</

VUE指令-列表渲染v-for

v-for 指令根据一组数组的选项列表进行渲染.v-for 指令需要使用 item in items 形式的特殊语法,items 是源数据数组并且 item 是数组元素迭代的别名. v-for="item in items" <!-- 格式v-for="item in items" --> <div style="height: 150px;background: #CCC;margin: 5px;"> <div s

Vue.js与 ASP.NET Core 服务端渲染功能整合

http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/ 原作者:Mihály Gy?ngy?si 译者:oopsguy.com 我真的很喜欢在前端使用 Vue.js,Vue 服务端渲染直到第二个版本才被支持. 在本例中,我想展示如何将 Vue.js  服务端渲染功能整合 ASP.NET Core. 我们在服务端使用了 Microsoft.AspNetCore.SpaServices 包,该包提供 ASP.N

Vue.js 系列教程 2:组件,Props,Slots

原文:intro-to-vue-2-components-props-slots 译者:nzbin 这是关于 JavaScript 框架 Vue.js 五个教程的第二部分.在这一部分,我们将学习组件,Props 以及 Slots.这个系列教程并不是一个完整的用户手册,而是通过基础知识让你快速了解 Vuejs 以及它的用途. 系列文章: 渲染, 指令, 事件 组件, Props, Slots (你在这!) Vue-cli Vuex 动画 组件和传递数据 如果你熟悉 React 或者 Angular