详解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学习笔记(五) Array 数组类型介绍
Jun 19 Javascript
使用JS CSS去除IE链接虚线框的三种方法
Nov 14 Javascript
图片翻转效果具体实现代码
Jan 09 Javascript
jQuery中bind与live的用法及区别小结
Jan 27 Javascript
深入理解Javascript里的依赖注入
Mar 19 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
Jul 01 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
Dec 23 Javascript
Angular CLI在Angular项目中如何使用scss详解
Apr 10 Javascript
Vue刷新修改页面中数据的方法
Sep 16 Javascript
使用JS location实现搜索框历史记录功能
Dec 23 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
Dec 09 Javascript
JavaScript 与 TypeScript之间的联系
Nov 27 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
怎样辨别一杯好咖啡
2021/03/03 新手入门
php Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
PHP判断变量是否为0的方法
2014/02/08 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
2款PHP无限级分类实例代码
2015/11/11 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
纯js实现图片匀速淡入淡出效果
2017/08/22 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
js中的闭包学习心得
2018/02/06 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
详解Python命令行解析工具Argparse
2016/04/20 Python
深入理解Python装饰器
2016/07/27 Python
python 打印对象的所有属性值的方法
2016/09/11 Python
Python多进程multiprocessing.Pool类详解
2018/04/27 Python
对python Tkinter Text的用法详解
2018/10/11 Python
浅谈Pycharm调用同级目录下的py脚本bug
2018/12/03 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
Python流程控制 if else实现解析
2019/09/02 Python
python如何获取apk的packagename和activity
2020/01/10 Python
Python sys模块常用方法解析
2020/02/20 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
HTML5的标签的代码的简单介绍 HTML5标签的简介
2012/05/28 HTML / CSS
大学第二课堂活动总结
2014/07/08 职场文书
国际经济与贸易专业求职信
2014/07/10 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
小学生安全保证书
2015/05/09 职场文书
纯html+css实现奥运五环的示例代码
2021/08/02 HTML / CSS