讲师中心 微信公众号
AI工具推荐 视频效率加速

vuejs中列表渲染的详细介绍

千枫吖_5821

千枫吖_5821

发布时间:2018-08-14 16:47:38

|

3105人浏览过

|

来源于php中文网

原创

本篇文章给大家带来的内容是关于vuejs中列表渲染的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

用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' }
]
}
})

在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迭代器的语法

<p v-for="item of items"></p>

一个对象的v-for

你也可以用v-for通过一个对象的属性来迭代。

立即学习“前端免费学习笔记(深入)”;

<ul id="v-for-object" class="demo">
<li v-for="value in object">
{{ value }}
</li>
</ul>
new Vue({
el: '#v-for-object',
data: {
object: {
firstName: 'John',
lastName: 'Doe',
age: 30
}
}
})

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

立即学习“前端免费学习笔记(深入)”;

<p v-for="(value, key) in object">
{{ key }}: {{ value }}
</p>

第三个参数为索引:

立即学习“前端免费学习笔记(深入)”;

<p v-for="(value, key, index) in object">
{{ index }}. {{ key }}: {{ value }}
</p>

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

key

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

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

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

立即学习“前端免费学习笔记(深入)”;

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

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

因为他是vue识别节点的一个通用机制,key并不是与v-for特别关联,key还具有其他用途,

数组更新检测

编译方法

vue包含一直观察数组的编译方法,所以他们也将会触发视图更新。

* 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元素得到最大范围的重用而实现了一些智能的、启发式的方法,所以用一个含有相同元素的数组去替换原来的数组是非常高效的操作。

注意事项

由于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)

splice()方法向/从数组添加/删除项目,然后返回被删除的项目

arrayObject.splice(index,howmany,item1,.....,itemX)

index

必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。

带电商的Vuejs管理后台模板前端框架-Vuesax
带电商的Vuejs管理后台模板前端框架-Vuesax

vuejs后台,vuejs管理模板,vuejs,管理模板,vue后台,vue后台管理

下载

howmany

必需。要删除的项目数量。如果设置为 0,则不会删除项目。

item1, ..., itemX

可选。向数组添加的新项目。

对象更改检测注意事项

还是由于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方法。

立即学习“前端免费学习笔记(深入)”;

data: {
numbers: [ 1, 2, 3, 4, 5 ]
},
methods: {
even: function (numbers) {
return numbers.filter(function (number) {
return number % 2 === 0
})
}
}

一段取值范围的v-for

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

立即学习“前端免费学习笔记(深入)”;

<p>
<span v-for="n in 10">{{ n }} </span>
</p>

v-for on a

类似于v-if,你也可以利用带有v-for的

立即学习“前端免费学习笔记(深入)”;

<ul>
<template v-for="item in items">
<li>{{ item.msg }}</li>
<li class="pider" role="presentation"></li>
</template>
</ul>

v-for with v-if

当他们处于同一节点,v-for的优先级比v-if更高,这意味着v-if将分别重复运行与每个v-for循环中。当你想为仅有的一些项渲染节点时,这种优先级的机制会十分有用。

立即学习“前端免费学习笔记(深入)”;

<li v-for="todo in todos" v-if="!todo.isComplete">
{{ todo }}
</li>

上面的代码只传递了未完成的 todos。

而如果你的目的是有条件地跳过循环的执行,那么可以将 v-if 置于外层元素 (或

立即学习“前端免费学习笔记(深入)”;

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

一个组件的v-for

了解组件相关知识,查看组件。完全可以先跳过他,以后再回来 查看。

在自定义组件里,你可以像任何普通元素一样用v-for.

<my-component v-for="item in items" :key="item.id"></my-component>

当在组件中使用 v-for 时,key 现在是必须的。

然而,任何数据都不会被自动传递到组件里,因为组件有自己独立的作用域。为了把迭代数据传递到组件里。

我们要用props:

<my-component
v-for="(item, index) in items"
v-bind:item="item"
v-bind:index="index"
v-bind:key="item.id"
></my-component>

不自动将item注入到组件里的原因是,这会使得组件与v-for的运作紧密耦合。明确组件数据的来源能够使组件在其他场合重复使用。

立即学习“前端免费学习笔记(深入)”;

<p id="todo-list-example">
<form v-on:submit.prevent="addNewTodo">
<label for="new-todo">Add a todo</label>
<input
v-model="newTodoText"
id="new-todo"
placeholder="E.g. Feed the cat"
>
<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"
v-on:remove="todos.splice(index, 1)"
></li>
</ul>
</p>

注意这里的is="todo-item"属性。这种做法在使用dom模板时是十分必要的。因为在

    元素内只有
  • 元素 会被看做有效内容。这样做实现的效果与相同。但是可以避开一些潜在的浏览器解析错误。

    <p id="todo-list-example">
      <form v-on:submit.prevent="addNewTodo">
        <label for="new-todo">Add a todo</label>
        <input
          v-model="newTodoText"
          id="new-todo"
          placeholder="E.g. Feed the cat"
        >
        <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"
          v-on:remove="todos.splice(index, 1)"
        ></li>
      </ul>
    </p>

    注意这里的 is="todo-item" 属性。这种做法在使用 DOM 模板时是十分必要的,因为在

      元素内只有
    • 元素会被看作有效内容。这样做实现的效果与 相同,但是可以避开一些潜在的浏览器解析错误。查看 DOM 模板解析说明 来了解更多信息。

      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: 'Mow the lawn'
            }
          ],
          nextTodoId: 4
        },
        methods: {
          addNewTodo: function () {
            this.todos.push({
              id: this.nextTodoId++,
              title: this.newTodoText
            })
            this.newTodoText = ''
          }
        }
      })

      相关推荐:

      js实现页面间数据传递的代码

      reac如何t实现更换皮肤颜色的功能

       jQuery中的方法有哪些?jQuery中常用的方法(附代码)

    热门AI工具

    更多
    Lovart
    Lovart Hot

    一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

    Flowith
    Flowith Hot

    Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

    PixTV
    PixTV Hot

    PixTV是一款面向AIGC内容创作的AI视频生成工具。

    WorkBuddy

    一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

    Laper
    Laper Hot

    Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

    Loomy
    Loomy Hot

    一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

    DeepSeek

    DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

    豆包大模型

    豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

    码上飞
    码上飞 Hot

    一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

    相关专题

    更多
    jquery插件有哪些
    jquery插件有哪些

    jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

    601

    2023.09.12

    jquery怎么操作json
    jquery怎么操作json

    操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

    1196

    2023.10.13

    jquery删除元素的方法
    jquery删除元素的方法

    jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

    2302

    2023.11.10

    jQuery hover()方法的使用
    jQuery hover()方法的使用

    hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

    2168

    2023.12.04

    jquery实现分页方法
    jquery实现分页方法

    在jQuery中实现分页可以使用插件或者自定义实现。想了解更多jquery分页的相关内容,可以阅读本专题下面的文章。

    493

    2023.12.06

    jquery中隐藏元素是什么
    jquery中隐藏元素是什么

    jquery中隐藏元素是非常重要的一个概念,在使用jquery隐藏元素之前,需要先了解css样式中关于元素隐藏的属性,比如display、visibility、opacity等属性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    337

    2024.02.23

    jquery中什么是高亮显示
    jquery中什么是高亮显示

    jquery中高亮显示是指对页面搜索关键词时进行高亮显示,其实现办法:1、先获取要高亮显示的行,获取搜索的内容,再遍历整行内容,最后添加高亮颜色;2、使用“jquery highlight”高亮插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    826

    2024.02.23

    jQuery 正则表达式相关教程
    jQuery 正则表达式相关教程

    本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

    309

    2026.01.13

    Tailwind CSS 如何制作导航栏和卡片
    Tailwind CSS 如何制作导航栏和卡片

    用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

    0

    2026.11.03

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Vue.js:纪录片
    Vue.js:纪录片

    共1课时 | 0.2万人学习

    2天速成VueJS
    2天速成VueJS

    共7课时 | 2.9万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn