敲黑板,划重点!!!Vue3.0响应式实现原理 —— proxy()

简介: 笔记

11.png


1. 先来回顾一下Vue2.0的响应式原理



  • 通过 Object.defineProperty() 实现数据劫持

存在的问题

  • 针对对象:新增属性,删除属性,界面不更新
  • 针对数组:通过下标修改数组,界面不会自动更新
<!DOCTYPE html>
<html>
    <head>
        <title>模拟vue2.0</title>
    </head>
    <body>
        <input type="text" id="username">
        <br>
        显示值:<span id="uName"></span>
        <script>
        var obj = {};
        // 模拟双向数据绑定
        //Object.defineProperty(obj, prop, descriptor)
        //直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
        //obj 要在其上定义属性的对象。
        //prop 要定义或修改的属性的名称。
        //descriptor 将被定义或修改的属性描述符。
        Object.defineProperty(obj,"username",{
          // Value:"Jack",
          get:function(){
            console.log("取值");
          },
          set:function(val){
            console.log("设置值");
            document.getElementById("uName").innerText=val;
          }
        });
        document.getElementById("username").addEventListener("keyup",function(){
          obj.username= event.target.value;
        })
        //在控制台中输入obj.username会自动触发get方法,输入obj.username="aaa"会自动触发set方法
        //此时并没有用事件进行监听,所以修改监听事件里的代码
        </script>
      </body>
</html>

12.png


2. Vue3.0原理实现 —— Proxy()


  • 引用数据类型的增删改查统统在行,非常强大
<!DOCTYPE html>
<html>
    <head>
        <title>vue3响应式</title>
    </head>
    <body>
        <script>
            // type="text/javascript"
            let obj = {
                name: '小明',
                age: 18
            }
            // 1. window内置的
            // window.Proxy() => 代理
            // obj为源数据
            const p = new Proxy(obj, {
                // 这里虽然也是get set 但是要比Object.defin()要聪明一些
                get(target, propName){
                    // target 源数据  // b具体属性
                    // console.log("读取P的属性")   // a, b
                    console.log(`读取P的${propName}属性`)
                    // return target[propName]
                    return Reflect.get(target, propName)
                },
                // 修改+新增都可以捕获
                set(target, propName, value){
                    // console.log("修改了P的属性")
                    console.log(`修改了P的${propName}属性,值为${value}`)
                    // 写到这里 还不是响应式 要去修改obj的值
                    // target[propName] = value
                    return Reflect.set(target, propName, value)
                },
                // 加一个删除
                deleteProperty(target, propName){
                    console.log(`删除了P的${propName}属性`)
                    // return delete target[propName]
                    return Reflect.deleteProperty(target, propName)
                },
            })
        </script>
      </body>
</html>


3. 重点说明 —— Reflect


3.1 Reflect 是用来做什么的?


动态对被代理对象的相应属性进行特定的操作(ES6新增)

看到上面的代码,你会发现每行Reflect代码上面都注释了一行,实际上不用它,用它上面的代码也可以实现响应式

但是Vue3.0 却用的是 Reflect,还是有些深意的

3.2 为什么要用Reflect ?


大家可以自行百度,我这里简单说一下

13.png


简单来说,主要是为了减少源码中的 try catch,如果不使用 Reflect,整个框架需要有大量的 try catch,才能保证在出错的情况下顺利运行,但是源码就会不好维护,看起来不雅观


使用Reflect,即使代码出错,可以在抛出错误的同时,让代码正常运行,保证框架的健壮性!



目录
相关文章
|
24天前
|
JavaScript 前端开发 开发者
Vue.js 框架大揭秘:响应式系统、组件化与路由管理,震撼你的前端世界!
【8月更文挑战第27天】Vue.js是一款备受欢迎的前端JavaScript框架,以简洁、灵活和高效著称。本文将从三个方面深入探讨Vue.js:响应式系统、组件化及路由管理。响应式系统为Vue.js的核心特性,能自动追踪数据变动并更新视图。例如,通过简单示例代码展示其响应式特性:`{{ message }}`,当`message`值改变,页面随之自动更新。此外,Vue.js支持组件化设计,允许将复杂界面拆分为独立且可复用的组件,提高代码可维护性和扩展性。如创建一个包含标题与内容的简单组件,并在其他页面中重复利用。
47 3
|
1月前
|
JavaScript 算法 编译器
vue3 原理 实现方案
【8月更文挑战第15天】vue3 原理 实现方案
30 1
|
23天前
|
JavaScript 开发者
vue学习之响应式数据绑定
响应式数据绑定
26 0
|
17天前
|
存储 JavaScript 前端开发
Vue 3的响应式系统是如何工作的呢
【9月更文挑战第3天】Vue 3的响应式系统是如何工作的呢
22 4
|
17天前
|
缓存 JavaScript API
介绍一下Vue 3的响应式系统
【9月更文挑战第3天】介绍一下Vue 3的响应式系统
33 3
|
18天前
|
缓存 JavaScript 容器
vue动态组件化原理
【9月更文挑战第2天】vue动态组件化原理
30 2
|
23天前
|
缓存 JavaScript 前端开发
[译] Vue.js 内部原理浅析
[译] Vue.js 内部原理浅析
|
1月前
|
JavaScript 前端开发 开发者
Vue学习之--------深入理解Vuex、原理详解、实战应用(2022/9/1)
这篇文章详细介绍了Vuex的基本概念、使用场景、安装配置、基本用法、实际应用案例以及注意事项,通过一个数字累加器的实战示例,帮助开发者深入理解Vuex的原理和应用。
|
1月前
|
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)
|
1月前
|
JavaScript
Vue学习之--------列表渲染、v-for中key的原理、列表过滤的实现(2022/7/13)
这篇博客文章详细介绍了Vue中列表渲染的基础知识、`v-for`指令的使用、`key`的原理和列表过滤的实现。通过代码实例和测试效果,展示了如何遍历数组和对象、使用`key`属性优化渲染性能,以及如何实现列表的动态过滤功能。
Vue学习之--------列表渲染、v-for中key的原理、列表过滤的实现(2022/7/13)