Vue3 新增和删除属性

Vue3 新增和删除属性

Vue3的响应式实现方式,
1、ref,把值类型的对象变为响应式
2、reactive,把对象类型,数组 变为响应式
把对象配置成响应式的,可以直接修改。兵被vue捕获变更,进而自动刷新界面

<script setup>
import {ref, reactive }from 'vue'

const count = ref(0)

let person = reactive({
  name: '张三',
  age: 18,
  job: {
    type: '程序员',
    salary: '30k'
  }
  hobby:['游泳','跑步','爬山']
})

function changeInfo(){
  person.name = "李四",
  person.age = 20,
  person.job.type = "架构师",
  person.job.salary = '50k',
  person.hobby[0] = '打球'
}

function addSex() {
  person.sex = '男'
}

functon deleteAge(){
  delete person.age
}

</scritp>

Vue2实现响应式的原理

<script>
let person = {
  name:"张三",
  age: 19
}
//模拟Vue2的响应式
let p = {}
Object.defineProperty(p, 'name', {
  configurable:true //可配置才能删除 p的属性
  get(){//读取name时调用
    return person.name
  },
  set(value){//有人修改name时调用
    console.log("有人修改name属性")
    person.name = value
  }
})

Object.defineProperty(p, 'age', {
  get(){//读取age时调用
    return person.age
  },
  set(value){//有人修改age时调用
    console.log("有人修改age属性")//把这句话替换为很复杂的更新界面的逻辑
    person.age= value
  }
})

</script>

Vue3 实现响应式

Proxy 是window上的对象
Proxy (target, Handler, IsRevoked)

<script>
let person = {
  name: '张三',
  age: 19
}

//模拟Vue3中的响应式
//const 代理对象 = new Proxy(原对象,源对象的属性)
cosnt p = new Proxy(person,{
  //有人读取了p的某个属性
  get(target, propName){
    console.log("有人读取了p身上的属性")
    return target[propName]
  },
  //有人修改或新增了p身上的属性
  set(target, propName, value){
     console.log("有人修改了p身上的属性,要更新界面了")
     target[propName] = value
  },
  //删除了p身上的属性
  delete(target, propName) {
    console.log("有人删除了p身上的属性,要更新界面了")
    return delete target[propName] //把真实删除结果返回,true,false
  }
})
//在控制台
p.sex = '男' //直接给person添加属性成功


</script>

vue3 实现响应式的原理

ES6 的新玩意儿
window.Reflect,window.Proxy,二者结合实现响应式
Reflect.get(p,'name')
Reflect.set(p, 'name', '新名字')
Reflect.delectCopy(a, 'age')

通过Object.defineProperty 重复给一个对象新增属性,会导致真个应用崩掉。。。
Object.defineProperty(p, 'sex', {
  get(){return 1}
})
Object.defineProperty(p, 'sex', {
  get(){return 3}
})

而Reflect 不会崩溃,利于框架的封装,否则用Object.defineProperty要不停的try...catch...
Reflect.defineProperty(p, 'sex', {
  get(){ return 2}
})


cosnt p = new Proxy(person,{
  //有人读取了p的某个属性
  get(target, propName){
    console.log("有人读取了p身上的属性")
    return Reflect.get(target, propName)
  },
  //有人修改或新增了p身上的属性
  set(target, propName, value){
     console.log("有人修改了p身上的属性,要更新界面了")
     Reflect.set(target, propName, value)
  },
  //删除了p身上的属性
  delete(target, propName) {
    console.log("有人删除了p身上的属性,要更新界面了")
    return Reflect.deleteProperty(target, propName) //把真实删除结果返回,true,false
  }
})
posted @ 2022-08-09 23:54  wjwdive  阅读(11594)  评论(0编辑  收藏  举报