为什么Vue组件中的data是一个函数原理(详细易懂)

组件中的data

组件是一个具有单独自身功能模块的封装,这个模块有属于自己的HTML模板,也应该有属于自己的数据data,组件也有自己的方法methods
注意:组件不能直接访问Vue实例中定义的数据。就算可以访问,若将所有的数据都放在Vue实例中,Vue实例就会变得非常臃肿(数据很多),所以组件应该有自己保存数据的地方
因此,data属性必须是一个函数,并且这个函数返回一个对象在对象内部保存数据

实例

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

<template id="cpn">
  <div>
    <h2>{{message}}</h2>
    //不会渲染,控制台报错
     <h2>{{title}}</h2>
  </div>
</template>

<script src="../vue.js"></script>
<script>   
 const app = new Vue({
    el:'#app',
    data:{
      title:"Vue"
    },
    components:{
      "cpn1":{
        template:"#cpn",
        //data位一个函数返回对象
        data(){
          return {
            message:"hello vue"
          }
        }
      }  
    }
  })
</script>
</body>

在这里插入图片描述

data是函数----原理

function知识

在解释原理之前先来看两个个有关函数的例子
示例一:

<script>
    function person() {
        return {
            name:"a",
            age:22
        }
    };

    var obj1 = person();
    var obj2 = person();
    obj1.name = 'b';
    console.log(obj1);
    console.log(obj2);
    
</script>

在这里插入图片描述
示例二:

<script>
    const obj = {
        name:"a",
        age:22
    }
    function person() {
        return obj;
    };

    var obj1 = person();
    var obj2 = person();
    
    obj1.name = 'b';
    console.log(obj1);
    console.log(obj2);
    
</script>

在这里插入图片描述
总结:第一个示例中每调用一次函数都返回一个新的对象,而在第二个示例中所共用一个对象。所以,在改变其中一个对象某一属性的值时,第一个示例中的两个对象不会相互影响,而第二个示例中则是相互影响的。
在这里插入图片描述
在这里插入图片描述

data是函数的原理

有了上面知识的基础,就很好理解原理了。还是用实例来解释,该实例中是用组件实现多个计数器功能

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

  <template id="cpn">
    <div>
      <h2>当前计数:{{count}}</h2>
      <button @click="sub">-</button>
      <button @click="add">+</button>
    </div>
  </template> 


<script src="../vue.js"></script>
<script>
  Vue.component('cpn',{
    template:"#cpn",
    //调用data函数,每次调用都返回一个新的对象
    data(){
      return {
        count:0
      }
    },
    //组件中的methods
    methods:{
      add() {
        this.count++;
      },
      sub() {
        this.count--;
      }
    }
  })
  const app = new Vue({
    el:'#app',
  })
</script>
</body>

在这里插入图片描述

案例总结

创建了三个组件实例计数器,每个计数器可以完成自己的计数功能,互不影响。即实例中的data对象都是不同的(没有共享data对象),可以参考function知识中的示例一

举一反三

还是以上面这个计数器的例子,对代码稍作更改(更改部分已作注释),也会有不一样的效果。

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

  <template id="cpn">
    <div>
      <h2>当前计数:{{count}}</h2>
      <button @click="sub">-</button>
      <button @click="add">+</button>

    </div>
  </template> 


<script src="../vue.js"></script>
<script>
//更改部分
  const counter = {
    count:0
  };
  Vue.component('cpn',{
    template:"#cpn",
    //更改部分
    data(){
      return counter 
    },
    methods:{
      add() {
        this.count++;
      },
      sub() {
        this.count--;
      }
    }
  })
  const app = new Vue({
    el:'#app',
  })
</script>
</body>

在这里插入图片描述
总结:这一个例子共用了一个对象,可以参考function知识示例二,这种连锁反应一般在组件中很少应用到,因为组件是复用的,自然就不希望数据共享,而是有自己的逻辑,保存自己数据的实例

  • 19
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue.js的选项式API和组合式API都是用来定义组件的方式,但它们之间有着很大的区别。 选项式API是Vue.js早期版本使用的一种定义组件的方式。在选项式API组件定义以一个JavaScript对象的形式呈现,包括data、methods、computed、watch等属性和方法。这种方式比较简单易懂,适合较小的组件,但是在组件逻辑较为复杂时,选项式API的代码会变得冗长难以维护。 组合式API是Vue.js 3.0版本引入的一种全新的组件定义方式。该API将组件的逻辑拆分成逻辑组合的小函数,使得组件逻辑更加清晰、易于维护。组合式API主要包括setup函数、响应式API、生命周期钩子函数等。 setup函数是组合式API的核心,它是一个组件创建之前被调用的函数。setup函数可以返回一个对象,该对象包含了组件data、methods、computed、watch等属性和方法。与选项式API不同的是,setup函数不存在this上下文,而是通过传入的参数来访问组件实例。 响应式API是组合式API的另一个重要特性,它可以让组件的数据具有响应式的特性。使用响应式API创建的数据可以自动更新视图,而不需要手动调用更新函数。 生命周期钩子函数在组合式API的使用方式与选项式API相似,不同的是,生命周期钩子函数的this上下文不再指向组件实例,而是需要通过传入的参数来访问组件实例。 综上所述,选项式API和组合式API都是Vue.js定义组件的方式,但是它们之间有着很大的区别。选项式API适用于简单的组件,而组合式API则适用于复杂的组件,它可以更好地拆分组件的逻辑,使得代码更加清晰、易于维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值