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 相关文章推荐
jQuery DOM操作小结与实例
Jan 07 Javascript
jQuery EasyUI 的EasyLoader功能介绍
Sep 12 Javascript
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
May 14 Javascript
jQuery设置div一直在页面顶部显示的方法
Oct 24 Javascript
javascript实现的右下角弹窗实例
Apr 24 Javascript
javascript中eval函数用法分析
Apr 25 Javascript
自己动手写的javascript前端等待控件
Oct 30 Javascript
JS无缝滚动效果实现方法分析
Dec 21 Javascript
ES6新数据结构Map功能与用法示例
Mar 31 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
Jul 19 Javascript
基于axios封装fetch方法及调用实例
Feb 05 Javascript
vite2.0+vue3移动端项目实战详解
Mar 03 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
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
php源代码安装常见错误与解决办法分享
2013/05/28 PHP
php封装的验证码工具类完整实例
2016/10/19 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
JavaScript 高级语法介绍
2009/06/15 Javascript
js setattribute批量设置css样式
2009/11/26 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
JS运动基础框架实例分析
2015/03/03 Javascript
JQuery中DOM事件合成用法实例分析
2015/06/13 Javascript
浅析上传头像示例及其注意事项
2016/12/14 Javascript
js的三种继承方式详解
2017/01/21 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
js实现手机web图片左右滑动效果
2017/12/29 Javascript
JavaScript实现一个简易的计算器实例代码
2018/05/10 Javascript
vue+iview动态渲染表格详解
2019/03/19 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
js实现飞机大战游戏
2020/08/26 Javascript
[01:06:39]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第三局
2016/03/02 DOTA
python在新的图片窗口显示图片(图像)的方法
2019/07/11 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
2020/01/06 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
高中生毕业学习总结的自我评价
2013/11/14 职场文书
《登鹳雀楼》教学反思
2014/04/09 职场文书
毕业评语大全
2014/05/04 职场文书
消防安全宣传标语
2014/06/07 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
殡葬服务心得体会
2014/09/11 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python
Python编程super应用场景及示例解析
2021/10/05 Python