首页 > 其他分享 >vue知识

vue知识

时间:2024-01-15 17:11:43浏览次数:36  
标签:vue 知识 key 组件 diff data 节点

  1. v-if和v-for的比较

  2. vue组件data函数形式

  3. key的作用

  4. diff算法

  5. 你了解哪些vue的性能优化方法

一、v-if和v-for的哪个优先级更高,如果两个同时出现,应该怎么优化得到更好的性能

在源码中发现,先处理静态节点(staticRoot), 再处理once,接着才会处理for ,最后处理if (看下图)

https://csi.chinasoftinc.com/was-140172-e42705e7c75f175390f79c90f821146e-self.jpg?random=1982385330

结论:
1、v-for优先于v-if被解析
2、如果同时出现,每次渲染都会先执行循环再判断条件,无论如何循环都不可避免,浪费了性能
3、要避免出现这种情况,在外层嵌套template,在这一层进行v-if判断,然后在内部进行v-for循环

二、vue组件data为什么必须是个函数,而vue根实例则没有此限制?

源码会对data做一个判断,如果data是function类型的则执行。并把结果作为data选项的值,
否则就使用用户设置的data(下图)

https://csi.chinasoftinc.com/was-140174-785e85f6fd56d29cd9de6a9d4aace348-self.jpg?random=1805321477

 

结论:

vue组件可能存在多个实例,如果使用对象方式定义data,则会导致他们共用一个data对象,那么状态变更将会影响所有的组件实例,这是不合理的;采用函数形式定义没在initData是会将其作为工厂函数返回全新data对象,有效规避多实例之间的状态污染问题,而在vue根实例创建过程中则不存在改限制,也是因为根实例只能有一个,不需要担心这种问题。

三、key工作原理,说说对它的理解

可以唯一确定一个dom元素,从而执行diff算法更高效(案例分享如下)

https://csi.chinasoftinc.com/was-140175-f977d4808a3cf8fb99f3afcb20845ece-self.jpg?random=1441786639

https://csi.chinasoftinc.com/was-140176-40eef0a6fbf2d547d27b7488843ef370-self.jpg?random=1489634346

结论:

1、key的作用主要是为了高效的更新虚拟DOM,其原理是vue在patch过程中通过key可以精准的判断两个节点是否是同一个,从而避免频繁更新不同元素,使得整个patch过程更加高效,减少了dom的操作量,提高性能

2、如果不设置key可能在列表更新时引发一些隐藏的bug 比如说更新和不更新看不出来。

3、vue中在使用相同标签名元素的过渡切换是,也会用到key属性,其目的也是为了让vue可以区分他们,否则vue只会替换其内部属性而不会触发过渡效果。需要用key来作为唯一性的判断。

 

四、怎么理解vue中的diff算法

https://csi.chinasoftinc.com/was-140177-42e1b8e438a310deccc5c57c734fc31b-self.jpg?random=1859592975

总结:

1、diff算法是虚拟DOM技术的必然产物:通过新旧虚拟DOM做对比(既diff),将变化的地方更新在真实DOM上,另外,也需要diff高效的执行对比过程,从而降低时间复杂度为O(n)

2、vue2.0x中为了降低watcher粒度,每个组件只有一个watcher与之对应,只有引入diff才能精确的找到发生变化的地方

3、vue中diff执行的时刻是组件实例执行更新函数时,它会对比与上一次渲染结果oldVnode和新的渲染结果,此过程称为patch

4、diff过程整体遵循深度优先,同层次比较的策略,两个节点之间比较会根据他们是否拥有子节点或者文本节点做不同操作,比较两组子节点是算法重点,首先假设头部节点可能相同做4次对比尝试,如果没有找到相同节点才按照通用的方式去进行遍历查找,查找结束再按情况处理剩下的节点,借助key通常可以非常精确找到相同节点,因此整个patch过程非常高效。

五、你了解哪些vue的性能优化方法

    • 路由懒加载

      https://csi.chinasoftinc.com/was-140178-cc8e7fc252ab1e7dbb8a1ea859b0a2a0-self.jpg?random=792869573

    • keep-alive缓存页面

      https://csi.chinasoftinc.com/was-140179-92577b94988acf038e8519782a599c96-self.jpg?random=688015013

    •  

      使用v-show复用DOM

      https://csi.chinasoftinc.com/was-140180-16002b00766dae1f85bca50822c9959d-self.jpg?random=689693321

    • v-for遍历避免同时使用v-if

      https://csi.chinasoftinc.com/was-140182-dbcdb2a6edad6b1fb24fc900e0256236-self.jpg?random=308441407

    • 图片懒加载

      https://csi.chinasoftinc.com/was-140183-15d52852e2d533a7df9af7d7f4bc55e7-self.jpg?random=1295120746

    • 第三方插件按需导入

      https://csi.chinasoftinc.com/was-140184-dfb61aca3eb68281184b805487445e17-self.jpg?random=2019330880

    • 无状态组件标记为函数式组件

      https://csi.chinasoftinc.com/was-140185-9ed671f19f836dfe61bfde395b63b439-self.jpg?random=2084173322

    • 子组件分离

      https://csi.chinasoftinc.com/was-140186-f2103972313c2a5e2fa092fd2560f020-self.jpg?random=1017497757

    • 变量本地化

      https://csi.chinasoftinc.com/was-140187-70ae0f06efcd380251bdd59573a52824-self.jpg?random=154265098

    • SSR

      服务端渲染

标签:vue,知识,key,组件,diff,data,节点
From: https://www.cnblogs.com/jeor/p/17965822

相关文章

  • vue cli使用介绍
    一、介绍VueCLI是一个基于Vue.js进行快速开发的完整系统。有三个组件:CLI:@vue/cli 全局安装的npm包,提供了终端里的vue命令(如:vuecreate、vueserve、vueui等命令)CLI服务:@vue/cli-service是一个开发环境依赖。构建于 webpack 和 webpack-dev-server 之上(提供如:s......
  • Vue 项目离线安装 ArcGIS for JavaScript
    注意:arcgis-js-api在4.18及之后版本,可以通过npminstall@arcgis/core@4.18.1直接安装在写些博客时,npm能安装的最新版为4.28.10,下面以4.28.10为例,讲解离线安装。在vue3项目中,通过npminstall@arcgis/core@4.28.10安装,但默认是半本地化的,因为assests资源是通过https://js.ar......
  • vue 滚动条滚动到列表的某个区域时,将(负责的、参与的、管理的)区域的title固定到头部
    1、html1<div:id="item.id"class="list-item"v-for="(item,index)inokrTableDate":key="index">2<pclass="bold":class="{'is-fixed':isFixedFlag1&&item.id===�......
  • vue3使用 vant ui 3 如何获取组件 popup dom的高度?
    我目前使用的是vant-ui 3.1.2popup弹出层组件,我想要获取弹出层的高度来计算一些东西,但是使用常规定义refdom的方式总是无法获取,最终找到方案如下:vant-ui官方文档:https://vant-contrib.gitee.io/vant/v3/#/zh-CN/popup<template><van-popupv-model:show="show......
  • 【Vue2+3入门到实战】(18)VUE之Vuex状态管理器概述、VueX的安装、核心概念 State状态代
    目录一、[Vuex](https://vuex.vuejs.org/zh/)概述1.是什么2.使用场景3.优势4.注意:二、需求:多组件共享数据1.创建项目2.创建三个组件,目录如下3.源代码如下三、vuex的使用-创建仓库1.安装vuex2.新建`store/index.js`专门存放vuex3.创建仓库`store/index.js`4在main.j......
  • 【Vue2+3入门到实战】(21)认识Vue3、使用create-vue搭建Vue3项目、熟悉项目和关键文件
    目录一、认识Vue31.Vue2选项式APIvsVue3组合式API2.Vue3的优势二、使用create-vue搭建Vue3项目1.认识create-vue2.使用create-vue创建项目三、熟悉项目和关键文件四、总结一、认识Vue31.Vue2选项式APIvsVue3组合式API<script>exportdefault{data(){r......
  • 【Vue2+3入门到实战】(23)Vue3之组合式API - 父子通信、模版引用、provide和inject、Vue
    这里写自定义目录标题一、组合式API-父子通信1.父传子2.子传父二、组合式API-模版引用1.基本使用2.defineExpose三、组合式API-provide和inject1.作用和场景2.跨层传递普通数据3.跨层传递响应式数据4.跨层传递方法四、Vue3.3新特性-defineOptions五、Vue3.3新特性......
  • 软件测试基础知识 - 集成测试和系统测试的区别,以及它们的应用场景
    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击人工智能教程区别1、测试计划和测试用例编制的先后顺序:从V模型来讲,在需求阶段就要制定系统测试计划和测试用例,概要设计的时候做集成测试计划和测试用例,有些公司的具体实践不一样,但......
  • 并发重要知识点—线程池详解
    https://blog.csdn.net/qq_40270751/article/details/78843226 创建线程的另一种方法是实现Runnable接口。Runnable接口中只有一个run()方法,它非Thread类子类的类提供的一种激活方式。一个类实现Runnable接口后,并不代表该类是一个“线程”类,不能直接运行,必须通过Thread实例才......
  • 关于echarts+vue频繁刷新的造成的内存增长问题
    前言关于解决echarts+ws多次数据刷新渲染,内存增长溢出的尝试。记录一下,便于下次使用有参考方法关闭echarts动画tooltip的动画设置为false。(echarts动画会缓存,通过快照可以看出)tooltip:{axisPointer:{animation:false,//很重要!},......