最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 探索Vue响应式API之toRefs

    正文概述 掘金(lemonJW)   2021-03-24   1191
    //输入
    const {ref, reactive, toRefs} = VueReactivity;
    const counter = reactive({a:1});
    const counterToRefs = toRefs(counter);
    

    先看toRefs函数。

    function toRefs(object) {    
        if (!isProxy(object)) {      
            console.warn(        `toRefs() expects a reactive object 
                but received a plain one.`      );    
        }    
        const ret = isArray(object) ? new Array(object.length) : {};    
        for (const key in object) {      
            ret[key] = toRef(object, key);    
        }    
        return ret;  
    }
    

    这里传入进去的counter因为调用了reactive,所以是一个proxy,也就是vue中所说的响应性对象。toRefs函数首先判断传入进去的对象是不是Proxy,如果不是将会警告。因为我们传入进去的是一个Object,所以ret={}。看遍历里的toRef函数都做了什么。

    function toRef(object, key) {    
        return isRef(object[key]) ? object[key] : new ObjectRefImpl(object, key);  
    }
    

    函数内判断每个key在对象内是不是一个ref,如果不是,new一个ObjectRefImpl对象。看看ObjectRefImpl。

    class ObjectRefImpl {    
        constructor(_object, _key) {      
            this._object = _object;      
            this._key = _key;      
            this.__v_isRef = true;    
        }    
        get value() {      
            return this._object[this._key];    
        }    
        set value(newVal) {      
            this._object[this._key] = newVal;    
        }  
    }
    

    看的出来,做的工作很简单,实例化了一个ObjectRefImpl对象,这个对象内分别挂载了_object,_key,__v_isRef三个属性,如果触发get操作,将返回Object[key],如果触发set操作,将给Object内指定的key赋新值。

    探索Vue响应式API之toRefs

    counterToRefs的结果打印出来,可以发现,实际上toRefs函数要做的事情其实很简单,就是生成一个新的对象,对象中的每个key都对应着proxy的每个key,双方建立映射关系。对a做的任何操作实际上就是对proxy[a]做的任何操作。

    探索Vue响应式API之toRefs

    看下Vue官网所说的,会思考一个问题,为什么解构的时候要用toRefs,否则将丢失反应性?

    看到这里可能已经了解了,因为props是个proxy,如果不toRefs直接解构,得到的title跟原来的props没有任何关系,如果title发生了改变或被使用到,props都无法进行track(依赖收集)和trigger(触发依赖)。因此也就丢失了相应性。

    而通过建立这样的映射关系,实例化了一个ObjectRefImpl对象,巧妙的解决了问题。


    起源地下载网 » 探索Vue响应式API之toRefs

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元