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编程起步(第四课)
Jan 10 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
Apr 26 Javascript
Vue表单实例代码
Sep 05 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
Dec 04 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
Mar 02 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
May 26 Javascript
讲解vue-router之什么是嵌套路由
May 28 Javascript
详解基于vue的服务端渲染框架NUXT
Jun 20 Javascript
JavaScript引用类型Array实例分析
Jul 24 Javascript
详解小程序输入框闪烁及重影BUG解决方案
Aug 31 Javascript
vue-cli项目代理proxyTable配置exclude的方法
Sep 20 Javascript
layui框架与SSM前后台交互的方法
Sep 12 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
PHPMailer使用教程(PHPMailer发送邮件实例分析)
2012/12/06 PHP
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
php用正则表达式匹配中文实例详解
2013/11/06 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
JSON 入门指南 想了解json的朋友可以看下
2009/08/26 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
最棒的Angular2表格控件
2016/08/10 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
jquery.cookie.js的介绍与使用方法
2017/02/09 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
javaScript中的空值和假值
2017/12/18 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
[15:09]DOTA2国际邀请赛采访专栏:Loda
2013/08/06 DOTA
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
简单介绍Python中用于求最小值的min()方法
2015/05/15 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
Python实现读取Properties配置文件的方法
2018/03/29 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
高一新生军训方案
2014/05/12 职场文书
小学生保护环境倡议书
2014/05/15 职场文书
离退休人员聘用协议书
2014/11/24 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
解析laravel使用workerman用户交互、服务器交互
2021/04/28 PHP
python神经网络编程之手写数字识别
2021/05/08 Python
Python图像处理库PIL详细使用说明
2022/04/06 Python
vue elementUI表格控制对应列
2022/04/13 Vue.js