做360网站官网还是百度,百度搜索引擎,广州网站建设专家,公司运营策划营销一、Vue列表渲染
1.用 v-for 把一个数组对应为一组元素
我们可以用 v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in items 形式的特殊语法#xff0c;其中 items 是源数据数组#xff0c;而 item 则是被迭代的数组元素的别名。
ul idexampl…一、Vue列表渲染
1.用 v-for 把一个数组对应为一组元素
我们可以用 v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in items 形式的特殊语法其中 items 是源数据数组而 item 则是被迭代的数组元素的别名。
ul idexample-1li v-foritem in items :keyitem.message{{ item.message }}/li
/ul
var example1 new Vue({el: #example-1,data: {items: [{ message: Foo },{ message: Bar }]}
})
结果
在 v-for 块中我们可以访问所有父作用域的 property。v-for 还支持一个可选的第二个参数即当前项的索引。
ul idexample-2li 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-foritem of items/div
2.在v-for里使用对象
你也可以用 v-for 来遍历一个对象的 property。
ul idv-for-object classdemoli v-forvalue in object{{ value }}/li
/ul
new Vue({el: #v-for-object,data: {object: {title: How to do lists in Vue,author: Jane Doe,publishedAt: 2016-04-10}}
})
结果 你也可以提供第二个的参数为 property 名称 (也就是键名)
div v-for(value, name) in object{{ name }}: {{ value }}
/div
结果 还可以用第三个参数作为索引
div v-for(value, name, index) in object{{ index }}. {{ name }}: {{ value }}
/div
结果 为了给 Vue 一个提示以便它能跟踪每个节点的身份从而重用和重新排序现有元素你需要为每项提供一个唯一 key
div v-foritem in items v-bind:keyitem.id!-- 内容 --
/div
建议尽可能在使用 v-for 时提供 key attribute除非遍历输出的 DOM 内容非常简单或者是刻意依赖默认行为以获取性能上的提升。
因为它是 Vue 识别节点的一个通用机制key 并不仅与 v-for 特别关联。后面我们将在指南中看到它还具有其它用途。
用index作为key可能会引发的问题
1.若对数据进行逆序添加、逆序删除等破坏顺序操作
会产生没有必要的真实dom更新 界面效果没有问题但效率低
2.如果结构中还包含输入类的DOM
会产生错误DOM更新 界面有问题
开发中如何选择key
1.最好使用每条数据的唯一标识作为key比如 id 手机号 身份证号码 学号等唯一值
2.如果不存在对数据的逆序添加、逆序删除等破坏顺序操作仅用于渲染列表用于展示使用index作为key是没有问题的
二、数组更新检测
1.变更方法
Vue 将被侦听的数组的变更方法进行了包裹所以它们也将会触发视图更新。这些被包裹过的方法包括 push() pop() shift() unshift() splice() sort() reverse()
你可以打开控制台然后对前面例子的 items 数组尝试调用变更方法。
比如 example1.items.push({ message: Baz })。
2.替换数组
变更方法顾名思义会变更调用了这些方法的原始数组。相比之下也有非变更方法例如 filter()、concat() 和 slice()。它们不会变更原始数组而总是返回一个新数组。当使用非变更方法时可以用新数组替换旧数组
example1.items example1.items.filter(function (item) {return item.message.match(/Foo/)
})
三、显示过滤/排序后的结果
有时我们想要显示一个数组经过过滤或排序后的版本而不实际变更或重置原始数据。在这种情况下可以创建一个计算属性来返回过滤或排序后的数组。
li v-forn 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 循环中) 你可以使用一个方法
ul v-forset in setsli v-forn in even(set){{ n }}/li
/ul
data: {sets: [[ 1, 2, 3, 4, 5 ], [6, 7, 8, 9, 10]]
},
methods: {even: function (numbers) {return numbers.filter(function (number) {return number % 2 0})}
}
四、在 v-for 里使用值范围
v-for 也可以接受整数。在这种情况下它会把模板重复对应次数。
divspan v-forn in 10{{ n }} /span
/div
结果 五、在 template 上使用v-for
类似于 v-if你也可以利用带有 v-for 的 template 来循环渲染一段包含多个元素的内容。比如 ultemplate v-foritem in itemsli{{ item.msg }}/lili classdivider rolepresentation/li/template
/ul
六、v-for 与 v-if 一同使用
注意我们不推荐在同一元素上使用 v-if 和 v-for
当它们处于同一节点v-for 的优先级比 v-if 更高这意味着 v-if 将分别重复运行于每个 v-for 循环中。当你只想为部分项渲染节点时这种优先级的机制会十分有用如下
li v-fortodo in todos v-if!todo.isComplete{{ todo }}
/li
上面的代码将只渲染未完成的 todo。
而如果你的目的是有条件地跳过循环的执行那么可以将 v-if 置于外层元素 ( template ) 上。如
ul v-iftodos.lengthli v-fortodo in todos{{ todo }}/li
/ul
p v-elseNo todos left!/p
七、在组件上使用 v-for
在自定义组件上你可以像在任何普通元素上一样使用 v-for。当在组件上使用 v-for 时key 现在是必须的。
my-component v-foritem in items :keyitem.id/my-component
my-componentv-for(item, index) in itemsv-bind:itemitemv-bind:indexindexv-bind:keyitem.id
/my-component