经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
零基础入门Vue之影分身之术——列表渲染&渲染原理浅析
来源:cnblogs  作者:StarVik  时间:2024/2/7 9:54:51  对本文有异议

听我说

条件渲染 那一篇,我学习到了如何用Vue对dom节点根据条件显示

但单单有条件还不够啊,有时候数据是一大坨一大坨的数据,如果Vue不提供咱要么使用“v-html” 要么就没办法实现

v-html又感觉太low了,Vue提供了另外的指令更好的实现,那便是:列表渲染


列表渲染:v-for

简单的列表渲染可以使用v-for来完成,而Vue提供了两种采用形式的列表渲染


列表渲染之数组

假设我有一个数组,然后我希望数组里面的数据,通过展示在ul的一个一个li里面,并且要求数组更新的同时li会自动的增减

假设data如下

  1. //假设下面是Vue的配置对象
  2. {
  3. data:{
  4. msgList:[
  5. {
  6. name:"张三",
  7. age:19,
  8. sex:"男"
  9. },
  10. {
  11. name:"李四",
  12. age:22,
  13. sex:"男"
  14. },
  15. {
  16. name:"王五",
  17. age:20,
  18. sex:"女"
  19. },
  20. {
  21. name:"陈真",
  22. age:30,
  23. sex:"男"
  24. },
  25. ]
  26. }
  27. }

那么dom节点可以这么写,达到渲染的效果

  1. <!--假设这是根节点的内容-->
  2. <ul>
  3. <li v-for="item of msgList">
  4. {{item.name}} - {{item.age}} - {{item.sex}}
  5. </li>
  6. </ul>

此时,ul里面的li渲染出的个数等同于msgList的个数,同时item表示当前li的数组元素

可以用JavaScript的for-of循环来理解,这里用v-for="item in msgList"也是一样的效果

item都是表示msgList的成员

完整代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <script src="./vue.js"></script>
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <div id="root">
  11. <ul>
  12. <li v-for="item of msgList">
  13. {{item.name}} - {{item.age}} - {{item.sex}}
  14. </li>
  15. </ul>
  16. </div>
  17. </body>
  18. <script>
  19. let vm = new Vue({
  20. el:"#root",
  21. data:{
  22. msgList:[{
  23. name:"张三",
  24. age:19,
  25. sex:"男"
  26. },
  27. {
  28. name:"李四",
  29. age:22,
  30. sex:"男"
  31. },
  32. {
  33. name:"王五",
  34. age:20,
  35. sex:"女"
  36. },
  37. {
  38. name:"陈真",
  39. age:30,
  40. sex:"男"
  41. }]
  42. }
  43. })
  44. </script>
  45. </html>

列表渲染之对象

Vue还允许配置为对象这种可遍历的变量来使用v-for

如果配置为对象的话,那么会拿到两个参数,一个是key一个是value(先拿到value在拿到key

具体代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <script src="./vue.js"></script>
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <div id="root">
  11. <ul>
  12. <li v-for="(value,key) of msgObj">
  13. {{key}} - {{value}}
  14. </li>
  15. </ul>
  16. </div>
  17. </body>
  18. <script>
  19. let vm = new Vue({
  20. el:"#root",
  21. data:{
  22. msgObj:{
  23. name:"陈真",
  24. age:30,
  25. sex:"男"
  26. }
  27. }
  28. })
  29. </script>
  30. </html>

当然也可以写一个参数,只接受value

  1. <div id="root">
  2. <ul>
  3. <li v-for="value of msgObj">
  4. {{value}}
  5. </li>
  6. </ul>
  7. </div>

完全写法

无论是对象还是数组,列表渲染都会给当前值索引,所以对于数组的话就可以写成两个参数,显示value后是索引

  1. <ul>
  2. <li v-for="(item,index) of msgList">
  3. {{index}}、{{item.name}} - {{item.age}} - {{item.sex}}
  4. </li>
  5. </ul>

如何使对象的话就这么写

  1. <ul>
  2. <li v-for="(value,key,index) of msgObj">
  3. {{index}}、{{key}} = {{value}}
  4. </li>
  5. </ul>

key的应用&渲染原理浅析

为了避免出错,无论是react还是vue使用v-for,原则上都应该配置唯一标识作为key

当出现要对数据修改时,未配置唯一标识key可能会出现bug

因此对于需要用上v-for的节点请配置上数据唯一标识作为key

详细解释请参照:维护状态


浅析出错原因

Vue在监控到数据改变时,并不会如我们所想的一样马上渲染dom

而是会先渲染虚拟dom,然后通过特定算法或者说特定规则去渲染实际dom

渲染规则如下:

  • 当遇到v-for时,首先寻找数据老的虚拟dom和新的虚拟dom的唯一标识进行对比(以li为例)
  • 在li节点中,如果有一样的部分那么照搬老的dom,不重新渲染,直接搬运反之根据新的虚拟dom重新渲染
  • 如果li中这个节点在旧虚拟dom不存在,那么久会按照新的虚拟dom重新渲染

不放图片说不清楚,放图片说一大堆,搬出尚硅谷的视频吧:零基础入门Vue之key的作用和原理


key的具体用法

key 的特殊 attribute 主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes。如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算法。而使用 key 时,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。

对于 Vue中的key 的用法也很简单,他是为了标识v-for每个循环元素的唯一性,所以key也应该是唯一的

写法如下

  1. <dom v-for="item in list" :key="item.id"></dom>

此时,当前dom与数据唯一的id互相绑定,这样如果dom更新了,新旧虚拟dom就能一一对应的去对比

就不会出现元素紊乱,并且渲染效率低下的问题

具体代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <script src="./vue.js"></script>
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <div id="root">
  11. <ul>
  12. <li v-for="item of msgList" :key="item.id">
  13. {{item.name}} - {{item.age}} - {{item.sex}}
  14. </li>
  15. </ul>
  16. </div>
  17. </body>
  18. <script>
  19. let vm = new Vue({
  20. el:"#root",
  21. data:{
  22. msgList:[{
  23. id:1,
  24. name:"张三",
  25. age:19,
  26. sex:"男"
  27. },
  28. {
  29. id:2,
  30. name:"李四",
  31. age:22,
  32. sex:"男"
  33. },
  34. {
  35. id:3,
  36. name:"王五",
  37. age:20,
  38. sex:"女"
  39. },
  40. {
  41. id:4,
  42. name:"陈真",
  43. age:30,
  44. sex:"男"
  45. }]
  46. }
  47. })
  48. </script>
  49. </html>

注:切忌把索引作为key,因为只要不是往末尾插入数据或者删除数据的方式来修改数据,都会造成index失去唯一标识的作用


The End

本片完~


下一篇:零基础入门Vue之画龙点睛——再探监测数据

原文链接:https://www.cnblogs.com/Star-Vik/p/18008874

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号