01-vue中的组件为什么是返回函数

  1. 组件中的data属性为什么返回值是一个函数,而不是对象
    1. 1.组件是高可复用性的
    2. 2例子如下

组件中的data属性为什么返回值是一个函数,而不是对象

1.组件是高可复用性的

1.1 如果组件中的data返回的是一个对象,那么其他地方在使用这个组件进行传值的时候,因为传递进来的是一个值引用,而不是一个具体的对象,js中传递的全部是引用,没有达到组件数据的隔离的效果,导致一处数据发生改变,用过相同组件的地方也会产生相应的变化,这是我们不希望发生的。例如下面的例子

2例子如下

const obj = {
    count:0
  }
  //注册并挂载到全局的Vue上
  Vue.component('spn',{
    template:`#mycpn`,
    data(){
      return obj
    },
    methods:{
      increment(){
        this.count++
      },
      decrement(){
        this.count--
      }
    }
  })
  let app = new Vue({
    el: "#app",
  })
  //在设计这个vue的时候,考虑到组件之间更改属性的过程中,如果直接更改属性会造成其他用到组件的地方因为前一个数据的变化,后面组件跟着变化的情况
  //干脆直接设计成为调用函数,每次调用的时候变量的引用都是不同的,这样每次在进行修改组件属性的时候,其他的组件属性不会发生更改

上面代码的效果图
image.png

上面代码当我点击加号或者减号会出现什么样的结果呢,如下
image.png
当我点击加号的时候,这两个数字都进行了加1操作,这是我们希望看到的吗,实际工作中我们也是不希望有这样的事儿发生,因为组件是相对封闭的一个空间,他自己里面执行的逻辑不能被其他引用了该组件的操作所影响,那么我们就来研究一下为什么会发生这样的情况。

首先我们来看一个js代码

  function getMsg(){
    return {
      name:"cxy",
      age:18
    }
   }

 let obj1 = getMsg();
 let obj2 = getMsg();
 let obj3 = getMsg();

 obj1.name="coder"
  console.log(obj1.name)
  console.log(obj2.name)
  console.log(obj3.name)

我调用了三次getMsg()方法,返回了三个对象,我要验证这三个对象是否是属于同一个,我将其中一个对象的属性改了,看其他对象的属性是否会跟着改变,答案我们可以看到,他们是不会改变的,如下
image.png
这到底是什么原因呢?理解这个问题,我们要首先了解内存模型,在进行方法调用返回对象的时候,每次返回的对象都是从栈空间里面创建的临时变量,也就是一个内存地址,如下
Snipaste_2020-06-04_08-41-37.png

来看一下他的反例

  //这里直接返回的是临时开辟的一块内存地址,而且地址不会发生改变
  const msg = {
    name:"cxy",
    age:18
  }

  function getMsg(){
    return msg;
  }

 let obj1 = getMsg();
 let obj2 = getMsg();
 let obj3 = getMsg();

 obj1.name="coder"
  console.log(obj1.name)
  console.log(obj2.name)
  console.log(obj3.name)

打印结果
image.png
这又是为什么呢?请看下图

image.png

那么也就解释了为什么data是一个函数,而不是一个对象,是对象的话,就直接返回的同一个内存地址,导致同一组件在不同地方使用,对象属性之间会产生影响。欢迎小伙伴儿指出我理解的不是很正确的地方,喜欢的话可以点赞支持一下,哈哈哈


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1371769065@qq.com

文章标题:01-vue中的组件为什么是返回函数

字数:865

本文作者:一叶知秋

发布时间:2020-07-06, 23:51:11

最后更新:2020-07-07, 00:24:39

原始链接:http://yoursite.com/2020/07/06/fontend/01-vue%E4%B8%AD%E7%9A%84%E7%BB%84%E4%BB%B6%E4%B8%BA%E4%BB%80%E4%B9%88%E6%98%AF%E8%BF%94%E5%9B%9E%E5%87%BD%E6%95%B0/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

×

喜欢就点赞,疼爱就打赏

相册 github