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 相关文章推荐
被遗忘的javascript的slice() 方法
Apr 20 Javascript
详解AngularJS中自定义过滤器
Dec 28 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
Apr 18 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
Oct 07 Javascript
Node.js开启Https的实践详解
Oct 25 Javascript
Bootstrap popover用法详解
Dec 22 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
Aug 10 Javascript
js实现下拉框二级联动
Dec 04 Javascript
微信小程序实现单选选项卡切换效果
Jun 19 Javascript
Angular中innerHTML标签的样式不起作用的原因解析
Jun 18 Javascript
vue登录以及权限验证相关的实现
Oct 25 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
Nov 05 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 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
php面向对象编程self和static的区别
2016/05/08 PHP
php时间计算相关问题小结
2016/05/09 PHP
php 读取文件夹下所有图片、文件的实例
2018/10/17 PHP
PHP使用PDO操作sqlite数据库应用案例
2019/03/07 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
2007/02/09 Javascript
jQuery UI Dialog 创建友好的弹出对话框实现代码
2012/04/12 Javascript
js中escape对应的C#解码函数 UrlDecode
2012/12/16 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
Flow之一个新的Javascript静态类型检查器
2015/12/21 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
2016/03/28 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python网络编程之TCP通信实例和socketserver框架使用例子
2014/04/25 Python
Python中的模块和包概念介绍
2015/04/13 Python
Python多线程threading和multiprocessing模块实例解析
2018/01/29 Python
使用实现XlsxWriter创建Excel文件并编辑
2018/05/04 Python
python如何通过pyqt5实现进度条
2020/01/20 Python
远程学习的教学用品和家庭学习资源:Really Good Stuff
2020/04/27 全球购物
美发店5.1活动方案
2014/01/24 职场文书
《孔繁森》教学反思
2014/04/17 职场文书
国旗下演讲稿
2014/05/08 职场文书
环保倡议书100字
2014/05/15 职场文书
法制宣传口号
2014/06/16 职场文书
学习党的群众路线实践活动思想汇报
2014/09/12 职场文书
建筑工地文明标语
2014/10/09 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
校长个人总结
2015/03/03 职场文书
起诉意见书范文
2015/05/19 职场文书
某某幼儿园的教育教学管理调研分析报告
2019/11/29 职场文书