Vue生命周期与性能优化

2023-10-27

生命周期

  • beforeCreate 在 Vue 实例初始化之后,数据观测(data observer)之前被调用;
  • created 实例已创建完成之后被调用。在这一步,实例已完成这几个配置:数据观测、属性和方法的运算、watch/event 事件回调。这里还没有 $el
  • beforeMount 在挂在开始之前被调用,相关的 render 函数首次被调用;
  • mounted el 被创建的 vm.$el 替换,并挂载到实例上去之后调用这个钩子;
  • brforeUpdate 数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前;
  • updated 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子;
  • beforeDestory 实例销毁之前调用。在这一步,实例仍然完全可用;
  • destroyed Vue 实例销毁后调用,调用后,Vue 实例指示的所有东西都会接绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。
    Vue生命周期流程图

各个生命周期内可以做的事情

  • created 实例已经创建完成,因为它是最早触发的原因,可以进行一些数据、资源的请求;

  • mounted 实例已经挂载完成,可以进行一些 DOM 操作,也可以进行一些数据、资源的请求;

  • beforeUpdate 可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程;

  • updated 可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间,不被调用;

  • beforeDestroy 可以执行一些优化操作,比如清空定时器,解除绑定事件。

  • beforeCreate 和 beforeMount,父组件会先触发;

  • 创建 Vue 实例时(created),父组件会先创建。只有父组件先初始化,内部的子组件才会初始化;

  • 挂载时(mounted),子组件先挂载。子组件渲染完了,父组件才会接着渲染完;

  • 卸载时(beforeDestory),子组件先卸载。如果先卸载父组件,子组件如何处理?这可能会造成内层泄露;

  • beforeUpdate 父组件先触发更新;

  • updated 子组件先触发。子组件更新完了之后,父组件才算更新完成;
    父子组件生命周期调用顺序
    更新调用顺序

常见的性能优化

  • 合理使用 v-show 和 v-if,更新不是很频繁时可以使用 v-if,v-if 比较耗费性能,如果是频繁切换的场景就使用 v-show
  • 合理使用 computed,计算属性会基于它们的响应式依赖进行缓存,只在相关响应式依赖发生改变时它们才会重新求值;
  • v-for 时加上 key,以及避免和 v-if 同时使用,因为 v-for 比 v-if 优先级更高,每次 v-for 时,v-if 都要重新计算一遍,这很浪费;
  • 自定义事件、DOM 事件、定时器等任务及时销毁(在 beforeDestory 中),避免内层泄露;
  • 合理的使用异步组件,只在需要的时候才从服务器加载模块,而且 Vue 异步组件被渲染时会把结果缓存起来供未来重渲染;
  • 合理的使用 keep-alive。对于不需要重新渲染的组件进行缓存,如多个静态 Tab 页的切换,可以用 keep-alive 包裹;
  • data 层级不要太深,避免递归次数过多,消耗时间;
  • 前端通用的性能优化,比如图片懒加载;
  • 使用 SSR。

v-if 与 v-show

这两个指令都可以把元素隐藏或显示。当传入的数据是 true 是展示,false 会隐藏。不同的是:v-if 会把元素或者组件删掉(不渲染),即在 DOM 中移除;v-show 则会使用 CSS 当中的 display 属性,将其设置成 none。可见,v-if 要比 v-show 性能低,尤其是在频繁切换的场景下。

key 的重要性

在循环中应使用 key,且最好不要是 index 或者 random。diff 算法中通过 tag 和 key 来判断是否是同一个节点(sameNode),使用 key 可以减少渲染次数,提高渲染性能。

Vuex

Vuex 是一个 Vue 状态管理库。与 Redux 相比,Vuex 理解起来要简单许多。它的大致工作流程如下:
Vuex工作流程
图中绿色虚线部分就是 Vuex 的工作环境。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue生命周期与性能优化 的相关文章

  • Vuetify:v-ripple 只能用于块级元素

    我今天刚开始收到此错误 它破坏了我的整个网站 因为我像个傻瓜一样在页面加载时加载 Vuetify 有谁知道这意味着什么或如何解决它 谷歌搜索没有发现任何有用的信息 Edit 对于因网站也损坏而发现此问题的任何人 这可能是因为您加载的位置vu
  • nuxt.js - 如何在服务器端为所有客户端缓存 axios 调用

    我正在使用 vue nuxt js 应用程序 我想知道是否可以为所有客户端缓存 axios webservice 调用 我必须获取一些货币参考数据 而每个客户都必须调用这些数据并没有多大意义 有人可以给我一些提示 甚至是一个例子吗 谢谢 这
  • 我应该如何处理 Vuex 中的事件?

    我习惯使用全局事件总线来处理跨组件方法 例如 var bus new Vue Component A bus emit DoSomethingInComponentB Component B bus on DoSomethingInComp
  • 使用 jquery-chosen 插件更新 vuejs 模型值

    尝试使用jquery 选择 http harvesthq github io chosen 使用 vue 问题是这个插件隐藏了我应用的实际选择v model 所以当我选择一个值时 vue 不会将其识别为选择更改事件 并且模型值不会更新 当我
  • Nuxt JS 插件是否可以只运行一次?

    我有几个 VueX 操作 仅在服务器上运行 并从nuxtServerInit 它们向外部服务发出 HTTP 请求 这会减慢 TTFB 的速度 我想实现一个缓存插件 可以从 Redis 存储和检索值 目的是避免在每个请求的操作中发出 HTTP
  • Vuejs2 Modal 与 vue-router 中的路线

    我正在尝试使用模态创建一条路由 当您使用路由器链接访问此路由器路径时 会在当前页面上方显示一个模态 或者如果我直接从 url 访问 则会出现上面带有模态的索引 例如 我在http localhost 个人资料 1 http localhos
  • 每次页面重新启动时,Firebase.auth().currentUser 都会变为 null

    我正在使用 firebase 身份验证与 vue 应用程序 每次登录用户后重新启动页面时 currentUser 都会变为 null firebase auth signInWithEmailAndPassword this email t
  • Vue模板-渲染HTML特殊字符代码

    如何在我的 Vue 模板中完全渲染 HTML 特殊字符代码 例如我有这个 JSON 数据 id post91 slug null title Breakfast 038 Tea 我怎样才能转换Breakfast 038 Tea to Bre
  • Laravel Vue SPA 与 MPA/SSR

    许多 laravel vue 教程使用 ajax 调用来获取数据 看来 SPA 与 Laravel 是完全隔离的 IE Laravel 只是一个数据 API vue 应用程序也可以简单地托管在第三方外部服务器 例如 AWS S3 上 这是推
  • $vuetify.goTo 不会在 v-card 组件内滚动

    我有一个带有 v 卡的组件 我在卡片标题区域放置了一个简单的按钮 当我单击时 我看到该方法被触发 它显示在控制台中 但是 卡片永远不会滚动 如果我输错了类名 则会收到错误 因此 goTo 似乎会执行某些操作 因为它找不到该类 没有拼写错误
  • 如何使用Vue3中的ref访问父组件中的子组件方法?

    我正在尝试使用 vue3 和 ref 方法访问父组件中的子方法 但它返回一个错误 未捕获的类型错误 addNewPaper value savePaper 不是函数 下面是我的代码 请指导我哪里错了 子组件
  • 如何突出显示 Vuetify 菜单中的所选项目?

    我的侧边栏中有一个菜单 使用 vue router
  • Vue.js 动态图像路径未加载

    我试图在单个文件组件中动态加载图像 但收到错误消息 指出无法找到该模块 我想我正在尝试做同样的事情这个帖子 https stackoverflow com questions 40491506 vue js dynamic images n
  • 如何使用vue.js获取点击时按钮的值

    我在页面上有几个按钮 它们连接到相同的方法webcamSendRequestButton
  • 使用 vue.js 显示 json 结果

    您好 我尝试使用 vue js 显示 json 文件结果 目标是结果将显示在值上 这是我的代码 data return fetchData function var self this self http get api casetotal
  • 如何仅在某些页面上显示验证码图标(VUE reCAPTCHA-v3)?

    我使用这个包 https www npmjs com package vue recaptcha v3 https www npmjs com package vue recaptcha v3 我添加了我的 main js import V
  • Vue js - 在同一级别的两个组件内传递数据

    我有需要从一个传递的数据component1到另一个component2 我不使用vuex or router 组件树 Parent Component1 Component2 从一开始component1我发出 ajax 请求 检索信息并
  • 如何将 Jitsi Meet 添加到 Vuejs

    我已在 public html 的正文中加载了 jitsi meet 脚本 并且我有一个组件 如下所示
  • Vuetify 自动完成类似项目未显示

    我的本地案例中有类似标题的自定义帖子API我尝试通过搜索查询显示帖子items array Data count 5 entries id 3 title Senior developer Python id 4 title Senior
  • 在渲染组件之前从 api 获取数据

    我在渲染页面之前发送 2 个 api 请求 const Profile template profile attributes null photos data function return attributes Profile attr

随机推荐

  • bash: scp: 未找到命令 lost connection

    通过ssh免密通道上传备份时报错 bash scp 未找到命令 lost connection 解决 分别查看发送端服务器 接收端服务器 1 查找命令是否存在 whereis scp 不存在就重新安装 yum install openssh
  • PyQt5实现父窗口内点击按钮显示子窗口(窗口嵌套功能)

    摘要 在软件中 常会有点击某个按钮 显示一个新的子界面的需求 本文介绍如何在PyQt5中实现这一功能 主要涉及知识点是 信号与槽函数的自动绑定 程序说明 1 开发环境 win10系统 pycharm2021 python3 7 2 实现功能
  • RGBLCD显示实验————复习到这

    目录 LCD 和eLCDIF 简介 LCD 简介 eLCDIF 接口 硬件原理分析 实验程序编写 编译下载验证 编写Makefile 和链接脚本 编译下载 LCD 液晶屏是常用到的外设 通过LCD 可以显示绚丽的图形 界面等 提高人机交互的
  • 图书管理系统 ——mysql数据库

    java图形化 图书管理系统 使用mysql数据库 此博客是本人一次Java实验课作业 1 管理员操作 能够实现图书的增 删 改 查操作 2 普通注册用户操作 1 借阅图书 借阅成功后 对应图书在馆数量相应减1 2 归还图书 归还成功后 对
  • Flutter 自定义steps(横向步骤条,纵向步骤条)

    近期做flutter开发 实现一个自定义进度条功能 直接上代码 import package flutter material dart import package flutter screenutil flutter screenuti
  • C++之大数相乘

    1 问题描述 两个大数相乘 输入是两个字符串 如 99 99 实现两个数的相乘 返回结果也是一个字符串 结果是 9801 因为是C 所以使用string 输入描述 输入两个字符串 输出描述 输出为一行 2 代码 分析在代码中 include
  • qt学习笔记4:QMainWindow 菜单栏、工具栏、状态栏、铆接部件、

    在创建基类的时候 有三大选择 一个是QWidge 空窗口 另一个就是QMainWindow QMainWindow是一个为用户提供主窗口的类 包含一个菜单栏 多个工具栏 多个链接部件 一个状态栏以及一个中心部件 是许多应用程序的基础 如文本
  • 深度学习实战之车牌识别项目

    车牌识别项目 不经常上线 既然有人想要代码 现在我将它发出来 不过需要你们下载 具体下载方法 我想你们都懂得 https download csdn net download weixin 43648821 11423543 本博客关于深度
  • 为什么MySql喜欢B+树

    目录 怎样的索引的数据结构是好的 什么是二分查找 什么是二分查找树 什么是自平衡二叉树 什么是 B 树 什么是 B 树 1 单点查询 2 插入和删除效率 3 范围查询 MySQL 中的 B 树 总结 参考文献 为什么 MySQL 采用 B
  • filter、map函数的区别

    1 def even num 2 if num 2 0 3 return True 4 return False 5 lis 1 2 3 4 5 6 7 8 9 6 res filter even lis 7 print filter li
  • 华为申请注册盘古大模型商标;京东推出言犀大模型,率先布局产业应用

    7月14日科技新闻早知道 一分钟速览 1 华为申请注册盘古大模型商标 据天眼查 App 显示 7 月 7 日 华为技术有限公司申请注册 华为云盘古 Huawei Cloud Pangu Models 文字及图形商标 国际分类为网站服务 社会
  • 未知的生成错误“因为没有预加载,所以无法解析程序集“System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f1

    搜索System Drawing dll 添加到工程中
  • EVE上传Dynamips、IOL和QEMU镜像

    1 镜像保存目录 opt unetlab addons dynamips Dynamips镜像保存目录 iol IOL镜像保存目录 运行IOU的镜像 qemu QEMU镜像 运行ASAv ISE F5等等镜像 2 上传dynamips镜像
  • 机器学习实战笔记(Python实现)-02-k近邻算法(kNN)

    k近邻算法 kNN 本博客来源于CSDN http blog csdn net niuwei22007 article details 49703719 本博客源代码下载地址 CSDN免费下载 GitHub下载地址 均带有详细注释和测试数据
  • C语言 指针

    1 变量的地址 变量对应内存中的一段存储空间 该段存储空间占用一定的字节数 可能是 1个字节 也可能是 4 或是 8 个字节 用这段存储空间的第一个字节的地址表示变量的地址 即低位字节的地址 变量的地址 可以通过 Reference 引用运
  • Linux内核-中断知识汇总(重温)

    1 概述 中断控制是计算机发展中一种重要的技术 最初它是为克服对I O接口控制采用程序查询所带来的处理器低效率而产生的 中断控制的主要优点是只有在I O需要服务时才能得到处理器的响应 而不需要处理器不断地进行查询 由此 最初的中断全部是对外
  • 整理了几个100%会踩的Python细节坑,提前防止脑血栓

    B站 公众号 啥都会一点的研究生 哈喽我是啥都生 本期整理了几个极易忽视的Python细节 提前了解 帮你大幅缩短debug时间 case 1 给你三秒钟 告诉我这段程序的结果 case1 9 8 7 3 2 2 case1 case1 a
  • Base64的Woff2字体信息如何转成成文件

    这里是借助在线的Base64和字体文件转换网站来完成的 首先用到的是https base64 guru converter 将Base64的字符串的 base64 后的部分拷贝到右侧Base64文本区 然后点击Decode Base64 t
  • JetBrains IDE2022全新UI偷跑版本-windows11

    文章目录 前言 1 双击shift 输入registry 切换到Actions选项卡 点击进入注册表 2 勾选ide expermental 相关选项 点击close重启idea 3 重启后进入setting gt Edirot gt Co
  • Vue生命周期与性能优化

    生命周期 beforeCreate 在 Vue 实例初始化之后 数据观测 data observer 之前被调用 created 实例已创建完成之后被调用 在这一步 实例已完成这几个配置 数据观测 属性和方法的运算 watch event