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词法作用域与调用对象深入理解
Nov 29 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
Mar 31 Javascript
jQuery实现移动端手机商城购物车功能
Sep 24 Javascript
Angularjs 创建可复用组件实例代码
Oct 09 Javascript
canvas绘制的直线动画
Jan 23 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
Dec 07 Javascript
常用的9个JavaScript图表库详解
Dec 19 Javascript
除Console.log()外更多的Javascript调试命令
Jan 24 Javascript
JS与jQuery判断文本框还剩多少字符可以输入的方法
Sep 01 jQuery
vue请求服务器数据后绑定不上的解决方法
Oct 30 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
Nov 14 Javascript
JS图片懒加载技术实现过程解析
Jul 27 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数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
解析yii数据库的增删查改
2013/06/20 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
PHP最常用的正则表达式
2017/02/13 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
js replace正则表达式应用案例讲解
2013/01/17 Javascript
鼠标经过显示二级菜单js特效
2013/08/13 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
2014/07/06 Javascript
js在IE与firefox的差异集锦
2014/11/11 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
JavaScript中的bold()方法使用详解
2015/06/08 Javascript
SWFObject基本用法实例分析
2015/07/20 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
2016/06/02 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
Angular 组件之间的交互的示例代码
2018/03/24 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
2020/02/12 Javascript
[09:59]DOTA2-DPC中国联赛2月7日Recap集锦
2021/03/11 DOTA
Python中字典和集合学习小结
2017/07/07 Python
python机器学习实战之树回归详解
2017/12/20 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
python实现简单图片物体标注工具
2019/03/18 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
python如何控制进程或者线程的个数
2020/10/16 Python
多视角3D可旋转的HTML5 Logo动画
2016/03/02 HTML / CSS
AOP的定义以及作用
2013/09/08 面试题
艺术设计专业求职自荐信
2014/05/19 职场文书
收费员岗位职责
2015/02/14 职场文书
银行自荐信怎么写
2015/03/05 职场文书
实习单位推荐信
2015/03/27 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle