源码中找答案:src/core/instance/state.js-initData()
多实例的情况下,为了保证大家的状态的不污染、不干扰 需要是一个函数
函数每次执行都会返回新的data对象实例
测试代码:
<html>
<head>
<title>Vue事件处理</title>
</head>
<body>
<div id="demo">
<h1>vue组件data为什么必须是个函数? </h1>
<comp></ comp>
<comp></ comp>
</div>
<script src="../ ../dist/vue.js"></script>
<script>
Vue.component('comp',{
template:'<div @click=" counter++">{{counter}}</div>',
data: {counter: 1}
})
//创建实例
const app = new Vue({
el:' #demo ',
});
</script>
<body/>
<html/>
结论:
组件需要是函数,根实例不需要(在这个应用范围内只有一个,不用担心)
Vue组件可能存在
多个实例
,如果使用对象的形式定义data
。则会导致他们共用一个对象
,那么状态变更将会影响所有组件
,这不合理;采用函数
的形式定义,在init
根实例创建过程中则不存在该限制,也是因为根实例只有一个
,不需要担心这种情况