最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 由浅入深了解Vue组件中的data| 8月更文挑战

    正文概述 掘金(Mumbler)   2021-08-03   357

    首先,我们先看一个简单的原型链有关知识。

    `function VueComponent(){} 
    
    VueComponent.prototype.$options = { 
            data:{
                    name:'zf',
            }
    }
    
    let vc1 = new VueComponent()
    
    vc1.$options.data = 'lx'
    
    let vc2 = new VueComponent() 
    
    console.log(vc2.$options.data)` 
    

    我们可以看到,实例对象VC1修改了name的值为“lx”,新的实例对象VC2访问到的值也是修改后的“lx”。

    这是因为VC1和VC2两个实例对象在操作$options时是在操作VueComponent构造函数原型对象上的属性,实例对象的隐式原型属性等于其构造函数的显示原型属性,所以它们指向的是同一块内存空间。 这导致了两个对象数据不独立,会相互污染。

    根据以上结果,再回到我们Vue组件中的data属性。

    同一个组件被复用多次,会创建多个实例。这些实例用的是同一个构造函数,如果 data 是一个对象的话,那么所有组件都共享了同一个对象。为了保证组件的数据独立性要求每个组件必须通过 data 函数返回一个对象作为组件的状态。

    core/global-api/extend.js line:33

    Sub.options = mergeOptions(Super.options, extendOptions)
    
    function mergeOptions() {
            function mergeField(key) {
                    const strat = strats[key] || defaultStrat options[key] = strat(parent[key], child[key], vm, key)
            }
    }
    strats.data = function(parentVal: any, childVal: any, vm ? : Component
    
    ): ? Function {
            if (!vm) { // 合并是会判断子类的data必须是一个函数 
                    if (childVal && typeof childVal !== 'function') {
                            process.env.NODE_ENV !== 'production' && warn('The "data" option should be a function ' +
                                    'that returns a per-instance value in component ' + 'definitions.', vm) return parentVal
                    }
                    return mergeDataOrFn(parentVal, childVal)
            }
            return mergeDataOrFn(parentVal, childVal, vm)
    }
    
    总结:

    一个组件被使用多次,用的都是同一个构造函数。为了保证组件的不同的实例data不冲突,组件中的数据相互 独立,要求data必须是一个函数,这样组件间不会相互影响。


    起源地下载网 » 由浅入深了解Vue组件中的data| 8月更文挑战

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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