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 相关文章推荐
详解new function(){}和function(){}() 区别分析
Mar 22 Javascript
JS无法捕获滚动条上的mouse up事件的原因猜想
Mar 21 Javascript
JavaScript中的Math 使用介绍
Apr 21 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
Nov 24 Javascript
浅谈在js传递参数中含加号(+)的处理方式
Oct 11 Javascript
浅谈javascript中的事件冒泡和事件捕获
Dec 28 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
Dec 16 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
Sep 02 Javascript
vue-cli3添加模式配置多环境变量的方法
Jun 05 Javascript
layui数据表格跨行自动合并的例子
Sep 02 Javascript
layui 对弹窗 form表单赋值的实现方法
Sep 04 Javascript
谈谈JavaScript令人迷惑的==与+
Aug 31 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+AJAX实现无刷新注册(带用户名实时检测)
2006/12/02 PHP
php 购物车的例子
2009/05/04 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
2016/12/29 PHP
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
node.js实现上传文件功能
2019/07/15 Javascript
JS随机密码生成算法
2019/09/23 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
2019/10/16 Javascript
python使用mailbox打印电子邮件的方法
2015/04/30 Python
python协程用法实例分析
2015/06/04 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
pytorch模型存储的2种实现方法
2020/02/14 Python
阿联酋电子产品购物网站:Menakart
2017/09/15 全球购物
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
师德学习感言
2014/01/31 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
大学生求职信例文
2014/06/29 职场文书
房地产资料员岗位职责
2014/07/02 职场文书
防火标语大全
2014/10/06 职场文书
受资助学生感谢信
2015/01/21 职场文书
辞职信的写法
2015/02/27 职场文书
社区义诊通知
2015/04/24 职场文书
优秀志愿者感言
2015/08/01 职场文书
元素水平垂直居中的方式
2021/03/31 HTML / CSS
MySQL学习总结-基础架构概述
2021/04/05 MySQL
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python
Linux安装apache服务器的配置过程
2021/11/27 Servers
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python