手撸vue3核心源码——响应式原理(isRef与unRef)

简介: 手撸vue3核心源码——响应式原理(isRef与unRef)

isRef

isRef和isReactive一样,都是用于检测数据类型,isRef是检测是不是一个ref对象,跟isReactive函数实现起来一样,我们先来写一个单元测试

这里要实现的功能是,检测ref对象肯定就通过返回true,检测普通类型数据以及reactive对象都是false


it("it should return a boolean", () => {
        let obj = ref(1)
        let a = 1
        let b = reactive({ user: 1 })
        expect(isRef(obj)).toBe(true)
        expect(isRef(a)).toBe(false)
        expect(isRef(b)).toBe(false)
    })

 我们在ref.ts中把逻辑写好,首先肯定要返回一个isRef的函数对象,接着我们读取某个属性,如果是ref,那么可以读到,如果不是ref那么它没有这个属性,就会为false


class RefImpl {
    private _value
    private _raw
    public dep
    //是否是ref的标识
    public __v_isRef = true
    constructor(value) {
        //保存没有代理前的value
        this._raw = value
        //做对象类型检测
        this._value = isObject(value) ? reactive(value) : value
        this.dep = new Set()
    }
    get value() {
        trackRefValue(this.dep)
        return this._value
    }
    set value(newValue) {
        if (!isHasChanged(this._raw, newValue)) return
        this._raw = newValue
        this._value = newValue
        tiggerEffect(this.dep)
    }
}

我们用一个__v_isRef来标识ref,当我们能读到这个属性是那么肯定就是ref对象了


export function isRef(value) {
    return !!value.__v_isRef
}

为什么要用!!转义呢,因为当我们传入的数据比如是1 a {name: 1}这种不是响应式对象 以及reactive对象,他们身上就没有__v_isRef属性,返回值是undefined,因此用!!转义一下,变成布尔值


unRef

在 Vue 3 中,unRef用于获取一个可能是响应式对象或 ref 对象的原始值,以避免对响应式对象的重复包装或 ref 对象的.value访问, 如果不是一个ref对象的话也返回它的值,先来看一下单测


it("it should return a value", () => {
        let obj = ref(2)
        let a = 1
        expect(unRef(obj)).toBe(2)
        expect(unRef(a)).toBe(1)
    })

我们想一下思路。当我们传入的是ref对象时,我们返回.value即可,若不是ref对象那好办,直接返回它的值

我们来实现一下, 我们只用检测一下是不是ref即可,上面的isRef刚好可以检验


export function unRef(ref) {
    return isRef(ref) ? ref.value : ref
}

这样代码就已经都实现啦,是不是很容易了,我们在写源码的过程中一定要理清楚逻辑关系


相关文章
|
2月前
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
39 1
|
2月前
|
JavaScript 前端开发 API
介绍一下Vue中的响应式原理
介绍一下Vue中的响应式原理
37 1
|
2月前
|
监控 JavaScript 算法
深度剖析 Vue.js 响应式原理:从数据劫持到视图更新的全流程详解
本文深入解析Vue.js的响应式机制,从数据劫持到视图更新的全过程,详细讲解了其实现原理和运作流程。
|
2月前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
71 0
|
8月前
|
JavaScript API
【vue实战项目】通用管理系统:api封装、404页
【vue实战项目】通用管理系统:api封装、404页
85 3
|
8月前
|
人工智能 JavaScript 前端开发
毕设项目-基于Springboot和Vue实现蛋糕商城系统(三)
毕设项目-基于Springboot和Vue实现蛋糕商城系统
|
8月前
|
JavaScript Java 关系型数据库
毕设项目-基于Springboot和Vue实现蛋糕商城系统(一)
毕设项目-基于Springboot和Vue实现蛋糕商城系统
206 0
|
8月前
|
JavaScript 前端开发 API
Vue3+Vite+TypeScript常用项目模块详解
现在无论gitee还是github,越来越多的前端开源项目采用Vue3+Vite+TypeScript+Pinia+Elementplus+axios+Sass(css预编译语言等),其中还有各种项目配置比如eslint 校验代码工具配置等等,而我们想要进行前端项目的二次开发,就必须了解会使用这些东西,所以作者写了这篇文章进行简单的介绍。
162 0
Vue3+Vite+TypeScript常用项目模块详解
|
8月前
|
设计模式 JavaScript
探索 Vue Mixin 的世界:如何轻松复用代码并提高项目性能(上)
探索 Vue Mixin 的世界:如何轻松复用代码并提高项目性能(上)
探索 Vue Mixin 的世界:如何轻松复用代码并提高项目性能(上)
|
8月前
|
前端开发 JavaScript Java
毕业设计|基于SpringBoot+Vue的科研课题项目管理系统
毕业设计|基于SpringBoot+Vue的科研课题项目管理系统
213 1
下一篇
开通oss服务