详解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的固定表格头部的代码(IE6,7,8测试通过)
May 18 Javascript
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
Aug 19 Javascript
判断一个变量是数组Array类型的方法
Sep 16 Javascript
js实现二代身份证号码验证详解
Nov 20 Javascript
IScroll5 中文API参数说明和调用方法
May 21 Javascript
jquery操作select取值赋值与设置选中实例
Feb 28 Javascript
详解node字体压缩插件font-spider的用法
Sep 28 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
Dec 10 Javascript
Async/Await替代Promise的6个理由
Jun 15 Javascript
Node使用Selenium进行前端自动化操作的代码实现
Oct 10 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
Oct 16 jQuery
原生JavaScript实现简单五子棋游戏
Jun 28 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
php获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
如何优雅的使用 laravel 的 validator验证方法
2018/11/11 PHP
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
JS随机漂浮广告代码具体实例
2013/11/19 Javascript
JS实现自动切换文字的导航效果代码
2015/08/27 Javascript
分分钟玩转Vue.js组件
2016/10/25 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
vue-cli axios请求方式及跨域处理问题
2018/03/28 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
Python字符串格式化输出方法分析
2016/04/13 Python
Python import与from import使用及区别介绍
2018/09/06 Python
Python中调用其他程序的方式详解
2019/08/06 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
Python使用os.listdir和os.walk获取文件路径
2020/05/21 Python
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
大学生求职中的自我评价
2013/10/01 职场文书
建筑设计师岗位职责
2013/11/18 职场文书
大学生工作推荐信范文
2013/12/02 职场文书
主持人演讲稿范文
2013/12/28 职场文书
《金子》教学反思
2014/04/13 职场文书
推普周活动总结
2014/08/28 职场文书
学习心理学的体会
2014/11/07 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
2014年团总支工作总结
2014/11/21 职场文书
2015年班组工作总结
2015/04/20 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
高中信息技术教学反思
2016/02/16 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python
python turtle绘图命令及案例
2021/11/23 Python
JavaScript设计模式之原型模式详情
2022/06/21 Javascript