XingYun blog
  • JS基础

    • 图解js原型链
    • JS Event Loop
    • 对象的底层数据结构
    • 让你的JavaScript代码简单又高效
    • 函数参数按值传递
    • 判断数据类型
    • 浮点数精度问题和解决办法
    • 常用方法snippet
    • 实现Promise
    • 防抖和节流
    • 巧用sort排序
  • CSS && HTML

    • CSS也需要性能优化
    • class命名规范
    • em、px、rem、vh、vw 区别
    • CSS揭秘阅读笔记
  • 浏览器

    • 浏览器是如何渲染页面的
    • 重排和重绘
    • BOM浏览器对象模型
    • DOM事件
    • 浏览器存储
  • 数据结构

    • JS实现链表
    • JS实现栈与栈应用
    • JS实现常见排序
    • 哈夫曼编码
    • MD5算法
  • vue原理浅析

    • Vue虚拟dom与Diff算法
    • 前端打包文件的缓存机制
    • vue数组为什么不是响应式
    • v-for为什么不能用index做key
  • 前端工程化

    • 浏览器是如何渲染页面的
    • 前端打包需要gzip压缩吗
    • 前端打包文件的缓存机制
    • webpack loader和plugin
  • 轮子&&组件库

    • 实现水波浪进度球
  • 文字转语音mp3文件
  • 文件上传前后端实现
  • moment.js给定时间获取自然月、周的时间轴
  • 实现文件上传功能
  • 批量下载照片
  • leaflet改变坐标原点
  • 网络

    • 有了MAC地址 为什么还需要IP地址
    • 为什么IP地址老是变
    • 我们为什么需要IPV6
    • TCP与UDP
  • 计算机组成原理

    • ASCII、Unicode、UTF-8和UTF-16
  • VSCode

    • VSCode图片预览插件 Image preview
    • rsync:linux间的高效传输工具

XingYun

冲!
  • JS基础

    • 图解js原型链
    • JS Event Loop
    • 对象的底层数据结构
    • 让你的JavaScript代码简单又高效
    • 函数参数按值传递
    • 判断数据类型
    • 浮点数精度问题和解决办法
    • 常用方法snippet
    • 实现Promise
    • 防抖和节流
    • 巧用sort排序
  • CSS && HTML

    • CSS也需要性能优化
    • class命名规范
    • em、px、rem、vh、vw 区别
    • CSS揭秘阅读笔记
  • 浏览器

    • 浏览器是如何渲染页面的
    • 重排和重绘
    • BOM浏览器对象模型
    • DOM事件
    • 浏览器存储
  • 数据结构

    • JS实现链表
    • JS实现栈与栈应用
    • JS实现常见排序
    • 哈夫曼编码
    • MD5算法
  • vue原理浅析

    • Vue虚拟dom与Diff算法
    • 前端打包文件的缓存机制
    • vue数组为什么不是响应式
    • v-for为什么不能用index做key
  • 前端工程化

    • 浏览器是如何渲染页面的
    • 前端打包需要gzip压缩吗
    • 前端打包文件的缓存机制
    • webpack loader和plugin
  • 轮子&&组件库

    • 实现水波浪进度球
  • 文字转语音mp3文件
  • 文件上传前后端实现
  • moment.js给定时间获取自然月、周的时间轴
  • 实现文件上传功能
  • 批量下载照片
  • leaflet改变坐标原点
  • 网络

    • 有了MAC地址 为什么还需要IP地址
    • 为什么IP地址老是变
    • 我们为什么需要IPV6
    • TCP与UDP
  • 计算机组成原理

    • ASCII、Unicode、UTF-8和UTF-16
  • VSCode

    • VSCode图片预览插件 Image preview
    • rsync:linux间的高效传输工具
  • 3个提升Vue性能的写法
    • 修改了项目代码里的三个点
      • 1.监听对象的单个属性
      • 2.处理不需要响应式的数据
      • 3. 利用钩子函数销毁定时器
  • 重读Vue文档
  • moment.js给定时间获取自然月、周的时间轴
  • Vue虚拟dom与Diff算法
  • 深入响应式原理
  • Echart样例
  • 我的Vue指令库
  • 滚动到底部加载更多
  • 实现一键换肤
  • 手写Vue数据劫持
  • vue-router核心原理与手写实现
  • computed和watch
  • vue数组为什么不是响应式
  • v-for为什么不能用index做key
  • webpack loader和plugin
  • keep-alive组件原理
  • vue插槽进化
  • Vue多层嵌套组件
  • vue生命周期hook
  • vue监听dom元素的resize事件
  • 前端打包需要gzip压缩吗
  • 实现水波浪进度球
  • Vue
XingYun
2021-11-12
目录

3个提升Vue性能的写法

# 修改了项目代码里的三个点

  1. 监听对象的单个属性
  2. 处理不需要响应式的数据
  3. 利用钩子函数销毁定时器

# 1.监听对象的单个属性

场景:监听一个person对象,person对象的id发生变化,发起网络请求

一般写法:

watch: {
    // person的任意属性发生改变, 都会触发函数
    'person': function () {
      do something ...
    },
    deep:true
  }
1
2
3
4
5
6
7

优化写法:

watch: {
    // 如果person的id属性发生改变,这个函数就会运行
    // person的其他属性发生改变, 不触发
    'person.id.': function () {
      do something ...
    }
  }
1
2
3
4
5
6
7

# 2.处理不需要响应式的数据

Vue通过Object.defineProperty劫持对象实现响应式,这个过程将耗费一定性能。
特殊处理一些初始化后就不变的数据,让Vue不对它们进行劫持,可以优化性能

一般写法

data: function () {
  return {
  	// 不需要响应式的对象
  	constantObj:{ name:'xixi', age:12, skill:'singing' }
  	constantArr:[...]
  	// 需要响应式的对象
    nomalObj:{ name:'haha', age:24, skill:'skiing' }
  }
}
1
2
3
4
5
6
7
8
9

优化写法1:

data: function () {
	// 不需要响应式的对象
  	this.constantObj = { name:'xixi', age:12, skill:'singing' }
  	this.constantArr = [...]
    return {
  	  // 需要响应式的对象
      nomalObj:{ name:'haha', age:24, skill:'skiing' }
  }
}
1
2
3
4
5
6
7
8
9

优化写法2:

data: function () {
    return {
  	  // 需要响应式的对象
      nomalObj:{ name:'haha', age:24, skill:'skiing' }
      // 不需要响应式的对象
  	  this.constantObj = Object.freeze({ name:'xixi', age:12, skill:'singing' })
  	  this.constantArr = Object.freeze([...])
  }
}

1
2
3
4
5
6
7
8
9
10

Object.freeze() 可以将object的 configurable 属性置为false
Vue 在遇到 configurable 为 false 这样被设置为不可配置之后的对象属性时 不会为对象加上 setter getter 等数据劫持的方法

# 3. 利用钩子函数销毁定时器

场景:时间显示
在这里插入图片描述
一般写法

<template>
  <div v-text="currentTime"></div>
</template>

data: function () {
    return {
  	currentTime: moment().format('HH: mm: ss')
  }
}
created() {
	// 这样写组件销毁了定时器依然在运行
	setInterval(() => {
      this.currentTime = moment().format('HH: mm: ss')
    }, 1000)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

每定义一个计时器,就会在计时器线程的队列里面新加入一个排队的计时器。即使这个你跳转到另外一个页面,这个队列仍然存在。等计时器的一到,就会把这个计时器要执行的内容从队列拿出来开始执行。

优化写法1 :

<template>
  <div v-text="currentTime"></div>
</template>

data: function () {
    return {
    timer:null
  	currentTime: moment().format('HH: mm: ss')
  }
}
created() {
	// 这样写组件销毁了定时器依然在运行
	this.timer = setInterval(() => {
      this.currentTime = moment().format('HH: mm: ss')
    }, 1000)
}
beforeDestory(){
    clearInterval(this.timer);
    this.timer = null;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

优化写法2 :

<template>
  <div v-text="currentTime"></div>
</template>

data: function () {
    return {
  	  currentTime: moment().format('HH: mm: ss')
  }
}
created() {
	this.startTime()
}
methods:{
    startTime(){
      let timer = setInterval(()=>{
       this.currentTime = moment().format('HH: mm: ss')
      },1000);
      // hook函数优化写法清除定时器 相比第一种不用在打他里定义timer,更简洁
      this.$once('hook:beforeDestroy',()=>{
        clearInterval(timer);
        timer = null;
      })
    }
 }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

完

#Vue
上次更新: 2023/04/05, 09:41:10
重读Vue文档

重读Vue文档→

最近更新
01
JavaScript-test
07-20
02
二维码的原理
07-20
03
利用ChatGPT优化代码
07-20
更多文章>
Theme by Vdoing | Copyright © 2021-2023 XingYun | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式