zoukankan      html  css  js  c++  java
  • vue3中ref与reactive的区别

    ref

    创建一个响应式数据,一般来说用于创建简单类型的响应式对象,比如StringNumber类型

    const name = ref('tom')
    

    image-20211014112620953

    可以看到,ref方法将这个字符串进行了一层包裹,返回的是一个RefImpl类型的对象,译为引用的实现(reference implement),在该对象上设置了一个不可枚举的属性value,所以使用name.value来读取值。

    正如上面所说,ref通常用于定义一个简单类型,那么是否可以定义一个对象或者数组

    const obj = ref({
      age: 12,
      sex: 'man',
    })
    

    image-20211014141726434

    控制台可以看到,对于复杂的对象,值是一个被proxy拦截处理过的对象,但是里面的属性agesex不是RefImpl类型的对象,proxy代理的对象同样被挂载到value上,所以可以通过obj.value.age来读取属性,这些属性同样也是响应式的,更改时可以触发视图的更新

    reactive

    通过上面ref的使用案例,起始不管是复杂引用类型,如array,object等,亦或者是简单的值类型string,number都可以使用ref来进行定义,但是,定义对象的话,通常还是用reactive来实现

    const person = reactive({
      height: 180,
    })
    

    image-20211014151714533

    可以看到返回的person是一个proxy代理的对象,使用时person.height即可

    那么能否使用reactive来定义普通类型?

    const id = reactive('id是1')
    

    image-20211014161124406

    可以看到reactive只能被用来定义对象

    ref与reactive的区别与联系

    一般来说,ref被用来定义简单的字符串或者数值,而reactive被用来定义对象数组等

    ref定义对象时,value返回的是proxyreactive定义对象时返回的也是proxy,而这确实存在一些联系

    ref来定义数据时,会对里面的数据类型进行一层判断,当遇到复杂的引用类型时,还是会使用reactive来进行处理

    class RefImpl {
        constructor(value, _shallow) {
            this._shallow = _shallow;
            this.dep = undefined;
            this.__v_isRef = true;
            this._rawValue = _shallow ? value : toRaw(value);
            this._value = _shallow ? value : toReactive(value);
        }
        ////......
    }
    
    const toReactive = (value) => isObject(value) ? reactive(value) : value;// 判断参数是否为对象,是对象调用reactive创建,否则返回原始值
    
  • 相关阅读:
    我来了
    学习笔记-数据仓库和数据挖掘
    React及JSX常见问题
    JavaScript笔记,不定期更新
    比strlen执行速度更快的处理字符串长度的函数
    LESS笔记/注意手册(更新中)
    鼠标移到图片变化的三种写法(可移植性强、代码少)
    信息安全技术作业5--散列函数的应用及其安全性
    结对作业(web)
    读《构建之法》第4、17章
  • 原文地址:https://www.cnblogs.com/baifangzi/p/15407255.html
Copyright © 2011-2022 走看看