小白入门Vuejs之列表渲染

319 阅读4分钟

在Vue的官方文档中,列表渲染使用是特有的v-for指令,v-for可以用来渲染数组、对象及组件。语法为v-for=" item   in  items ",items为data中提供的数组或对象,item为迭代的每一项,in可以用of来替换。

v-for用来渲染数组时,接收第二个参数index,即每一项的索引。

v-for用来渲染对象时,第一个参数为value键值,接收第二个参数key键名,接收第三个参数为index索引。

当然这里可以理解为赋值,所以参数名用什么代替都是可以的。

这里要注意的是v-for的参数,只能在v-for的代码块中使用,在代码块外面使用这几个参数就会出现报错为 未定义。写了一个mytodo列子来说明:

这里定义了一个模板,绿色的圈中为一个v-for渲染一个数组,为一个v-for代码块,代码块中使用这个参数是没有问题的;在红色的圈中为v-for代码块的外面,当使用v-for代码块中的这几个参数时就会出现undefined的报错,如下:

mytodo例子有一个关闭按钮,用来关闭完成的事情,很明显每个事件要与自身的位置有关,才能关闭相应的事件。官方文档尤大大把这个关闭的事件写在组件里的,通过$emit()来触发事件,这当然是可以的,在v-for代码块中可以运用其中的参数。

另外,官方文档也说了v-for的范围,原话如下:在 v-for 块中,我们拥有对父作用域属性的完全访问权限。

也就是说,v-for代码块中可以使用自身的参数和父作用域中的参数属性,这一点是和JS的函数作用域相同的,我们完全可以把v-for理解为一个函数作用域,作用域内可以使用父级的参数属性,但外面的不能使用v-for作用域的参数。

那么我不想把关闭按钮的事件处理程序写在v-for的里面或父级,而是通过一个函数,这个函数把其参数关联起来,相当于外部能使用,第一张图中我定义了一个closeTodo(),js如下:


同时传入一个参数,在v-for代码块写入index参数,这样就可以关闭相应的todo应用中的做完了的事情了。如果不传入相应的参数,就会出现未定报错,同样没有相应的效果。

官方文档中提到了v-for中关于key的使用,其是与vue的渲染机制有关的,每一项有一个key值相当于用于了独一的身份。官方原话如下:“当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。”

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

这和官方文档中条件渲染中使用key值是一样的,可以简单理解为:Vue为了提高渲染能力,采用复用式渲染,但一个元素A用一个另一元素B代替的时候,不会去单独各自渲染A与B再使用,而是计算出A与B之间的通用部分,B直接去复用与A的通用部分,在B中,通用部分不会被渲染,而只渲染B中不同的部分,以此来提高渲染能力。当使用key的时候,将A与B手动设为完全独立的,即使有通用的部分,这样做官方也说了没有使用key比使用key的性能要好,更有利于渲染。但使用key有什么优点呢?可以这么想,列表中每一项都有了一个独一无二的身份了,若要进行插值是不是就直接可以根据身份来决定插到那一项,简而言之,使用key会提升排序的能力。<a src=" https://www.cnblogs.com/zhumingzhenhao/p/7688336.html ">具体排序图示这个参见这篇文章</>

这个一个小白的文章,还是那句话,如果有什么不对的地方,还望你不吝指教,这将对我有很大的帮助,谢谢。