vue实例中的data属性既可以是一个对象,也可以是一个函数。为什么组件中data必须是一个函数而不是对象呢?
组件是可复用的vue
实例,一个组件被创建好之后,就可能被用在各个地方,而组件不管被复用了多少次,组件中的data
数据都应该是相互隔离,互不影响的,基于这一理念,组件每复用一次,data
数据就应该被复制一次,之后,当某一处复用的地方组件内data
数据被改变时,其他复用地方组件的data
数据不受影响,如下面这个例子:
首先创建一个名字为counter的组件,data函数中返回一个外部定义的对象的值,如果直接给data属性设置一个对象而不是函数,那么会在浏览器中直接报错
下面将data定义为函数
<template>
<div>
<h3>{{ count }}</h3>
<input type="button" value="+1" @click="increment" />
</div>
</template>
<script>
export default {
name: "BtnCount",
data() {
return {
count: 0,
};
},
mounted() {},
methods: {
increment() {
this.count++;
},
},
};
</script>
<style scoped>
</style>
接着我们在页面上同时使用三个counter组件
<template>
<div>
<counter></counter>
<counter></counter>
<counter></counter>
</div>
</template>
然后在浏览器打开
能有这样效果正是因为上述例子中的data
不是一个单纯的对象,而是一个函数返回值的形式,所以每个组件实例可以维护一份被返回对象的独立拷贝
总结
组件中的data
写成一个函数,数据以函数返回值形式定义,这样每复用一次组件,就会返回一份新的data
,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据。而单纯的写成对象形式,就使得所有组件实例共用了一份data
,就会造成一个变了全都会变的结果。
-
根实例对象data可以是对象也可以是函数(根实例是单例),不会产生数据污染情况
-
组件实例对象
data
必须为函数,目的是为了防止多个组件实例对象之间共用一个data,产生数据污染。采用函数的形式,initData时会将其作为工厂函数都会返回全新data对象