详解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 相关文章推荐
JavaScript 以对象为索引的关联数组
May 19 Javascript
js URL参数的拼接方法比较
Feb 15 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
Nov 17 Javascript
Vue.js展示AJAX数据简单示例讲解
Mar 29 Javascript
Vue生命周期示例详解
Apr 12 Javascript
详解node.js平台下Express的session与cookie模块包的配置
Apr 26 Javascript
JavaScript初学者必看“new”
Jun 12 Javascript
Vue触发式全局组件构建的方法
Nov 28 Javascript
vue-resourc发起异步请求的方法
Feb 11 Javascript
vue2.0实现列表数据增加和删除
Jun 17 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
Dec 03 Vue.js
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
Apr 24 Vue.js
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
手冲咖啡应该是现代精品咖啡店的必备选项吗?
2021/03/03 冲泡冲煮
解析isset与is_null的区别
2013/08/09 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
添加JavaScript重载函数的辅助方法2
2010/07/04 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
2013/06/21 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
2013/12/05 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
jQuery原生的动画效果
2015/07/10 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
JQuery为元素添加样式的实现方法
2016/07/20 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
JavaScript实现左右下拉框动态增删示例
2017/03/09 Javascript
bootstrap datepicker插件默认英文修改为中文
2017/07/28 Javascript
js数组常用最重要的方法
2018/02/04 Javascript
vue实现微信分享功能
2018/11/28 Javascript
layui使用label标签的方法
2019/09/14 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
JavaScript中条件语句的优化技巧总结
2020/12/04 Javascript
pycharm 使用心得(九)解决No Python interpreter selected的问题
2014/06/06 Python
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
用python实现对比两张图片的不同
2018/02/05 Python
python K近邻算法的kd树实现
2018/09/06 Python
用python实现k近邻算法的示例代码
2018/09/06 Python
python抖音表白程序源代码
2019/04/07 Python
python字符串Intern机制详解
2019/07/01 Python
Python连接mysql数据库及简单增删改查操作示例代码
2020/08/03 Python
计算机专业个人求职自荐信
2013/09/21 职场文书
国庆放假通知怎么写
2015/07/30 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
反四风问题学习心得体会
2016/01/22 职场文书
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL
分析MySQL优化 index merge 后引起的死锁
2022/04/19 MySQL