设计模式(5): vue 不监听绑定的变量
概述
最近最近做项目的时候总会思考一些大的应用设计模式相关的问题,我把自己的思考记录下来,供以后开发时参考,相信对其他人也有用。
绑定变量
一般情况下,如果我们需要在组件中使用某个变量,会这么使用:
data() {
return {
myData: [],
};
}
如果这个变量是外部变量,例如从外部文件引入的话,就会这么使用:
import { provinces } from '@/util/consts';
export default {
data() {
return {
myData: provices,
};
},
}
问题
但是如果这个变量是一个嵌套层级很深,数据量很大的对象的话,如果按照上面那样使用,vue 就会去遍历这个变量的所有属性,来监听这个变量的变化。非常的消耗性能,一个典型的例子是:
export default {
data() {
return {
bannerBg: null,
};
},
mounted() {
this.loadScript('/js/three.min.js', () => {
this.loadScript('/js/vanta.net.min.js', () => {
this.bannerBg = window.VANTA.NET({
el: '#bannerBg',
color: 0x2197F3,
backgroundColor: 0x071E31,
});
});
});
},
beforeDestroy() {
this.bannerBg.destroy();
},
methods: {
loadScript(path, callback) {
const script = document.createElement('script');
script.src = path;
script.language = 'JavaScript';
script.onload = () => callback();
document.body.appendChild(script);
},
},
}
上面的例子中,我们为了避免内存泄漏,在 beforeDestroy 生命周期里面进行回收,而为了获取回收的变量,我们把它绑定给了 this.bannerBg。
但是事实是,我们并不需要监听 this.bannerBg 这个变量,而这么绑定的结果是,这个 vue 组件在 mounted 的时候需要遍历 this.bannerBg 来增加 vue 的监听属性,非常消耗性能。
解决方案
所以,我们建议不把 bannerBg 放到 data() 里面去监听,而是**直接绑定给 this **就行了。优化后的代码如下:
export default {
mounted() {
this.loadScript('/js/three.min.js', () => {
this.loadScript('/js/vanta.net.min.js', () => {
this.bannerBg = window.VANTA.NET({
el: '#bannerBg',
color: 0x2197F3,
backgroundColor: 0x071E31,
});
});
});
},
beforeDestroy() {
this.bannerBg.destroy();
},
methods: {
loadScript(path, callback) {
const script = document.createElement('script');
script.src = path;
script.language = 'JavaScript';
script.onload = () => callback();
document.body.appendChild(script);
},
},
}
如果这个变量不是过程中生成的,而是初始化的时候生成的,我们建议在 data() 方法里面这么做:
import { provinces } from '@/util/consts';
export default {
data() {
this.myData = provices;
return {
// 移到上面去了
// myData: provices,
};
},
}
设计模式(5): vue 不监听绑定的变量的更多相关文章
- vue时时监听input输入框中 输入内容 写法
Vue input 监听 使用 v-on:input="change" 实现即可 App.vue <template> <div> <md-field ...
- Vue 事件监听实现导航栏吸顶效果(页面滚动后定位)
Vue 事件监听实现导航栏吸顶效果(页面滚动后定位) Howie126313 关注 2017.11.19 15:05* 字数 100 阅读 3154评论 0喜欢 0 所说的吸顶效果就是在页面没有滑动之 ...
- 详解Vue 如何监听Array的变化
详解Vue 如何监听Array的变化:https://www.jb51.net/article/162584.htm
- 9.Vue.js 监听属性
本章节,我们将为大家介绍 Vue.js 监听属性 watch,我们可以通过 watch 来响应数据的变化. 以下实例通过使用 watch 实现计数器: <div id = "app&q ...
- Vue -- 数据监听
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 关于vue事件监听的一个问题
由于新工作需要用vue,所以最近接触最多的也是vue,因为之前一直在用react,所以对于vue上手还是很快的.我也尽量找一些他们两个的异同点,除了多了一些辅助用的方法以外,最大的不同应该是对于组件间 ...
- vue事件监听机制
vue事件是同步的.如果绑定了事件(组件标签上绑定事件) 组件的事件触发 组件调用时绑定事件 之后监听事件: $emit 抛出后活等着 $on ,如果监听到了则阻塞执行: 如果为监听到或者未绑定,则会 ...
- vue watch监听不到对象,探究 watch 原理
最近使用vue watch时,在某些模块监听不到对象的改变,无法触发回调函数. 解决: 使用watch监听对象时,只能监听到该对象初始化时已存在的key值. 如下例监听user对象,在初始化时没有ag ...
- vue.js 监听属性的学习/ 千米、米的转换 /时、分、秒 的转换
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
随机推荐
- java 并发编程lock使用详解
浅谈Synchronized: synchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其 ...
- module.exports exports npm --save
CommonJS模块规范和ES6模块规范完全是两种不同的概念 Node应用由模块组成,采用CommonJS模块规范 var x = 5; var addX = function (value) { r ...
- 【Java】 Java常用的几个设计模式实例
一.单例模式 public class SingletonDemo { public static void main(String[] args) { // } } class User1{//饿汉 ...
- 对应关系,以及Module作用
register 8101---10086 gateway 8201---10010 item-service 8301---8081 manage-web 4901---9001 npm start ...
- Ajax跳入error的原因
1. dataType错误 我遇到的就是这个dataType错误,即后台返回的dataType类型与前台写的不一致,一般前台写json没问题,大部分是后台返回的类型对不上 2. async请求同步异步 ...
- ansible 的file 模块
创建.修改.删除文件或者目录: file模块 file模块常用的几个参数:state.path.src.dest.mode.owner.group.name.recurse state后面跟的参数: ...
- centos7安装部署jumpserver
一.系统环境准备1.查看系统版本 # cat /etc/redhat-release // 查看系统版本 CentOS Linux release (Core) # uname -a // 查看系统信 ...
- libev个人问题解惑
我们的游戏后端一直以来用的都是libev,之前尝试过去读源码,因为里面用了大量宏和自己也不够耐心的原因,一直没有看懂.这次终于痛下决心,一定要啃下它,于是在这个星期调整自己的工作学习方式(在读源码的过 ...
- 【转】ubuntu或linux网卡配置/etc/network/interfaces
转自:https://www.cnblogs.com/qiuxiangmuyu/p/6343841.html 青蛙准备写一个系列文章,介绍一些Debian/Ubuntu里面常用的配置文件.当然,Lin ...
- [SCOI2016]幸运数字(线性基,倍增)
[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作 ...