详解Vue的组件中data选项为什么必须是函数


Posted in Javascript onAugust 17, 2020

官方解释

data 必须是函数

构造 Vue 实例时传入的各种选项大多数都可以在组件里使用。只有一个例外:data 必须是函数。实际上,如果你这么做:

Vue.component('my-component', {
 template: '<span>{{ message }}</span>',
 data: {
 message: 'hello'
 }
})

那么 Vue 会停止运行,并在控制台发出警告,告诉你在组件实例中 data 必须是一个函数。但理解这种规则为何存在也是很有益处的,所以让我们先作个弊:

<div id="example-2">
 <simple-counter></simple-counter>
 <simple-counter></simple-counter>
 <simple-counter></simple-counter>
</div>
var data = { counter: 0 }
Vue.component('simple-counter', {
 template: '<button v-on:click="counter += 1">{{ counter }}</button>',
 ```
 // 技术上 data 的确是一个函数了,因此 Vue 不会警告,
 // 但是我们却给每个组件实例返回了同一个对象的引用
 ```
 data: function () {
 return data
 }
})
new Vue({
 el: '#example-2'
})

=============以下为个人理解,如果有误,请指出,谢谢指教

Vue.component('xxx',{
template:'{{counter}}',
data:function(){
return counter=0;
}
})

Vue在注册到全局/局部并生成实例时,它是具有自己的作用域的,也就是说

在template 字符串模板中如果存在一个变量名与VUE实例的变量名一致的时候,这个变量只会是组件中的变量,而不会是VUE的全局变量

比如

//以下代码中,组件中的count和Vue中的count是一样的变量名,但是在组件中只会显示0而不是2
Vue.component('simple-counter',{
    template:'<button>{{count}}</button>',
    data:function(){
     return count=0;

    }

   });
   vm=new Vue({
    el:'#example-2',
    data:{
     count:2

    }

   })

以上代码从原型链上理解

var component=function(){}//为了让组件有自己的作用域,它必须包含私有变量data,所以简单化的理解应该是这样的

var component=function(){
this.data=this.data();//存在私有的data属性
}

component.propotype.data=function(){
return {count:0}
}
//当我们在template中使用数据的时候,我们是调用的component的私有变量data
//如果我们不以函数的形式处理又会如何呢?
var component=function(){
//不存在私有的data属性
}
component.propotype.data= {count:0}
//此时,data不作为私有变量,就会有暴露的风险,而且,它指向的是{count:0}的引用,所以当重复创建组件的时候,component的data都指向了同一个引用。因此会相互影响。

如果不以原型链的形式处理,也可以不传入函数

function component(d) {

    this.data = d;
   }
var com = new component({
    count: 1
   });
   var com1 = new component({
    count: 1
   });

总结

到此这篇关于详解Vue的组件中data选项为什么必须是函数的文章就介绍到这了,更多相关Vue组件中data选项是函数内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jQuery实现id模糊查询的小例子
Mar 19 Javascript
JavaScript中的apply和call函数详解
Jul 20 Javascript
JavaScript设计模式之单例模式实例
Sep 24 Javascript
JS逆序遍历实现代码
Dec 02 Javascript
浅谈jQuery中height与width
Jul 06 Javascript
第一次接触神奇的Bootstrap导航条
Aug 09 Javascript
jQuery插件FusionCharts实现的2D面积图效果示例【附demo源码下载】
Mar 06 Javascript
jQuery 导航自动跟随滚动的实现代码
May 30 jQuery
Vue面试题及Vue知识点整理
Oct 07 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
Nov 10 Javascript
jQuery实现的模仿雨滴下落动画效果
Dec 11 jQuery
vue组件间通信六种方式(总结篇)
May 15 Javascript
Openlayers实现扩散的动态点(水纹效果)
Aug 17 #Javascript
openLayer4实现动态改变标注图标
Aug 17 #Javascript
openlayers4实现点动态扩散
Aug 17 #Javascript
Vue实现计算器计算效果
Aug 17 #Javascript
vue-model实现简易计算器
Aug 17 #Javascript
Vue实现手机计算器
Aug 17 #Javascript
Vuex实现购物车小功能
Aug 17 #Javascript
You might like
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
Javascript alert消息换行的方法
2013/08/07 Javascript
三种检测iPhone/iPad设备方向的方法
2014/04/23 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
2015/03/03 Javascript
JavaScript中const、var和let区别浅析
2016/10/11 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
理解javascript中的闭包
2017/01/11 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
2017/01/23 Javascript
Angularjs的$http异步删除数据详解及实例
2017/07/27 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
2017/12/19 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
nodejs中Express与Koa2对比分析
2018/02/06 NodeJs
js canvas实现橡皮擦效果
2018/12/20 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
[01:09:24]Ti4开幕式
2014/07/19 DOTA
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
使用Nibabel库对nii格式图像的读写操作
2020/07/01 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
python通过cython加密代码
2020/12/11 Python
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
英国灯具和灯泡网上商店:Lights.co.uk
2018/02/02 全球购物
PHP如何删除一个Cookie值
2012/11/15 面试题
Java程序员面试90题
2013/10/19 面试题
学校后勤人员职责
2013/12/27 职场文书
说明书怎么写
2014/05/06 职场文书
村创先争优活动总结
2014/08/28 职场文书
安全承诺书格式范本
2015/04/28 职场文书
安全生产会议制度
2015/08/06 职场文书
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript
python3操作redis实现List列表实例
2021/08/04 Python
使用 Apache 反向代理的设置技巧
2022/01/18 Servers
python如何查找列表中元素的位置
2022/05/30 Python