首页 > 其他分享 >零基础入门Vue之影分身之术——列表渲染&渲染原理浅析

零基础入门Vue之影分身之术——列表渲染&渲染原理浅析

时间:2024-02-05 21:44:08浏览次数:38  
标签:Vue name 渲染 age sex 之影 key 浅析

听我说

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

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

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


列表渲染:v-for

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


列表渲染之数组

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

假设data如下

//假设下面是Vue的配置对象
{
  data:{
    msgList:[
      {
        name:"张三",
        age:19,
        sex:"男"
      },
      {
        name:"李四",
        age:22,
        sex:"男"
      },
      {
        name:"王五",
        age:20,
        sex:"女"
      },
      {
        name:"陈真",
        age:30,
        sex:"男"
      },
    ]
  }
}

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

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

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

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

item都是表示msgList的成员

完整代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="./vue.js"></script>
    <title>Document</title>
</head>
<body>
    <div id="root">
        <ul>
            <li v-for="item of msgList">
              {{item.name}} - {{item.age}} - {{item.sex}}
            </li>
        </ul>
    </div>
</body>
<script>
    let vm = new Vue({
        el:"#root",
        data:{
            msgList:[{
                name:"张三",
                age:19,
                sex:"男"
            },
            {
                name:"李四",
                age:22,
                sex:"男"
            },
            {
                name:"王五",
                age:20,
                sex:"女"
            },
            {
                name:"陈真",
                age:30,
                sex:"男"
            }]
        }
    })
</script>
</html>

列表渲染之对象

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

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

具体代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="./vue.js"></script>
    <title>Document</title>
</head>
<body>
    <div id="root">
        <ul>
            <li v-for="(value,key) of msgObj">
              {{key}} - {{value}}
            </li>
        </ul>
    </div>
</body>
<script>
    let vm = new Vue({
        el:"#root",
        data:{
            msgObj:{
                name:"陈真",
                age:30,
                sex:"男"
            }
        }
    })
</script>
</html>

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

<div id="root">
    <ul>
        <li v-for="value of msgObj">
          {{value}}
        </li>
    </ul>
</div>

完全写法

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

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

如何使对象的话就这么写

<ul>
    <li v-for="(value,key,index) of msgObj">
      {{index}}、{{key}} = {{value}}
    </li>
</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也应该是唯一的

写法如下

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

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

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

具体代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="./vue.js"></script>
    <title>Document</title>
</head>
<body>
    <div id="root">
        <ul>
            <li v-for="item of msgList" :key="item.id">
              {{item.name}} - {{item.age}} - {{item.sex}}
            </li>
        </ul>
    </div>
</body>
<script>
    let vm = new Vue({
        el:"#root",
        data:{
            msgList:[{
                id:1,
                name:"张三",
                age:19,
                sex:"男"
            },
            {
                id:2,
                name:"李四",
                age:22,
                sex:"男"
            },
            {
                id:3,
                name:"王五",
                age:20,
                sex:"女"
            },
            {
                id:4,
                name:"陈真",
                age:30,
                sex:"男"
            }]
        }
    })
</script>
</html>

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


The End

本片完~

标签:Vue,name,渲染,age,sex,之影,key,浅析
From: https://www.cnblogs.com/Star-Vik/p/18008874

相关文章

  • 第八届:世界3D渲染挑战赛《无尽阶梯》报名开始
    全世界的3D艺术创作者们引颈期盼的盛事“全球3D渲染艺术大奖赛”已迈入第八个年头。本届比赛的主题为“无尽的阶梯”,参赛者们可通过挑战赛展现自身的创造力,比赛在行业内拥有极高的知名度,含金量十足,参赛这可通过这里提高自己在业界的曝光。下面一起来简单看看世界3D渲染挑战赛的开......
  • 在 Effect 中直接请求数据很容易导致“网络瀑布”。当你渲染父组件时,它会请求一些数据
    在Effect中直接请求数据很容易导致“网络瀑布”。当你渲染父组件时,它会请求一些数据,再渲染子组件,然后重复这样的过程来请求子组件的数据。如果网络不是很快,这将比并行请求所有数据要慢得多。如何理解?在React中,当我们在Effect(例如useEffectHook)中直接请求数据时,如果数据请求......
  • 零基础入门Vue之To be or not to be——条件渲染
    温故上一节:零基础入门Vue之皇帝的新衣——样式绑定在前面的内容能了解到,Vue不仅仅能进行数据渲染还可以对样式进行绑定并且他能随意的切换样式,但Vue的初衷就是尽量少让使用者操作dom节点加入你要让指定dom显示或者不显示,该怎么办呢?以目前的东西来说,不拿到dom节点还是做不到的......
  • oc云渲染云渲染操作步骤
    随着计算机技术的不断发展,云渲染技术已经逐渐成为了一种流行的渲染方式。其中,OC云渲染因其高效、便捷和稳定的性能受到了广泛欢迎。然而,对于初学者来说,如何进行OC云渲染可能仍然是一个问题。下面,我们将详细介绍OC云渲染的操作方法,帮助您快速上手。一、准备工作在进行OC云渲染之......
  • oc渲染器初始参数怎么设置?oc渲染器初始参数怎么弄
    ​OC渲染器以其用户友好的界面、卓越的渲染品质而受到众多初学者的欢迎,而且它使得创建逼真的视觉效果变得轻而易举。对于产品展示、建筑设计以及室内布局渲染来说,OC渲染器都能表现出优异的性能。下面,我们将介绍新手如何进行OC渲染器的基本初始设置,以便顺利开始他们的渲染之旅!oc渲......
  • 设计模式浅析(二) ·观察者模式
    设计模式浅析(二)·观察者模式日常叨逼叨java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷......
  • vue实现v-html渲染的图片预览
    在v-html属性标签的标签上添加getImg方法<divclass="content"v-html="content"@click="getImg($event)"></div>getImg方法,通过$event可获取用户当前点击的元素相应的内容,这里可以获取所点击图片对应的src。判断拿到src后,添加图片的预览效果就可以了//点击查看图片co......
  • 「效果图渲染」效果图与3D影视动画渲染区别
    效果图和3D动画渲染是图像渲染技术在各自领域的应用。效果图渲染常见于建造、室内布局以及产品设计等专业领域,其中对图像的准确性与细致程度有着较高的标准。相较之下,3D动画渲染更广泛地被运用于制作电影、电视节目、电子游戏和广告等娱乐媒介,不仅要处理更为动态和复杂的场景,还要......
  • 瑞云效果图渲染客户端更新内容一览
    瑞云渲染「效果图客户端」正式更新啦,在云渲染是影视动画、效果图用户都在选择的服务,云渲染的文件可通过网页端、客户端、插件端提交。随着新的一年到来,效果图云渲染客户端进行了一个较大的UI更新,还对功能、版本转换功能、作业预览功能、意见反馈功能、系统设置等功能模块进行了全......
  • 设计模式浅析(一) ·策略模式
    设计模式浅析(一)·策略模式日常叨逼叨java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷......