vue computed和watch
程序员布欧 人气:0前言
在基于vue框架的前端项目开发过程中,只要涉及到稍微复杂一点的业务,我们都会用到computed计算属性这个钩子函数,可以用于一些状态的结合处理和缓存的操作。
一、computed基础使用
在computed中,声明一个函数,并需要提供一个返回值,用于在页面展示或者结合其他方法进行处理
结合state状态使用
通过changeName返回一段依赖于name的字符串
<li>computed基本使用</li> <li>name值:{{ name }}</li> <li>{{ changeName }}</li> data() { return { name: "zhangsan", }; }, computed: { changeName: function () { return `一段依赖于name:${this.name}的文字`; }, },
使用其他组件状态
主动触发computed方法,对比不依赖于其他状态下的区别,通过点击事件,主动触发一些操作
<li>{{ isCache }}</li> <li>{{ cacheTip }}</li> <li>{{ changeCache }}</li> <li><button @click="handleChange">修改文字</button></li> data() { return { cacheTip: "cacheTip原始值", }; }, computed: { isCache: function () { return `不依赖于任何属性值的一段文字`; }, changeCache: function () { return `依赖于cacheTip,${this.cacheTip}`; }, }, methods: { handleChange() { this.cacheTip = "cacheTip状态被修改"; }, },
当我们点击修改状态时,可以看到,cacheTip被修改只会,依赖于cacheTip的changeCache也会发生改变
isCache因为不和其他状态关联,所以还是保持原来的值不变
getter VS setter
上面的cacheTip,或者isCache,在computed的通用方法中,默认都是使用了getter方法去获取处理过的值
可以写成:
isCache: { setter:function () { return `不依赖于任何属性值的一段文字`; } }
通过getter和setter,可以进一步对需要处理的状态进行处理
<li>{{ firstName }}</li> <li>{{ lastName }}</li> <li>{{ setterGetter }}</li> <li><button @click="handleChangeFirst">修改文字</button></li> data() { return { firstName: "lewyon001", lastName: "布欧001", }; }, computed: { setterGetter: { // getter get: function (newValue) { console.log("newValue", newValue); return this.firstName + " " + this.lastName; }, // setter set: function (newValue) { console.log("newValue", newValue); this.firstName = `${newValue.firstName}`; this.lastName = `${newValue.lastName}`; }, }, } methods: { handleChangeFirst() { this.setterGetter = { firstName: "lewyon", lastName: "布欧" }; }, },
- get属性可以获取最原始的依赖值并处理,
- set方法,可以获取修改后的依赖值,在修改之后一并展示到页面上或者进行其他业务需要的处理
computed方法的基础,包括进阶的操作,以及setter和getter方法如上
使用建议:
作为经常使用的方法:
- computed可以作为依赖于其他状态的缓存进行使用,包括一些不经常更新的内容,减少开销
- 简单的字符串模板结合其他状态
- 还有其他的场景在开发中,我们都可以进行使用,结合watch等。
二、watch基本使用
watch顾名思义,属于vue2.x版本中,监听和观察组件状态变化的钩子函数,常见的应用场景有监听路由变化,以及父组件传递给子组件的props数据的变化等
在使用watch的时候,需要在data中生命一个状态,并添加到watch当中进行观察,当发生变化时,watch可以通过默认参数获取最新的值的变化
<li>name值:{{ name }}</li> <li>{{ nameTip }}</li> <li>通过异步操作获取的age:{{ age }}</li> <li><button @click="getUser">修改名字</button></li> let p1 = new Promise((resolve, reject) => { resolve({ age: "14" }); }); data() { return { name: "zhangsan", nameTip: "name未改变", }; }, watch: { name(newVal, oldVal) { // watch可以监听一些状态发生更改的时候,做一些处理,修改状态,或者异步操作 this.nameTip = "name状态改变了"; this.getData(); }, }, methods: { getData() { setTimeout(() => { this.getAge(); }, 1000); }, getUser() { this.name = "lisi"; }, getAge() { p1.then((res) => { console.log(res); this.age = res.age; }); }, },
当点击修改的时候,name的值会被修改为lisi,watch监听到name的修改之后,可以修改nameTip的文字,进行出发修改别的状态,
我们也可以通过newVal获取name的最新的值,或者oldVal的值进行一些对比和操作
使用promise和定时器模拟当状态变化的时候,请求后台数据并渲染,这是我们在开发过程中,对watch使用的一个比较典型的例子
immediate和deep
immediate:当watch第一次加载或者首次绑定的时候,需要监听和获取data中的状态,那么就可以使用immediate,设置为true,该属性值为布尔值
deep:watch监听的值为对象的时候,可以使用该属性进行监听对象深层次的属性变化,
注意事项:
deep默认是false,使用的时候,需要自行添加deep:true ,deep和immediate的值一样,是布尔值
实例
<li>{{ immediateNameTip }}</li> data() { return { immediateName: "immediateName原始值", immediateNameTip: "immediateName改变时的提示文字", }; }, immediateName: { handler(newVal, oldVal) { console.log("immediate表示最初监听值得时候,也执行这段代码"); setTimeout(() => { this.immediateNameTip = "immediateName添加immediate,初次绑定也会执行"; }, 2000); }, immediate: true, deep: true, // 只针对对象的深层次属性变化 },
当设置了immediate为true的时候,首次进来immediateNameTip在定时器执行之后,就会发生更改。
deep这里不再举例子,大家可以自己在实战中去使用和学习。
使用建议;
watch可以作为监听路由变化,以及通过异步的方式去获取数据,同时在一些开销比较大的状态监听都有较多的应用场景,还有购物车功能的实现等场景。
加载全部内容