vue3手写api之reactive、readonly、ref

本文介绍了作者在学习Vue3后尝试手写其核心API——reactive、readonly和ref的过程。通过示例代码展示了如何创建响应式对象、只读对象及响应式引用,并提供了测试用例进行演示。通过实践加深了对Vue3内部机制的理解。
摘要由CSDN通过智能技术生成

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~

学习完vue3当然要尝试手写一下内置的一些api来提高自己的熟练度和理解能力了,写的api可能没有源码层层兼顾,但是核心功能算是完成了,具体如下:

首先~~通用测试obj:

var obj = {
  name:'123',
  age:20,
  hobby:{
    name:'运动'
  }
}

reactive

function reactive(obj){
    if(!obj || typeof obj !== 'object'){
      return
    }
    var proxy = new Proxy(obj,{
    get(target,key,value){
      console.log('获取了')
      return Reflect.get(target,key,value)
    },
    set(target,key,value,newVal){
      console.log('修改了')
      return Reflect.set(target,key,value,newVal)
    },
    deleteProperty(target,key,value){
      console.log('删除了')
      return Reflect.deleteProperty(target,key,value)
    }
  })
  return proxy
}
var newObj = reactive(obj)	//绑定响应式后的代理对象

readonly

function readonly(obj){
  if(!obj || typeof obj !== 'object'){
    return obj
  }
  if(Array.isArray(obj)){
    obj.forEach((item,index)=>{
      obj[index] = readonly(item)
    })
  }else{
    for(var key in obj){
      obj[key] = readonly(obj[key])
    }
  }
  return new Proxy(obj,{
    get(target,key,value){
      console.log('获取了')
      return Reflect.get(target,key,value)
    },
    set(){
      console.log('只读,无法修改')
      return
    },
    deleteProperty(){
      console.log('只读,无法删除')
      return
    }
  })
}

var newObj = readonly(obj)		//只支持get的代理对象

ref

function ref(obj){
  this.ref = obj
  function value(val){
    this.ref = val
    console.log('value触发,响应式赋值')
  }
  function get(){
    console.log('get触发')
  }
  return {
    ref:obj,
    value,
    get
  }
}

var a = ref(123);			//ref响应
a.value(456)

不断学习中,有问题麻烦帮忙指出,感谢!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sorryhc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值