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 冒泡排序 正序和倒序实现代码
Dec 14 Javascript
javascript中sort()的用法实例分析
Jan 30 Javascript
director.js实现前端路由使用实例
Feb 03 Javascript
jquery输入数字随机抽奖特效的简单实现代码
Jun 10 Javascript
bootstrap多层模态框滚动条消失的问题
Jul 21 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
Sep 13 Javascript
微信小程序网络请求封装示例
Jul 24 Javascript
Vue.js轮播图走马灯代码实例(全)
May 08 Javascript
vue3.0 搭建项目总结(详细步骤)
May 20 Javascript
JS实现小星星特效
Dec 24 Javascript
jquery实现垂直手风琴导航栏
Feb 18 jQuery
vue3中的组件间通信
Mar 31 Vue.js
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 array_intersect()函数使用代码
2009/01/14 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
JS 控制非法字符的输入代码
2009/12/04 Javascript
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
vuex 的简单使用
2018/03/22 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
2019/08/27 Javascript
vue实现文件上传读取及下载功能
2020/11/17 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
javascript实现支付宝滑块验证码效果
2020/07/24 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
Python实现拷贝多个文件到同一目录的方法
2016/09/19 Python
python fabric实现远程部署
2017/01/05 Python
Python序列化pickle模块使用详解
2020/03/05 Python
Keras实现DenseNet结构操作
2020/07/06 Python
python time.strptime格式化实例详解
2021/02/03 Python
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
Volcom法国官网:美国冲浪滑板品牌
2017/05/25 全球购物
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
描述RIP和OSPF区别以及特点
2015/01/17 面试题
2013年研究生毕业感言
2014/02/06 职场文书
防邪知识进家庭活动方案
2014/08/26 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
安全第一课观后感
2015/06/18 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书
Python中使用Opencv开发停车位计数器功能
2022/04/04 Python
Golang 遍历二叉树
2022/04/19 Golang
 python中的元类metaclass详情
2022/05/30 Python