详解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版)
May 03 Javascript
jquery ajax jsonp跨域调用实例代码
Dec 11 Javascript
JS实现生成会变大变小的圆环实例
Aug 05 Javascript
javascript学习总结之js使用技巧
Sep 02 Javascript
jQuery实现div拖拽效果实例分析
Feb 20 Javascript
JS继承之借用构造函数继承和组合继承
Sep 07 Javascript
Js apply方法详解
Feb 16 Javascript
React为 Vue 引入容器组件和展示组件的教程详解
May 03 Javascript
JS使用数组实现的队列功能示例
Mar 04 Javascript
vue2.0基于vue-cli+element-ui制作树形treeTable
Apr 30 Javascript
js+css3实现炫酷时钟
Aug 18 Javascript
详解Node.JS模块 process
Aug 31 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 form 表单传参明细研究
2009/07/17 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
thinkPHP简单遍历数组方法分析
2016/05/16 PHP
js变量作用域及可访问性的探讨
2006/11/23 Javascript
javascript 二分法(数组array)
2010/04/24 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
点击显示指定元素隐藏其他同辈元素的方法
2014/02/19 Javascript
nodejs文件操作模块FS(File System)常用函数简明总结
2014/06/05 NodeJs
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
2014/10/17 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
微信小程序实战之登录页面制作(5)
2020/03/30 Javascript
如何开发出更好的JavaScript模块
2017/12/22 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
Python构建图像分类识别器的方法
2019/01/12 Python
python pexpect ssh 远程登录服务器的方法
2019/02/14 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
python定义具名元组实例操作
2021/02/28 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
邮政员工辞职信
2014/01/16 职场文书
调解协议书
2014/04/16 职场文书
超市开业庆典活动策划方案
2014/09/15 职场文书
2015年大学社团工作总结
2015/04/09 职场文书
公路施工安全责任书
2015/05/08 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
用python批量解压带密码的压缩包
2021/05/31 Python
Python爬虫中urllib3与urllib的区别是什么
2021/07/21 Python
前端实现滑动按钮AJAX与后端交互的示例代码
2022/02/24 Javascript
mysql数据库实现设置字段长度
2022/06/10 MySQL
maven 解包依赖项中的文件的解决方法
2022/07/15 Java/Android