Vue.js学习之条件v-if和列表循环v-for详解

本文将继续和大家分享Vue.js的基础知识,主要是介绍Vue.js的条件v-if和列表循环v-for的相关使用,一起来看看吧,希望可以帮助大家更好的学习Vue.js

v-if 、v-else、v-show、还可以使用template

<div v-if="ok">ok</div>

<div v-else>No</div>

<div v-show="ok">ok</div>

<template v-if="ok">

<strong>测试template</strong>

</template>

<template v-else>

<strong>no template</strong>

</template>

演示

列表循环v-for

循环数组

<ul>

<li v-for="todo in todos">{{todo.text}}</li>

</ul>

多级列表,第二个参数提供当前项的索引、template模板

<div v-for="items in list">

<template v-for="(item, index) in items">{{index}} - {{item.message}}<br/></template>

</div>

对象迭代:

一个参数作为值

<div v-for="value in object">

{{value}}

</div>

第二个参数作为键名

<div v-for="(value,key) in object">

{{key}} - {{value}}

</div>

第三个参数作为当前项的索引

<div v-for="(value,key,index) in object">

{{index}} - {{key}} : {{value}}

</div>

组件 和 v-for

循环数组数据到组件中,使用props,可以把值和当前索引赋值给组件。

<my-component

v-for="(item, index) in items"

v-bind:item="item"

v-bind:index="index">

</my-component>

或者下面这种加了某些有语义标签,里面有一个is="组件名"

<li

is="todo-item"

v-for="(todo, index) in todos"

v-bind:item="todo"

v-on:remove="todos.splice(index, 1)"

></li>

下面是一个完整示例:

<div id="todo-list-example">

<input

v-model="newTodoText"

v-on:keyup.enter="addNewTodo"

placeholder="Add a todo"

>

<ul>

<li

is="todo-item"

v-for="(todo, index) in todos"

v-bind:item="todo"

v-on:remove="todos.splice(index, 1)"

></li>

</ul>

</div>

Vue.component(’todo-item’, {

template: ’

<li>

{{ item }}

<button v-on:click="$emit(\’remove\’)">X</button>

</li>

’,

props: [’item’]

})

new Vue({

el: ’#todo-list-example’,

data: {

newTodoText: ’’,

todos: [

’Do the dishes’,

’Take out the trash’,

’Mow the lawn’

},

methods: {

addNewTodo: function () {

this.todos.push(this.newTodoText)

this.newTodoText = ’’

}

}

})

使用props将数组循环的索引项和值赋值给当前组件

发现一个细节,就是组件模板template分行要加一个\,另外双引号里面有分号也要加一个\.

使用当前执行函数,$emit(\’remove\’);remove是绑定在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()

你打开控制台,然后用前面例子的 items 数组调用突变方法: example1.items.push({ message: ’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 不能检测以下变动的数组:

当你直接设置一个项的索引时,例如: vm.items[indexOfItem] = newValue

当你修改数组的长度时,例如: vm.items.length = newLength

为了避免第一种情况,以下两种方式将达到像 vm.items[indexOfItem] = newValue 的效果, 同时也将触发状态更新:

// Vue.set

Vue.set(example1.items, indexOfItem, newValue)

// Array.prototype.splice`

example1.items.splice(indexOfItem, 1, newValue)

避免第二种情况,使用 splice :

example1.items.splice(newLength)

显示过滤/排序结果

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

例如:

<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

})

}

}

或者,您也可以使用在计算属性是不可行的 method 方法 (例如,在嵌套 v-for 循环中):

<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

})

}

}

文章来源:前端开发博客

时间: 2024-11-05 10:31:02

Vue.js学习之条件v-if和列表循环v-for详解的相关文章

Vue.js 源码分析(二十二) 指令篇 v-model指令详解

Vue.js提供了v-model指令用于双向数据绑定,比如在输入框上使用时,输入的内容会事实映射到绑定的数据上,绑定的数据又可以显示在页面里,数据显示的过程是自动完成的. v-model本质上不过是语法糖.它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理.例如: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <ti

Vue.js 源码分析(二十六) 高级应用 作用域插槽 详解

普通的插槽里面的数据是在父组件里定义的,而作用域插槽里的数据是在子组件定义的. 有时候作用域插槽很有用,比如使用Element-ui表格自定义模板时就用到了作用域插槽,Element-ui定义了每个单元格数据的显示格式,我们可以通过作用域插槽自定义数据的显示格式,对于二次开发来说具有很强的扩展性. 作用域插槽使用<template>来定义模板,可以带两个参数,分别是: slot-scope    ;模板里的变量,旧版使用scope属性 slot              ;该作用域插槽的nam

Vue.js学习笔记:在元素 和 template 中使用 v-if 指令

f 指令 语法比较简单,直接上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title></title> <script src="https://cdn.bootcss.com/vue/2.2.

Vue.js学习笔记(7)组件详解

在这篇文章之前小颖分享过小颖自己写的组件:Vue.js学习笔记(5)tabs组件和Tree升级版(实现省市多级联动) 先给大家看下小颖写了一个简单的组件示例: 组件: <template> <div class='content' v-if='showFlag'> <input type="text" v-bind:style='{ width:compwidth+"px"}' v-model='compvalue' @keyup='m

vue.js学习之 跨域请求代理与axios传参

vue.js学习之 跨域请求代理与axios传参 一:跨域请求代理 1:打开config/index.js module.exports{ dev: { } } 在这里面找到proxyTable{},改为这样: proxyTable: { '/api': { target: 'http://121.41.130.58:9090',//设置你调用的接口域名和端口号 别忘了加http changeOrigin: true, pathRewrite: { '^/api': ''//这里理解成用'/ap

浅析Vue.js 中的条件渲染指令

1 应用于单个元素 Vue.js 中的条件渲染指令可以根据表达式的值,来决定在 DOM 中是渲染还是销毁元素或组件. html: <div id="app"> <p v-if="type===1">拌面</p> <p v-else-if="type===2">扁肉</p> <p v-else="type===3">其它</p> </div

TortoiseGit学习系列之TortoiseGit基本操作拉取项目(图文详解)

前面博客 TortoiseGit学习系列之TortoiseGit基本操作修改提交项目(图文详解) TortoiseGit学习系列之TortoiseGit基本操作将提交到本地的项目推送到在线仓库(图文详解) TortoiseGit基本操作拉取项目 如果本地的项目没有在线仓库的新,则需要执行拉取操作(Pull ...). 在本地项目的空白处点击鼠标右键, 选择 TortoiseGit --> 拉取... 或: Pull.... 弹出拉取(pull)对话框: [如果拉取有BUG,请不要使用 rebas

vue.js 学习之模板语法详解

本文和大家分享的主要是vue.js 的模板语法,希望对大家学习vue.js有所帮助,一起来看看吧. Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解析器解析. 在底层的实现上, Vue 将模板编译成虚拟 DOM 渲染函数.结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上. 如果你熟悉虚拟 D

Vue.js 学习入门:介绍及安装

Vue.js 是什么? Vue (读音 /vju?/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合. 详细讲解内容可见:一句话理解Vue核心内容 (这块内容之后再做个阅读笔记) 环境搭建 1.下载 nodejs(http://nodejs.cn): node -v 终端查看安装成功 npm -v 查看npm版本安装成功 2.安装 vue 命令:npm