建筑行业资讯网站,企业为什么做网站推广,做网络传销网站犯罪吗,网站源码爬取在v-for里使用对象用 v-for 把一个数组对应为一组元素
我们可以用 v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in list形式的特殊语法#xff0c;其中 list是源数据数组#xff0c;而 item 则是被迭代的数组元素的别名。 templatediv clas… 在v-for里使用对象用 v-for 把一个数组对应为一组元素
我们可以用 v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in list形式的特殊语法其中 list是源数据数组而 item 则是被迭代的数组元素的别名。 templatediv classcontentul idexample-1li v-foritem in list :keyitem.id{{ item.message }}/li/ul/div
/templatescript
export default {data() {return {list: [{ message: Foo, id: 1 },{ message: Bar, id: 2 },],}},
}
/scriptstyle scoped
/style 在v-for里使用对象
你也可以用 v-for 来遍历一个对象的 property。
templatediv classcontentul idv-for-object classdemoli v-forvalue in object{{ value }}/li/ul/div
/templatescript
export default {data() {return {object: {title: How to do lists in Vue,author: Jane Doe,publishedAt: 2016-04-10,},}},
}
/scriptstyle scoped
/style
结果 也可以提供第二个的参数为 property 名称 (也就是键名)
div v-for(value, name) in object{{ name }}: {{ value }}
/div 结果 还可以用第三个参数作为索引
div v-for(value, name, index) in object{{ index }}. {{ name }}: {{ value }}
/div 在遍历对象时会按 Object.keys() 的结果遍历但是不能保证它的结果在不同的 JavaScript 引擎下都一致。
维护状态
当 Vue 正在更新使用 v-for 渲染的元素列表时它默认使用“就地更新”的策略。如果数据项的顺序被改变Vue 将不会移动 DOM 元素来匹配数据项的顺序而是就地更新每个元素并且确保它们在每个索引位置正确渲染。这个类似 Vue 1.x 的 track-by$index。
这个默认的模式是高效的但是只适用于不依赖子组件状态或临时 DOM 状态 (例如表单输入值) 的列表渲染输出。
为了给 Vue 一个提示以便它能跟踪每个节点的身份从而重用和重新排序现有元素你需要为每项提供一个唯一 key attribute
div v-foritem in items v-bind:keyitem.id!-- 内容 --
/div
建议尽可能在使用 v-for 时提供 key attribute除非遍历输出的 DOM 内容非常简单或者是刻意依赖默认行为以获取性能上的提升。
因为它是 Vue 识别节点的一个通用机制key 并不仅与 v-for 特别关联。后面我们将在指南中看到它还具有其它用途。
v-for 数组更新检测
变更方法
v-foritem in list 这个list 如果你是直接this.list [a,b,c]的话dom是不会更新的
Vue 会监听到使用数组方法进行更新的list
push()pop()shift()unshift()splice()sort()reverse()
替换数组
变更方法顾名思义会变更调用了这些方法的原始数组。相比之下也有非变更方法例如 filter()、concat() 和 slice()。它们不会变更原始数组而总是返回一个新数组。当使用非变更方法时可以用新数组替换旧数组
example1.items example1.items.filter(function (item) {return item.message.match(/Foo/)
})
你可能认为这将导致 Vue 丢弃现有 DOM 并重新渲染整个列表。幸运的是事实并非如此。Vue 为了使得 DOM 元素得到最大范围的重用而实现了一些智能的启发式方法所以用一个含有相同元素的数组去替换原来的数组是非常高效的操作。
显示排序/排序后的结果
有时我们想要显示一个数组经过过滤或排序后的版本而不实际变更或重置原始数据。在这种情况下可以创建一个计算属性来返回过滤或排序后的数组。
例如
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})}
}
在 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-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
后续会持续更新...