VUE学习笔记:条件渲染与列表渲染
条件渲染
v-if
,v-else-if
,v-else
在之前的简单使用中已经做过相应的介绍了,这里用一个非常简单的例子做一个使用说明
1 | <div id="app"> |
使用模板进行条件渲染
可以看出,如果我们要进行条件渲染,则必须要将指令加在标签内,但是如果我们希望多个标签同时出现,又不希望嵌套,则可以使用模板template
1 | <template v-if="sex=='男'"> |
在页面渲染结果中是不会出现template的,仅作为一个不可见的包裹元素来使用
v-show
除了v-if
系列之外,Vue.js还提供了一种条件渲染指令v-show
,和v-if
的使用方法十分相似
1 | <div v-show="sex=='男'"> |
但是v-show
和v-if
在渲染方式上是存在区别的,当v-if
判断失效的时候,相应的元素并不会被渲染出来,直到判断为真才会去渲染对应的元素,而v-show
不管元素是否生效,都会去渲染它,用display
属性来决定元素是否显示,比方说,上面的html代码在data中的sex为”女”时渲染得到的html代码如下
1 | <div id="app"> |
当需要该dom元素可见时,只要改变display
属性即可
所以相比之下,v-if
的切换开销大,而v-show
的初始渲染开销大,当网页需要频繁切换时应使用v-show
来渲染,否则v-if
更佳
用key来管理元素
Vue的实现会高效的渲染元素,通常会复用已有的元素而非从头开始渲染
比方说如下的例子,点击按钮之后
1 | <template v-if="loginType === 'username'"> |
输入区域的内容并没有变化,但是label确实发生了变化,说明按钮生效了
本质上,因为两个模板的元素是相同的,Vue并没有重新去渲染一个新的,仅仅是替换了label
的innerHTML
以及input
的placeholder
而已
如果我们不希望vue去复用元素,我们得告诉vue两个元素是完全独立的,为此,vue为我们提供了一个key属性,你只要给不希望被复用的元素key属性即可
1 | <template v-if="loginType === 'username'"> |
这样点击按钮的时候输入区域的内容就不会被保留,因为dom被重新生成了
列表渲染
基于数组渲染列表
之前在简单使用中初步了解了v-for
,我们知道用v-for
可以很方便地遍历data中的数组,如下所示是一个简单的例子
1 | <ul id="app"> |
v-for
还可以拥有第二个参数,用来表示下标
1 | <ul id="app"> |
数组的更新检测
对于刚才用数据渲染列表的例子,我们在控制台输入代码
1 | app.items[0]="item0" |
可以在控制台看到items[0]被修改了,但是页面上却并没有什么变化,因为vue是不监听索引值的,但是vue封装了很多数组的变更方法,这些方法是可以被监听到的,包括
- push()
- pop()
- shift()
- unshift()
- splice()
- sort()
- reverse()
还包括了数组替换的方法:filter()、concat() 和 slice()
注意这里的数组替换并不会使得VUE重新渲染整个列表,VUE会最大范围地重用DOM元素,因此这个替换是一个比较高效的操作
如果,一定要用索引值去修改,也不是没有办法,可以使用$set
方法,使用方法如下
1 | app.$set(app.items,0,"item0") |
基于对象渲染列表
当用v-for
来遍历对象内容时可以有三个参数:属性值,属性名,以及索引值,示例如下所示
1 | <ul id="app"> |
用key来管理数组元素
我们知道,为了让元素不被复用,需要绑定key
来使元素独立
但是在数组的遍历中,我们不能将key直接绑定在索引值上,这种操作会因为VUE的复用策略产生一些神奇的问题
举个例子
1 | <div id="app"> |
我们在item1的checkbox上打个勾
然后点击按钮删除item1,就会发现item1虽然被删除了,但是item2前面的checkbox也有一个勾
这是因为vue在更新数据的过程中,发现虚拟dom前两项的key和当前dom是相同的,于是选择复用,只是更改了dom中的文本
所以,绑定key的时候最好要选择独一无二的变量来渲染,比如可以修改为如下方式
1 | <div id="app"> |
这样就不会有复用的问题了