我说ref才是响应式的老大没人反对吧?

由于上一篇文章已经写过reactive,所以ref就只需要考虑原始类型即可,引用类型只需要引进上一篇文章的reactive来实现引用类型的响应式。
reactive的手写

手写ref

其实我们在使用reactive和ref时一般考虑个人习惯,不过引用类型数据多时建议使用reactive。但是ref写起来简单还通用,ref是完胜reactive的。

ref函数

与reactive同样的人,ref开局出生就是独生子

js 复制代码
export function ref(val){//将原始类型数据变成响应式  引用类型也可以
    return createRef(val)
}

createRef

这里我们先判断val.__v_isRef是否为响应式,开始数据不会是响应式的,所以得先执行下面RefImpl类里面的操作

js 复制代码
function createRef(val){
    // 判断val是否已经是响应式
    if(val.__v_isRef){
        return val
    }

    // 将val变成响应式
    return new RefImpl(val)
}

RefImpl类

我们写ref当然不能只写它对原始类型有用,必须也能使用引用类型。这时就得从reactive那里借点东西过来了 reactive的手写。ref也需要进行依赖收集。

js 复制代码
class RefImpl{
    constructor(val){  //class类的语法
        //ref代理的对象身上的属性
        this.__v_isRef = true //给每一个被ref操作过的属性值添加标记
        this._value = convert(val)

    }

    get value(){ //age.value可以获取
        //为this对象做依赖收集
        track(this,'value')
        return this._value
    }
    //更新age
    set value(newVal){
        if(newVal !== this._value){
            this._value = convert(newVal)
            trigger(this,'value')//触发掉'value'上的所有副作用函数
        }
    }
}


function convert(val){
    if(typeof val!=='object' || val === null ){
        return val
    }else{
        return reactive(val)
    }

}
  1. this._value = convert(val):这行代码将传入的 val 值进行转换,并将转换后的值存储在 _value 属性中。convert 函数的作用是判断 val 的类型,如果是对象类型,则将其转换成响应式对象,否则保持原来的类型。通过将值存储在 _value 属性中,可以在后续的代码中通过 get value() 方法来获取该值。
  2. get value():这是使用了JavaScript 中的特殊属性访问器,可以通过age.value来获取ref里面的数据,而不是age.value(),简化了代码
  3. set value:当数据发送更新后,先通过convert判断数据类型,再通过reactive里面的trigger函数触发value里面所有副作用函数。
相关推荐
可触的未来,发芽的智生1 小时前
追根索源:换不同的词嵌入(词向量生成方式不同,但词与词关系接近),会出现什么结果?
javascript·人工智能·python·神经网络·自然语言处理
努力写代码的熊大2 小时前
stack、queue与priority_queue的用法解析与模拟实现
java·前端·javascript
im_AMBER2 小时前
React 06
前端·javascript·笔记·学习·react.js·前端框架
wyzqhhhh2 小时前
前端常见的设计模式
前端·设计模式
IT_陈寒2 小时前
React 19重磅前瞻:10个性能优化技巧让你少写30%的useEffect代码
前端·人工智能·后端
m0_748233643 小时前
C++开发中的常用设计模式:深入解析与应用场景
javascript·c++·设计模式
fruge3 小时前
TypeScript 基础类型与接口详解
javascript·ubuntu·typescript
今天没有盐3 小时前
💕CSS 基础入门指南💕:选择器与文本样式
前端·html·响应式设计
AAA阿giao3 小时前
JavaScript 中的变量声明:var、let 与 const 深度解析
javascript·笔记
云枫晖3 小时前
Webpack系列-Entry入口
前端·webpack