前言
最近在看源代码,又突然想起以前看到的一个问题,为什么vue组件data必须是函数。百度的结果第一页的答案全是扯到原型?真醉了,举的例子也是模模糊糊(例子扯到函数原型,八杆子打不着),估计被很多人浏览也就SEO上去了。
解决
只能说逼乎大佬多,Vue 组件 data 为什么必须是个函数,而 Vue 的根实例却没有此限制? - NuoHui的回答 - 知乎
data是对象
Vue源码注册组件的时候,对组件的data处理时,如果是对象,会直接引用这个对象,不作任何处理。这意味着当多个该组件被渲染,都会引用相同的对象。很好奇为啥不是复制一份,猜测是性能的原因吧,可能这种方式也有其独特的使用方式或者技巧?
data是函数
如果data是函数而不是对象,将会将该函数结构出来,然后调用,调用使用了call,并传入了该组件的上下文:
data.call( vm, vm);
/**
Vue组件或者Vue实例的函数什么的,都在data初始化前完成。
此处绑定了vm上下文,所以在data函数中,可以使用this访问当前组件或者实例中的函数或者其他的东西。
**/