Vue3.0中的响应式原理(第九课)

简介: Vue3.0中的响应式原理(第九课)

第一部分:观察下面的运行图片

 

 

 

第二部分 先给出结论。

vue2.x的响应式:

实现原理:


对象类型:通过Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。


数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。

Object.defineProperty(data, 'count', {
    get () {}, 
    set () {}
})

存在问题:


新增属性、删除属性, 界面不会更新。


直接通过下标修改数组, 界面不会自动更新。


Vue3.0的响应式:

实现原理:


通过Proxy(代理): 拦截对象中任意属性的变化, 包括:属性值的读写、属性的添加、属性的删除等。


通过Reflect(反射): 对源对象的属性进行操作。


MDN文档中描述的Proxy与Reflect:


Proxy:Proxy - JavaScript | MDN


Reflect:Reflect - JavaScript | MDN

new Proxy(data, {
    // 拦截读取属性值
    get (target, prop) {
        return Reflect.get(target, prop)
    },
    // 拦截设置属性值或添加新属性
    set (target, prop, value) {
        return Reflect.set(target, prop, value)
    },
    // 拦截删除属性
    deleteProperty (target, prop) {
        return Reflect.deleteProperty(target, prop)
    }
})
proxy.name = 'tom'   

第三步部分 谈一下 Vue2.0的原理到Vue3.0原理的过程:

在这里采用了ES6语法的新的特性

 let people = {
   names: "我是Vue2的数据内容",
   age: 23,
   height: 190,
   weight: 45,
 }
 // 模拟Vue2响应式原理
 let po = {}
 Object.defineProperty(po,'names',{
   get() {
     // 有人读取name时候调用数据
     return people.names
   },
   set(Value) {
     // 有人修改name时调用的数据
     console.log('有人修改name时调用的数据,我发现了数据,我要去更新页面了')
     people.names = Value
   }
 })
 Object.defineProperty(po, 'age', {
   get() {
     // 有人读取name时候调用数据
     return people.age
   },
   set(Value) {
     // 有人修改name时调用的数据
     console.log('有人修改age时调用的数据,我发现了数据,我要去更新页面了')
     people.age = Value
   }
 })

这张图解释了上面的代码情况内容

在Vue2中发现的问题==>在Vue3中得到了解决

存在问题:

  • 新增属性、删除属性, 界面不会更新。
  • 直接通过下标修改数组, 界面不会自动更新。

第四部分  Vue3的响应式原理的开场白  第一个对象  Proxy代理对象

<script>
  let person = {
    id: "100908",
    name: "我是Vue3响应式原理",
    age: 23,
    height: "189",
  }
  // 内置函数    window.Proxy  代理的对象 
  const p = new Proxy(person, {
    // 有人读取了p}身上的某个属性被调用
    get(target, proName) {
      console.log(`有人读取了${proName}身上的某个属性`)
      console.log(target + "__" + proName)
      return target[proName]
    },
    // 有人修改了p 或者给p 追加  身上的某个属性被调用
    set(target, proName, Value) {
      console.log(`有人修改了身上的${proName}我要去更新界面了!`)
      // console.log(target,proName,Value)
      target[proName] = Value
    },
    // 有人删除了p 身上的某个属性被调用
    deleteProperty(target, proName) {
      console.log(`有人删除了身上的${proName}我要去更新界面了!`)
      return delete target[proName]
    },
  })
</script>

Vue3的响应式原理的开场白  第一个对象  Proxy代理对象

第五部分  Vue3的响应式原理的开场白 第二个对象  Reflect 对象

 <script>
     // window.Reflect 对象
     // Reflect.get(obj,'a') 找到a的值
     let obj = { a: 1, b: 2 }
     // 通过object
     // Object.defineProperty(obj, 'c', {
         // get() {
             // return 4
         // }
     // })
     // Object.defineProperty(obj, 'c', {
         // get() {
             // return 6
         // }
     // })
   const xf=  Reflect.defineProperty(obj, 'c', {
         get() {
             return 4
         }
     })
     console.log(xf)
    const xf1= Reflect.defineProperty(obj, 'c', {
         get() {
             return 6
         }
     })
     if(xf1){
         console.log("某某操作的内容成功了")
     }else{
         console.log("某某操作的内容失败了")
     }
     console.log(xf1)
 </script>

Vue3的响应式原理的开场白 第二个对象  Reflect 对象

第六部分  Vue响应原理的本质 是第四部分和第五部分的组合体

  1. 通过Proxy(代理): 拦截对象中任意属性的变化, 包括:属性值的读写、属性的添加、属性的删除等。
  2. 通过Reflect(反射): 对源对象的属性进行操作。
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <h1>Vue3响应式原理的本质</h1>
  <script>
    let person = {id: "100908",name: "我是Vue3响应式原理",age: 23,height: "189",}
    // 内置函数    window.Proxy  代理的对象 
    const p = new Proxy(person, {
      // 有人读取了p}身上的某个属性被调用 Reflect. 反射对象
      get(target, proName) {
        console.log(`有人读取了${proName}身上的某个属性`)
        console.log(target + "__" + proName)
        return Reflect.get(target,proName)
      },
      // 有人修改了p 或者给p 追加  身上的某个属性被调用
      set(target, proName, Value) {
        console.log(`有人修改了身上的${proName}我要去更新界面了!`)
        // console.log(target,proName,Value)
       return Reflect.set(target,proName,Value)
      },
      // 有人删除了p 身上的某个属性被调用
      deleteProperty(target, proName) {
        console.log(`有人删除了身上的${proName}我要去更新界面了!`)
        return Reflect.deleteProperty(target,proName)
      },
    })
  </script>
</body>
</html>
相关文章
|
2月前
|
JavaScript 前端开发 Serverless
Vue.js的介绍、原理、用法、经典案例代码以及注意事项
Vue.js的介绍、原理、用法、经典案例代码以及注意事项
85 2
|
4天前
|
JavaScript 算法 编译器
vue3 原理 实现方案
【8月更文挑战第15天】vue3 原理 实现方案
16 1
|
1月前
|
JavaScript
Vue中ref创建_基本类型的响应式数据,在Vue2的年代,数据配在data里,Vue3的区别是不把响应数据写在data里,那个数据是响应式的用ref包一下,let name = ref(“张三“)
Vue中ref创建_基本类型的响应式数据,在Vue2的年代,数据配在data里,Vue3的区别是不把响应数据写在data里,那个数据是响应式的用ref包一下,let name = ref(“张三“)
|
4天前
|
JavaScript API
Vue学习之--------列表排序(ffilter、sort、indexOf方法的使用)、Vue检测数据变化的原理(2022/7/15)
这篇博客文章讲解了Vue中列表排序的方法,使用`filter`、`sort`和`indexOf`等数组方法进行数据的过滤和排序,并探讨了Vue检测数据变化的原理,包括Vue如何通过setter和数组方法来实现数据的响应式更新。
Vue学习之--------列表排序(ffilter、sort、indexOf方法的使用)、Vue检测数据变化的原理(2022/7/15)
|
4天前
|
JavaScript
Vue学习之--------列表渲染、v-for中key的原理、列表过滤的实现(2022/7/13)
这篇博客文章详细介绍了Vue中列表渲染的基础知识、`v-for`指令的使用、`key`的原理和列表过滤的实现。通过代码实例和测试效果,展示了如何遍历数组和对象、使用`key`属性优化渲染性能,以及如何实现列表的动态过滤功能。
Vue学习之--------列表渲染、v-for中key的原理、列表过滤的实现(2022/7/13)
|
9天前
|
JavaScript 前端开发 算法
vue底层原理实现方案
【8月更文挑战第10天】vue底层原理实现方案
25 2
|
11天前
|
存储 JavaScript 前端开发
响应式的 switchboard:让又大又慢的Vue/AIpine 页面爆快
响应式的 switchboard:让又大又慢的Vue/AIpine 页面爆快
|
2月前
|
JavaScript 前端开发 程序员
探索Vue.js宝库:解锁基础知识与实用技能之门(1. 数据绑定与响应式 2. 条件与循环 3. 组件化开发;1. 路由管理与导航 2. 状态管理与Vuex 3. Vue.js的生命周期)
探索Vue.js宝库:解锁基础知识与实用技能之门(1. 数据绑定与响应式 2. 条件与循环 3. 组件化开发;1. 路由管理与导航 2. 状态管理与Vuex 3. Vue.js的生命周期)
31 1
|
2月前
|
JavaScript 前端开发 API
什么是响应式❓Vue2/Vue3中响应式的原理
什么是响应式❓Vue2/Vue3中响应式的原理
35 2
|
2月前
|
存储 JavaScript API
Vue状态管理深度剖析:Vuex vs Pinia —— 从原理到实践的全面对比
Vue状态管理深度剖析:Vuex vs Pinia —— 从原理到实践的全面对比
120 2