computed用发_Vue的computed和watch的细节全面分析

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

watch:{

first.second:function(newVal,oldVal){

console.log(newVal,oldVal);

}

},

方法二:watch如果想要监听对象的单个属性的变化,必须用computed作为中间件转化,因为computed可以取到对应的属性值

data(){

return{

‘first’:{

second:0

}

}

},

computed:{

secondChange(){

return this.first.second

}

},

watch:{

secondChange(){

console.log(‘second属性值变化了’)

}

},

3 computed和watch的区别

3.1 computed特性

1.是计算值,

2.应用:就是简化tempalte里面{{}}计算和处理props或$emit的传值

3.具有缓存性,页面重新渲染值不变化,计算属性会立即返回之前的计算结果,而不必再次执行函数

3.2 watch特性

1.是观察的动作,

2.应用:监听props,$emit或本组件的值执行异步操作

3.无缓存性,页面重新渲染时值不变化也会执行

3 props传值

3.1 常见错误1

传入的值想作为局部变量来使用,直接使用会

props:[‘listShop’],

data(){

return{}

},

created(){

this.listShop=30

}

报错

这个错误是说的避免直接修改父组件传入的值,因为会改变父组件的值,贴上官网介绍

3.2 解决方案1

简单数据类型解决方案:

所以可以在data中重新定义一个变量,改变指向,但是也只是针对简单数据类型,因为复杂数据类型栈存贮的是指针,

props:[‘listShop’],

data(){

return{

listShopChild:this.listShop

}

},

created(){

this.listShopChild=30

}

这样就可以愉快的更改传入的简单数据类型的数据啦!不会有任何报错,也不会影响父组件!

3.4 存在的问题

复杂数据类型在栈中存贮的是指针,所以赋值给新的变量也会改变原始的变量值.那么应该咋整呢?

1.可以手动深度克隆一个复杂的数据出来,循环或者递归都行

数组深度克隆:

var x = [1,2,3];

var y = [];

for (var i = 0; i < x.length; i++) {

y[i]=x[i];

}

console.log(y); //[1,2,3]

y.push(4);

console.log(y); //[1,2,3,4]

console.log(x); //[1,2,3]

对象深度克隆:

var x = {a:1,b:2};

var y = {};

for(var i in x){

y[i] = x[i];

}

console.log(y); //Object {a: 1, b: 2}

y.c = 3;

console.log(y); //Object {a: 1, b: 2, c: 3}

console.log(x); //Object {a: 1, b: 2}

函数深度克隆

var x = function(){console.log(1);};

var y = x;

y = function(){console.log(2);};

x(); //1

y(); //2

为什么函数可以直接赋值克隆?

由于函数对象克隆之后的对象会单独复制一次并存储实际数据,因此并不会影响克隆之前的对象。所以采用简单的复制“=”即可完成克隆。

2.Object.assign

只会对只是一级属性复制,比浅拷贝多深拷贝了一层而已,所以还是无法达到深度克隆的目的.

详请请戳

3.强大的JSON.stringify和JSON.parse

const obj1 = JSON.parse(JSON.stringify(obj));

这是ES5新出来的API,先将对象转化为字符串,就是简单数据类型赋值,再用JSON.parse转化

3.5 解决方案2

直接用computed改变

computed:{

listShopChild(){

return this.listShop

}

}

3.5 存在的问题

注意:此时用computed时,如果是数组this.$set(arr,1,true)对应的值耶不更新,

这个很坑,这个bug我找个很久

如果传入的值只是在data定义,并未在methods或生命周期钩子更改,直接改变也会报错

所以还是可以先用局部变量接收,再修改,这个坑比较多

4 应用

4.1 应用1

监听本组件计算和监听

4.2 应用2

计算或监听父传子的props值

4.3 应用3

分为简单数据类型和复杂数据类型监听,监听方法如上watch的使用

4.4 应用4

监听vuex的state或者getters值的变化

computed:{

stateDemo(){

return this.$store.state.demoState;

}

}

watch:{

stateDemo(){

console.log(‘vuex变化啦’)

}

}

  1. computed和watch的原理分析

很开心小伙伴们能看到这里,接下来给大家简单罗列下他们的原理!

5.1 computed的原理

5.2 watch的原理

分为三个过程:实例化Vue、调用$watch方法、属性变化,触发回调

Vue的数据依赖实现原理简析

vue中$watch源码阅读笔记

6 简单实现computed和watch

公共类

function defineReactive(data, key, val, fn) {

let subs = [] // 新增

Object.defineProperty(data, key, {

configurable: true,

enumerable: true,

get: function() {

// 新增

if (data.$target) {

subs.push(data.$target)

}

return val

},

set: function(newVal) {

if (newVal === val) return

fn && fn(newVal)

// 新增

if (subs.length) {

// 用 setTimeout 因为此时 this.data 还没更新

setTimeout(() => {

subs.forEach(sub => sub())

}, 0)

}

val = newVal

},

})

}

6.1 computed实现

function computed(ctx, obj) {

let keys = Object.keys(obj)

let dataKeys = Object.keys(ctx.data)

dataKeys.forEach(dataKey => {

defineReactive(ctx.data, dataKey, ctx.data[dataKey])

})

let firstComputedObj = keys.reduce((prev, next) => {

ctx.data.$target = function() {

ctx.setData({ [next]: obj[next].call(ctx) })

}

prev[next] = obj[next].call(ctx)

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

mputedObj = keys.reduce((prev, next) => {

ctx.data.$target = function() {

ctx.setData({ [next]: obj[next].call(ctx) })

}

prev[next] = obj[next].call(ctx)

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
[外链图片转存中…(img-LGj7Z49W-1715864718419)]
[外链图片转存中…(img-WziLvuLC-1715864718419)]

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值