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>
相关文章
|
6天前
|
移动开发 JavaScript API
Vue Router 核心原理
Vue Router 是 Vue.js 的官方路由管理器,用于实现单页面应用(SPA)的路由功能。其核心原理包括路由配置、监听浏览器事件和组件渲染等。通过定义路径与组件的映射关系,Vue Router 将用户访问的路径与对应的组件关联,支持哈希和历史模式监听 URL 变化,确保页面导航时正确渲染组件。
|
3月前
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
70 18
|
3月前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
117 17
|
3月前
|
JavaScript 前端开发 API
介绍一下Vue中的响应式原理
介绍一下Vue中的响应式原理
58 1
|
3月前
|
监控 JavaScript 算法
深度剖析 Vue.js 响应式原理:从数据劫持到视图更新的全流程详解
本文深入解析Vue.js的响应式机制,从数据劫持到视图更新的全过程,详细讲解了其实现原理和运作流程。
|
3月前
|
JavaScript
Vue 双向数据绑定原理
Vue的双向数据绑定通过其核心的响应式系统实现,主要由Observer、Compiler和Watcher三个部分组成。Observer负责观察数据对象的所有属性,将其转换为getter和setter;Compiler解析模板指令,初始化视图并订阅数据变化;Watcher作为连接Observer和Compiler的桥梁,当数据变化时触发相应的更新操作。这种机制确保了数据模型与视图之间的自动同步。
|
3月前
|
缓存 JavaScript 搜索推荐
Vue SSR(服务端渲染)预渲染的工作原理
【10月更文挑战第23天】Vue SSR 预渲染通过一系列复杂的步骤和机制,实现了在服务器端生成静态 HTML 页面的目标。它为提升 Vue 应用的性能、SEO 效果以及用户体验提供了有力的支持。随着技术的不断发展,Vue SSR 预渲染技术也将不断完善和创新,以适应不断变化的互联网环境和用户需求。
117 9
|
5月前
|
缓存 JavaScript 前端开发
「offer来了」从基础到进阶原理,从vue2到vue3,48个知识点保姆级带你巩固vuejs知识体系
该文章全面覆盖了Vue.js从基础知识到进阶原理的48个核心知识点,包括Vue CLI项目结构、组件生命周期、响应式原理、Composition API的使用等内容,并针对Vue 2与Vue 3的不同特性进行了详细对比与讲解。
120 13
「offer来了」从基础到进阶原理,从vue2到vue3,48个知识点保姆级带你巩固vuejs知识体系
|
4月前
|
API
vue3知识点:响应式数据的判断
vue3知识点:响应式数据的判断
39 3
|
4月前
|
缓存 JavaScript UED
优化Vue的响应式性能
【10月更文挑战第13天】优化 Vue 的响应式性能是一个持续的过程,需要不断地探索和实践,以适应不断变化的应用需求和性能挑战。
56 2

热门文章

最新文章