Vue(复用)组件,data属性为何是一个函数。

data属性为何是一个函数

  • 总而言之:为了防止组件复用相互影响。

从Vue组件的角度上理解

在这里插入图片描述

<body>
  <div id="app">
    <cop></cop>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const cop = {
      data() {
        return {
          num: 0
        }
      },
      template: `
      <div>
        <div>{{num}}</div>
        <button @click="num++">increase</button>
      </div>
      `
    }

    const vue = new Vue({
      el: '#app',
      components: {
        cop
      }
    })
  </script>
</body>
  • 如果组件data不使用函数,则不法通过编译,直接报错。
  • 这是因为如果可以用对象的话,那么每个复用的组件都会共用一个num因为对象的引用地址,而不是深拷贝。

从js上层面上理解

对象形式
	class Father1 {
      constructor() {
      }
    }
    
    Father1.prototype.msg = {
      data: 'msg'
    };

    const a = new Father1();
    const b = new Father1();
    a.msg.data = 'xxx';
    console.log(a.msg, b.msg); // a:{data: "xxx"}  b:{data: "xxx"}
    //这里拿到的都是Father的原型,对象只是拿到的地址,就是浅拷贝。
    // 所以一旦修改所有引用的都会修改
  • 这里可以理解成data用对象的方式,一旦复用,所有的数据会影响。
函数形式
class Father2 {
      constructor() {
        this.msg = this.msg();
      }
    }
    
    Father2.prototype.msg = function () {
      return {
        data: 'aaa'
      }
    }
    
    const c = new Father2();
    const d = new Father2();
    c.msg.data = 'xxx';
    console.log(c.msg, d.msg); // {data: "xxx"} {data: "aaa"}

这里每个实例(理解成组件)都会有自己独立的data,这样避免复用data共用的情况。
自己踩的继承原型的坑——有关继承、原型、修改原型上的函数返回值上的值的坑。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值