如东做网站,专注高密网站建设,网站运营包括哪些内容,上海建网站工作室v-for 我们可以使用 v-for 指令基于一个数组来渲染一个列表。 v-for 指令的值需要使用 (item in items) 形式的特殊语法#xff0c;其中 items 是源数据的数组#xff0c;而 item 是迭代项的别名#xff0c; (item, index) in items index 表示当前项的位置索引(可选参数)…v-for 我们可以使用 v-for 指令基于一个数组来渲染一个列表。 v-for 指令的值需要使用 (item in items) 形式的特殊语法其中 items 是源数据的数组而 item 是迭代项的别名 (item, index) in items index 表示当前项的位置索引(可选参数) 在 v-for 块中可以完整地访问父作用域内的属性和变量。 形式一
v-foritem in items形式二
v-for(item, index) in items主流电脑系统有 win 和 mac 和 linux
script langts setup
import { ref } from vueconst system ref(电脑系统)
const items ref([{ platform: win }, { platform: mac }, { platform: linux }])/scripttemplatediv classcontainerli li v-for(item, index) in items{{ system }} - {{ index }} - {{ item.platform }}/li/div
/templatestyle langscss scoped
.container {}
/style示例 你也可以在定义 v-for 的变量别名时使用解构和解构函数参数类似 li v-for{ message } in items{{ message }}
/li!-- 有 index 索引时 --
li v-for({ message }, index) in items{{ message }} {{ index }}
/li对于多层嵌套的 v-for作用域的工作方式和函数的作用域很类似。每个 v-for 作用域都可以访问到父级作用域
li v-foritem in itemsspan v-forchildItem in item.children{{ item.message }} {{ childItem }}/span
/lidiv v-foritem of items/divv-for 与对象 你也可以使用 v-for 来遍历一个对象的所有属性。 遍历的顺序会基于对该对象调用 Object.keys() 的返回值来决定。
const myObject reactive({title: How to do lists in Vue,author: Jane Doe,publishedAt: 2016-04-10
})ulli v-forvalue in myObject{{ value }}/li
/ul可以通过提供第二个参数表示属性名 (例如 key)
li v-for(value, key) in myObject{{ key }}: {{ value }}
/li第三个参数表示位置索引
li v-for(value, key, index) in myObject{{ index }}. {{ key }}: {{ value }}
/li在 v-for 里使用范围值
v-for 可以直接接受一个整数值。在这种用例中会将该模板基于 1...n 的取值范围重复多次。
span v-forn in 10{{ n }}/span注意此处 n 的初值是从 1 开始而非 0。 template 上的 v-for 与模板上的 v-if 类似你也可以在 template 标签上使用 v-for 来渲染一个包含多个元素的块。例如
ultemplate v-foritem in itemsli{{ item.msg }}/lili classdivider rolepresentation/li/template
/ulv-for 与 v-if 同时使用 v-if 和 v-for 是不推荐的因为这样二者的优先级不明显。 当它们同时存在于一个节点上时v-if 比 v-for 的优先级更高。这意味着 v-if 的条件将无法访问到 v-for 作用域内定义的变量别名
!--这会抛出一个错误因为属性 todo 此时没有在该实例上定义
--
li v-fortodo in todos v-if!todo.isComplete{{ todo.name }}
/li在外新包装一层 template 再在其上使用 v-for 可以解决这个问题 (这也更加明显易读)
template v-fortodo in todosli v-if!todo.isComplete{{ todo.name }}/li
/template通过 key 管理状态 Vue 默认按照“就地更新”的策略来更新通过 v-for 渲染的元素列表。当数据项的顺序改变时Vue 不会随之移动 DOM 元素的顺序而是就地更新每个元素确保它们在原本指定的索引位置上渲染。 默认模式是高效的但只适用于列表渲染输出的结果不依赖子组件状态或者临时 DOM 状态 (例如表单输入值) 的情况。 为了给 Vue 一个提示以便它可以跟踪每个节点的标识从而重用和重新排序现有的元素你需要为每个元素对应的块提供一个唯一的 key attribute
div v-foritem in items :keyitem.id!-- 内容 --
/div当你使用 template v-for 时key 应该被放置在这个 template 容器上
template v-fortodo in todos :keytodo.nameli{{ todo.name }}/li
/templatekey 在这里是一个通过 v-bind 绑定的特殊 attribute。请不要和在 v-for 中使用对象里所提到的对象属性名相混淆。 推荐在任何可行的时候为 v-for 提供一个 key attribute除非所迭代的 DOM 内容非常简单 (例如不包含组件或有状态的 DOM 元素)或者你想有意采用默认行为来提高性能。 key 绑定的值期望是一个基础类型的值例如字符串或 number 类型。不要用对象作为 v-for 的 key。 组件上使用 v-for
我们可以直接在组件上使用 v-for和在一般的元素上使用没有区别 (别忘记提供一个 key)
MyComponent v-foritem in items :keyitem.id /但是这不会自动将任何数据传递给组件因为组件有自己独立的作用域。为了将迭代后的数据传递到组件中我们还需要传递 props
MyComponentv-for(item, index) in items:itemitem:indexindex:keyitem.id
/不自动将 item 注入组件的原因是这会使组件与 v-for 的工作方式紧密耦合。明确其数据的来源可以使组件在其他情况下重用。
数组变化侦测 Vue 能够侦听响应式数组的变更方法并在它们被调用时触发相关的更新。这些变更方法包括 push() pop() shift() unshift() splice() sort() reverse() 替换一个数组 变更方法顾名思义就是会对调用它们的原数组进行变更。相对地也有一些不可变 (immutable) 方法例如 filter()concat() 和 slice()这些都不会更改原数组而总是返回一个新数组。当遇到的是非变更方法时我们需要将旧的数组替换为新的
// items 是一个数组的 ref
items.value items.value.filter((item) item.message.match(/Foo/))你可能认为这将导致 Vue 丢弃现有的 DOM 并重新渲染整个列表——幸运的是情况并非如此。Vue 实现了一些巧妙的方法来最大化对 DOM 元素的重用因此用另一个包含部分重叠对象的数组来做替换仍会是一种非常高效的操作。
展示过滤或排序后的结果
有时我们希望显示数组经过过滤或排序后的内容而不实际变更或重置原始数据。在这种情况下你可以创建返回已过滤或已排序数组的计算属性。
const numbers ref([1, 2, 3, 4, 5])const evenNumbers computed(() {return numbers.value.filter((n) n % 2 0)
})li v-forn in evenNumbers{{ n }}/li在计算属性不可行的情况下 (例如在多层嵌套的 v-for 循环中)你可以使用以下方法
const sets ref([[1, 2, 3, 4, 5],[6, 7, 8, 9, 10]
])function even(numbers) {return numbers.filter((number) number % 2 0)
}ul v-fornumbers in setsli v-forn in even(numbers){{ n }}/li
/ul在计算属性中使用 reverse() 和 sort() 的时候务必小心这两个方法将变更原始数组计算函数中不应该这么做。请在调用这些方法之前创建一个原数组的副本
- return numbers.reverse()return [...numbers].reverse()