详解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应该怎样学
Apr 16 Javascript
javascript利用控件对windows的操作实现原理与应用
Dec 23 Javascript
Javascript this 关键字 详解
Oct 22 Javascript
JavaScript中的对象序列化介绍
Dec 30 Javascript
js树插件zTree获取所有选中节点数据的方法
Jan 28 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
Nov 01 Javascript
jQuery动态移除和添加背景图片的方法详解
Mar 07 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
Apr 11 Javascript
认识jQuery的Promise的具体使用方法
Oct 10 jQuery
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
Sep 04 Javascript
vue中使用elementUI组件手动上传图片功能
Dec 13 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
Apr 13 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 取得瑞年与平年的天数的代码
2009/08/10 PHP
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
2014/07/30 PHP
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
javascrpt绑定事件之匿名函数无法解除绑定问题
2012/12/06 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
jquery 无限级下拉菜单的简单实现代码
2014/02/21 Javascript
jquery、js操作checkbox全选反选
2014/03/12 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
2016/06/12 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
vue 音乐App QQ音乐搜索列表最新接口跨域设置方法
2018/09/25 Javascript
Element Input组件分析小结
2018/10/11 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
2019/04/22 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
解决vant中 tab栏遇到的坑 van-tabs
2020/11/04 Javascript
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
html5基础标签(html5视频标签 html5新标签用法)
2013/12/30 HTML / CSS
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
理货员的岗位职责
2013/11/23 职场文书
买卖车协议书
2014/04/21 职场文书
2015年安康杯竞赛活动总结
2015/03/26 职场文书
团委工作总结2015
2015/04/02 职场文书
消防验收申请报告
2015/05/15 职场文书
2015年检察院个人工作总结
2015/05/20 职场文书
公司出差管理制度范本
2015/08/05 职场文书
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS
MySQL远程无法连接的一些常见原因总结
2022/09/23 MySQL
Redis主从复制操作和配置详情
2022/09/23 Redis