zoukankan      html  css  js  c++  java
  • Vue 组件 data为什么是函数

    在创建或注册模板的时候,传入一个data属性作为用来绑定的数据。但是在组件中,data必须是一个函数,而不能直接把一个对象赋值给它。

    Vue.component('my-component', {
    template: '

    OK
    ',
    data() {
    return {} // 返回一个唯一的对象,不要和其他组件共用一个对象进行返回
    },
    })
    你在前面看到,在new Vue()的时候,是可以给data直接赋值为一个对象的。这是怎么回事,为什么到了组件这里就不行了。

    你要理解,上面这个操作是一个简易操作,实际上,它首先需要创建一个组件构造器,然后注册组件。注册组件的本质其实就是建立一个组件构造器的引用。使用组件才是真正创建一个组件实例。所以,注册组件其实并不产生新的组件类,但会产生一个可以用来实例化的新方式。

    理解这点之后,再理解js的原型链:

    var MyComponent = function() {}
    MyComponent.prototype.data = {
    a: 1,
    b: 2,
    }
    // 上面是一个虚拟的组件构造器,真实的组件构造器方法很多

    var component1 = new MyComponent()
    var component2 = new MyComponent()
    // 上面实例化出来两个组件实例,也就是通过调用,创建的两个实例

    component1.data.a === component2.data.a // true
    component1.data.b = 5
    component2.data.b // 5
    可以看到上面代码中最后三句,这就比较坑爹了,如果两个实例同时引用一个对象,那么当你修改其中一个属性的时候,另外一个实例也会跟着改。这怎么可以,两个实例应该有自己各自的域才对。所以,需要通过下面方法来进行处理:

    var MyComponent = function() {
    this.data = this.data()
    }
    MyComponent.prototype.data = function() {
    return {
    a: 1,
    b: 2,
    }
    }
    这样每一个实例的data属性都是独立的,不会相互影响了。所以,你现在知道为什么vue组件的data必须是函数了吧。这都是因为js本身的特性带来的,跟vue本身设计无关。其实vue不应该把这个方法名取为data(),应该叫setData或其他更容易立即的方法名。

  • 相关阅读:
    10 个深恶痛绝的 Java 异常。。
    为什么公司宁愿 25K 重新招人,也不给你加到 20K?原因太现实……
    推荐一款代码神器,代码量至少省一半!
    Spring Cloud Greenwich 正式发布,Hystrix 即将寿终正寝。。
    hdu 3853 LOOPS(概率 dp 期望)
    hdu 5245 Joyful(期望的计算,好题)
    hdu 4336 Card Collector(期望 dp 状态压缩)
    hdu 4405 Aeroplane chess(概率+dp)
    hdu 5036 Explosion(概率期望+bitset)
    hdu 5033 Building (单调栈 或 暴力枚举 )
  • 原文地址:https://www.cnblogs.com/zhengyb/p/10456579.html
Copyright © 2011-2022 走看看