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 CSS画图之基础篇
Jul 29 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
Mar 13 Javascript
js模仿php中strtotime()与date()函数实现方法
Aug 11 Javascript
BootStrap中Tab页签切换实例代码
May 30 Javascript
省市选择的简单实现(基于zepto.js)
Jun 21 Javascript
js replace()去除代码中空格的实例
Feb 14 Javascript
关于vuex的学习实践笔记
Apr 05 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
Sep 18 Javascript
对angularjs框架下controller间的传值方法详解
Oct 08 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
Mar 05 Javascript
VUE安装使用教程详解
Jun 03 Javascript
JavaScript的查询机制LHS和RHS解析
Aug 16 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简单实现数组分页的方法
2016/04/30 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
2016/11/09 PHP
基于laravel-admin 后台 列表标签背景的使用方法
2019/10/03 PHP
jquery访问ashx文件示例代码
2014/08/11 Javascript
javascript实现checkbox全选的代码
2015/04/30 Javascript
javascript正则表达式定义(语法)总结
2016/01/08 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
springmvc接收jquery提交的数组数据代码分享
2017/10/28 jQuery
在nginx上部署vue项目(history模式)的方法
2017/12/28 Javascript
angularjs手动识别字符串中的换行符方法
2018/10/02 Javascript
如何在Vue中使用CleaveJS格式化你的输入内容
2018/12/14 Javascript
vue把输入框的内容添加到页面的实例讲解
2019/11/11 Javascript
JS中间件设计模式的深入探讨与实例分析
2020/04/11 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
js动态生成表格(节点操作)
2021/01/12 Javascript
[07:54]DOTA2 MV《我的动力鞋》 ImbaTV 出品
2014/11/21 DOTA
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
Python实现的rsa加密算法详解
2018/01/24 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
2018/03/13 Python
详解python实现识别手写MNIST数字集的程序
2018/08/03 Python
python批量解压zip文件的方法
2019/08/20 Python
如何用Python绘制3D柱形图
2020/09/16 Python
新加坡交友网站:be2新加坡
2019/04/10 全球购物
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
NYX Professional Makeup官方网站:专业彩妆和美容产品
2019/10/29 全球购物
德国苹果商店:MacTrade
2020/05/18 全球购物
《狐假虎威》教学反思
2014/02/07 职场文书
村党支部书记承诺书
2014/05/29 职场文书
喝酒驾驶检讨书
2014/10/01 职场文书
离婚民事起诉状
2015/08/03 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
mysql数据库如何转移到oracle
2022/12/24 MySQL