当前位置:首页 > 技术分析 > 正文内容

vue3源码之reactive(vue.js源码全方位深入解析)

ruisui883个月前 (02-03)技术分析10

响应式对象reactive

何为响应式对象,在我看来就是一个可以进行拦截的对象,vue2采用的是Object.definePropertyvue3采用的是Proxy

单测

创建
src/reactivity/test/reactive.spec.ts

import {reactive} from '../reactive'
describe("reactive", () => {
  it("happy path", () => {
    const origin = {
      foo: 1
    }
    const obj = reactive(origin)
    expect(obj).not.toBe(origin)
    expect(obj.foo).toBe(1)
  })
})

在vue3里,直接通过一个reactive(obj)函数创建一个proxy对象,返回的对象属性和值都和obj保持一致,但他们属于不同的两个对象。

代码实现

根据上面单测的功能点,我们开始一步步的来实现我们的reactive函数。

创建
./src/reactivity/reative.ts
文件

1、导出一个reactive函数,接收用户传入的object数据。

export function reactive (raw) {
  // write at this
}

2、返回一个Proxy实例

Proxy接收2个参数,第一个是需要劫持的object,第二个参数是一个options,这里我们只用设置getset

export function reactive (raw) {
  return new Proxy(raw, {
    get (target, key) {},
    set (target, key, value) {}
  })
}

3、处理get请求

当获取这个响应式对象的某个属性时调用,target就是获取的objectkey就是获取的对象属性名称。

例如:obj.name,target代表obj,而key则代表name

提示:这里的Reflect.get(target, key)其实就是获取target对象的key属性的值,最后在get中返回这个值即可。

get (target, key) {
  const res = Reflect.get(target, key)
  return res
}

4、处理set赋值

当执行了赋值操作时会调用set方法,target是操作的对象,key是操作对象的属性名称,value是赋值。

Reflect.set(target, key, value)即是给target对象的key属性赋值value,该执行结果是boolean,即代表赋值成功与否。

set (target, key, value) {
  const res = Reflect.set(target, key, value)
  return res
}

到这里,我们就成功创建了一个响应式对象,给这个响应式对象添加了set,和get操作。

总结

最后我们再一起来回顾一下这一节我们实现的代码及功能,在reactive.ts中我们导出了reactive函数,自身接收一个obj作为参数,并基于obj返回一个proxy对象,我们还简单的处理了一下proxygetset请求,后面我们将会对这个proxy对象进行完善,真正达到响应式。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/723.html

标签: spec.ts
分享给朋友:

“vue3源码之reactive(vue.js源码全方位深入解析)” 的相关文章

几个linux发行版使用感受

linux发行版有哪些linux发行版有上千种,但每一种发行版并不是与其它的发行版没任何关系,有些发行版是基于其他发行版制作的。如果乐意,你自己也可以动手制作属于自己的发行版,然后分发给其他人使用,所以非常自由,可选择的非常多。常见的发行版有:RedHat、Ubuntu、OpenSUSE、Gento...

「图解」父子组件通过 props 进行数据交互的方法

1.组件化开发,经常有这样的一个场景,就是父组件通过 Ajax 获取数据,传递给子组件,如何通过 props 进行数据交互来实现,便是本图解的重点。2.代码的结构3.具体代码 ①在父组件 data 中存放数据 ms。 ②将父组件 data 中的数据 ms 绑定到子组件中的属性 ms。 ③子组件在 p...

Vue组件通信之props深入详解!

props 是 Vue 组件中一个很重要的概念。它是用来从父组件向子组件传递数据的。为什么需要props?这是因为在Vue中,组件是相互隔离的。每个组件都有自己的作用域,子组件无法直接访问父组件的状态或值。通过props,父组件可以将数据传递给子组件。使用props的步骤:1. 在子组件中定义pro...

react hooks自定义组件居然能这样做

前言  这里写一下如何封装可复用组件。首先技术栈 react hooks + props-type + jsx封装纯函数组件。类组件和typeScript在这不做讨论,大家别白跑一趟。接下来会说一下封装可复用组件的思路,比如一个新手应该怎么去封装,都需要有哪些东西。  然后说一些复杂组件需要的功能,...

vue中组件之间的通信方式

** 1.1 父子组件**a. 父向子传数据: 第1种: 父通过属性传值,子组件通过props接收数据(注:props传过来的数据是单向的,不可以进行修改)第2种:子组件可以通过$parent来获取父组件里的数据和调用父组件的方法(注:数据是双向的,还要注意如用了UI组件并且在该UI组件里重新定义一...

vue 3 学习笔记 (八)——provide 和 inject 用法及原理

在父子组件传递数据时,通常使用的是 props 和 emit,父传子时,使用的是 props,如果是父组件传孙组件时,就需要先传给子组件,子组件再传给孙组件,如果多个子组件或多个孙组件使用时,就需要传很多次,会很麻烦。像这种情况,可以使用 provide 和 inject 解决这种问题,不论组件嵌套...