<body>
<div id="app">
Hello World
<comp></comp>
<comp></comp>
<p>counter -> {{number}}</p>
</div>
<script src="../../dist/vue.js"></script>
<script>
Vue.component('comp',{
template:'<div @click="counter++"></div>',
data:{
counter:1
}
})
const vm = new Vue({
el: '#app',
data:{
number:1
}
})
</script>
可通过源码找到答案: src\core\instance\state.js - initData()
函数每次执行都会返回全新data对象实例
总结:
Vue组件可能存在多个实例,如果使用对象形式定义data,则会导致它们共用一个data对象,那么状态 变更将会影响所有组件实例,这是不合理的;采用函数形式定义,在initData时会将其作为工厂函数返 回全新data对象,有效规避多实例之间状态污染问题。而在Vue根实例创建过程中则不存在该限制,也是因为根实例只能有一个,所以不需要担心这种情况。