详解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异步编程的4种方法让你写出更出色的程序
Jan 17 Javascript
javascript得到当前页的来路即前一页地址的方法
Feb 18 Javascript
jQuery焦点图切换简易插件制作过程全纪录
Aug 27 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
Jan 18 Javascript
JS区分浏览器页面是刷新还是关闭
Apr 17 Javascript
微信小程序 radio单选框组件详解及实例代码
Jan 10 Javascript
详解VueJS 数据驱动和依赖追踪分析
Jul 26 Javascript
基于构造函数的五种继承方法小结
Jul 27 Javascript
基于VUE.JS的移动端框架Mint UI的使用
Oct 11 Javascript
微信小程序保存图片到相册权限设置
Apr 09 Javascript
vue 实现把路由单独分离出来
Aug 13 Javascript
JS前端宏任务微任务及Event Loop使用详解
Jul 23 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性能优化准备篇图解PEAR安装
2011/12/05 PHP
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
百度 popup.js 完美修正版非常的不错 脚本之家推荐
2009/04/17 Javascript
js 蒙版进度条(结合图片)
2010/03/10 Javascript
window.ActiveXObject使用说明
2010/11/08 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
jquery实现键盘左右翻页特效
2015/04/30 Javascript
javascript实现删除前弹出确认框
2015/06/04 Javascript
javascript实现框架高度随内容改变的方法
2015/07/23 Javascript
jQuery插件支持同一页面被多次调用
2016/02/14 Javascript
阻止表单提交按钮多次提交的完美解决方法
2016/05/16 Javascript
JavaScript数值千分位格式化的两种简单实现方法
2016/08/01 Javascript
解决JS外部文件中文注释出现乱码问题
2017/07/09 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
[00:35]DOTA2上海特级锦标赛 EG战队宣传片
2016/03/04 DOTA
Python入门篇之条件、循环
2014/10/17 Python
python3.5仿微软计算器程序
2020/03/30 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
2019/06/13 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
Python使用xlrd实现读取合并单元格
2020/07/09 Python
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
英国最红的高街时尚品牌:Topshop
2016/08/05 全球购物
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
英国最大的独立摄影零售商:Park Cameras
2019/11/27 全球购物
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
运输服务质量承诺书
2014/03/27 职场文书
索赔员岗位职责
2015/02/15 职场文书
原生JS实现飞机大战小游戏
2021/06/09 Javascript
Vite + React从零开始搭建一个开源组件库
2022/06/25 Javascript