我说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里面所有副作用函数。
相关推荐
Martin -Tang15 分钟前
vite和webpack的区别
前端·webpack·node.js·vite
迷途小码农零零发16 分钟前
解锁微前端的优秀库
前端
王解1 小时前
webpack loader全解析,从入门到精通(10)
前端·webpack·node.js
老码沉思录1 小时前
写给初学者的React Native 全栈开发实战班
javascript·react native·react.js
我不当帕鲁谁当帕鲁1 小时前
arcgis for js实现FeatureLayer图层弹窗展示所有field字段
前端·javascript·arcgis
那一抹阳光多灿烂1 小时前
工程化实战内功修炼测试题
前端·javascript
放逐者-保持本心,方可放逐2 小时前
微信小程序=》基础=》常见问题=》性能总结
前端·微信小程序·小程序·前端框架
毋若成4 小时前
前端三大组件之CSS,三大选择器,游戏网页仿写
前端·css
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
Black蜡笔小新5 小时前
网页直播/点播播放器EasyPlayer.js播放器OffscreenCanvas这个特性是否需要特殊的环境和硬件支持
前端·javascript·html