Vue组件中的data必须是一个function的原因浅析


Posted in Javascript onSeptember 03, 2018

组件可以有自己的data,并且data必须是一个function。

在下面这个例子中,data 返回了一个在外部定义的对象。并且这个组件在页面中使用了3次,点击+1时出现了如下情况:data中的count属性影响到了所有实例。

Vue组件中的data必须是一个function的原因浅析

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <link rel="stylesheet" type="text/css" href="../css/bootstrap.css" rel="external nofollow" >
  <style type="text/css">
 #app{
  margin:20px;
 }
  </style>
 </head>
<body>
 <div id='app'>
  <counter></counter>
  <counter></counter>
  <counter></counter>
 </div>
 <template id="tmp1">
  <div>
   <input type="button" value="+1" @click="increment">
   <h1>{{count}}</h1>
  </div>
 </template>
</body>
<script src="../lib/vue.js"></script>
<script>
 var dataObj = {count:0}
 //这是一个计数器组件,每当点击按钮,让data中的count值加1
 Vue.component('counter',{
  template:'#tmp1',
  data:function(){
   return dataObj
  },
  methods:{
   increment(){
    this.count++
   }
  }
 })
 var vm = new Vue({
  el:'#app',
 })
</script>
</html>

而当data选项是一个函数的时候,每个实例可以维护一份被返回对象的独立的拷贝,这样各个实例中的data不会相互影响,是独立的。

Vue.component('counter',{
  template:'#tmp1',
  data:function(){
   return {count:0}
  },
  methods:{
   increment(){
    this.count++
   }
  }
 })

Vue组件中的data必须是一个function的原因浅析

  补充:下面看下vue组件中data必须是一个函数的原因

  vue组件中data值不能为对象,因为对象是引用类型,组件可能会被多个实例同时引用。如果data值为对象,将导致多个实例共享一个对象,其中一个组件改变data属性值,其它实例也会受到影响。

上面解释了data不能为对象的原因,这里我们简单说下data为函数的原因。data为函数,通过return 返回对象的拷贝,致使每个实例都有自己独立的对象,实例之间可以互不影响的改变data属性值。

data为函数的示例:

data:function(){
  return {
      k1: 'v1',
      k2: 'v2',
    ...
  }
}

总结

以上所述是小编给大家介绍的Vue组件中的data必须是一个function的原因浅析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
extjs grid设置某列背景颜色和字体颜色的实现方法
Sep 06 Javascript
PHP中CURL的几个经典应用实例
Jan 23 Javascript
javascript实现加载xml文件的方法
Nov 24 Javascript
Jquery和JS获取ul中li标签的实现方法
Jun 02 Javascript
浅谈js中几种实用的跨域方法原理详解
Dec 02 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
Dec 24 Javascript
简单实现js倒计时功能
Feb 13 Javascript
微信小程序商城项目之淘宝分类入口(2)
Apr 17 Javascript
BootStrap实现文件上传并带有进度条效果
Sep 11 Javascript
浅谈Node.js爬虫之网页请求模块
Jan 11 Javascript
深入理解es6块级作用域的使用
Mar 28 Javascript
Vue 图片压缩并上传至服务器功能
Jan 15 Javascript
ES6中let 和 const 的新特性
Sep 03 #Javascript
Angular项目如何升级至Angular6步骤全纪录
Sep 03 #Javascript
vue 中滚动条始终定位在底部的方法
Sep 03 #Javascript
前后端如何实现登录token拦截校验详解
Sep 03 #Javascript
vue移动端监听滚动条高度的实现方法
Sep 03 #Javascript
vue 纯js监听滚动条到底部的实例讲解
Sep 03 #Javascript
解决vue.js this.$router.push无效的问题
Sep 03 #Javascript
You might like
PHP伪造referer实例代码
2008/09/20 PHP
php实现mysql同步的实现方法
2009/10/21 PHP
深入理解PHP中的Session和Cookie
2013/06/21 PHP
WordPress中调试缩略图的相关PHP函数使用解析
2016/01/07 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
学习ExtJS 访问容器对象
2009/10/07 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
jquery模拟LCD 时钟的html文件源代码
2014/06/16 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
javascript自定义函数参数传递为字符串格式
2014/07/29 Javascript
jquery图片切换插件
2015/03/16 Javascript
JavaScript多线程详解
2015/08/12 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
2016/04/26 Javascript
Node.js实现兼容IE789的文件上传进度条
2016/09/02 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
js获取元素下的第一级子元素的方法(推荐)
2017/03/05 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
Vue实现简单计算器案例
2020/02/25 Javascript
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
2014/10/23 Python
python中查看变量内存地址的方法
2015/05/05 Python
Python的Django框架中URLconf相关的一些技巧整理
2015/07/18 Python
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
python书籍信息爬虫实例
2018/03/19 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
2018/12/20 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
教师评优的个人自我评价分享
2013/09/19 职场文书
应届毕业生求职自荐书
2014/01/03 职场文书
文明寝室申报材料
2014/05/12 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
win10清理dns缓存
2022/04/19 数码科技