vue组件中的数据传递方法


Posted in Javascript onMay 14, 2018

Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据。必须使用特定的方法才能实现组件之间的数据传递。组件之间传递数据大致分为三种情况:

父组件向子组件传递数据,通过 props 传递数据。

子组件向父组件传递数据,通过 events 传递数据。

两个同级组件之间传递数据,通过 event bus 传递数据。

一、父组件向子组件传递数据

子组件部分:

<template>
  <div class="child">
    {{ msg }}
  </div>
</template>
<script>
export default {
 name: 'child',
 data(){
  return {
  
  }
 },
 props: ['msg']
</script>

在child.vue中,msg实在data中定义的变量,使用props:['msg']从父组件中获取msg的值

父组件部分:

<template>
  <div class="child">
    child
    <child :msg="message"></child>
  </div>
</template>
<script>
import child from './child.vue'
export default {
 name: 'parent',
 components: { child },
 data () {
  return {
   message: 'hello vue'
  }
 }
}
</script>

在调用组件的时候,使用v-bind将msg的值绑定为parent.vue中定义的变量message,这样就能将parent.vue中的message的值传给child.vue了。

单项数据流

当父组件的 message 发生改变,子组件也会自动地更新视图。但是在子组件中,我们不要去修改 prop。如果你必须要修改到这些数据,你可以使用以下方法:

方法一:把 prop 赋值给一个局部变量,然后需要修改的话就修改这个局部变量,而不影响 prop

export default {
  data(){
    return {
      newMessage: null
    } 
  },
  props: ['message'],
  created(){
    this.newMessage = this.message;
  }
}

方法二:在计算属性中对 prop 进行处理

export default {
  props: ['message'],
  computed: {
    newMessage(){
      return this.message + ' 哈哈哈';
    }
  }
}

二、子组件向父组件传递数据

子组件主要通过实践传递数据给父组件的

子组件部分:

<template>
  <div class="child">
   <span>用户名:</span>
   <input v-model="username" @change="sendUser" />
  </div>
</template>

子组件的html中,当input中的值发生改变时,将username传递给parent.vue。

首先声明了一个sendUser方法,用change事件来调用sendUser。

<script>
 export default {
  name: 'parend',
  data () {
   return {
     username: ''
   }
  },
  methods: {
   sendUser () {
    this.$emit('changeName', this.username)
   }
  }
}
</script>

在sendUser中,使用$emit来遍历changeName事件,并返回this.name,其中changeName是一个自定义的事件,功能类似于一个中转,this.name将通过这个事件传递给父组件。

父组件部分:

<template>
  <div class="parent">
    <child @changeName="getUser"></child>
    <p>用户名:{{user}}</p>
  </div>
</template>

在父组件中声明了一个getUser方法,用changeName事件调用getUser方法,获取从子组件传递过来的参数username

<script>
import child from './child.vue'
export default {
 name: 'parent',
 components: { child },
 data () {
  return {
   user: ''
  }
 },
 methods: {
  getUser(data) {
   this.user = data
  }
 }
}
</script>

getUser方法中的参数msg就是从子组件中传递过来的参数uesrname。

三、同级组件间的数据传递

有时候两个组件也需要通信(非父子关系)。当然Vue2.0提供了Vuex,但在简单的场景下,可以使用一个空的Vue实例作为中央事件总线。

<template>
  <div id="app">
    <c1></c1>  //组件1
    <c2></c2> //组件2
  </div>
</template>

组件c1中:

<template>
  <div class="c1">
    page
    <button @click="changeMsg">click</button>
  </div>
</template>
<script>
var Bus = new Vue(); //为了方便将Bus(空vue)定义在一个组件中,在实际的运用中一般会新建一Bus.js
export default {
 name: 'c1',
 data () {
  return {
   message: 'hi'
  }
 },
 methods: {
  changeMsg () {  //点击按钮,将this.message传递给c2
   bus.$emit('sendMsg', this.message)
  }
 }
}
</script>

组件c2中:

<template>
  <div class="c2">
    {{msg}}
  </div>
</template>

<script>
var Bus = new Vue();

export default {
 name: 'c2',
 data () {
  return {
   msg: ''
  }
 },
 created () {
  bus.$on('sendMsg',(data)=>{  //data即为c1组件中的message
   this.msg = data
  })
 }
}
</script>

在实际运用中,一般将bus抽离出来:

//Bus.js
import Vue from 'vue'
const Bus = new Vue()
expore default Bus

组件调用时引用(import Bus from './Bus.js')

但这种引入方式,经过webpack打包后可能会出现Bus局部作用域的情况,即引用的是两个不同的Bus,导致不能正常通信
实际运用:

将Bus注入到Vue根对象中

import Vue from 'vue'
const Bus = new Vue()
var app= new Vue({
  el:'#app',
 data:{


Bus
  }

})

在子组件中通过this.$root.Bus.$on(),this.$root.Bus.$emit()来调用

总结

以上所述是小编给大家介绍的vue组件中的数据传递方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
DOM2非标准但却支持很好的几个属性小结
Jan 21 Javascript
JavaScript/jQuery 表单美化插件小结
Feb 14 Javascript
JavaScript中把数字转换为字符串的程序代码
Jun 19 Javascript
浅析AngularJS中的生命周期和延迟处理
Jun 18 Javascript
使用jQuery在对象中缓存选择器的简单方法
Jun 30 Javascript
Web程序员必备的7个JavaScript函数
Jun 14 Javascript
jQuery Raty 一款不错的星级评分插件
Aug 24 Javascript
React 子组件向父组件传值的方法
Jul 24 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
Nov 19 Javascript
jQuery length 和 size()区别总结
Apr 26 jQuery
详解Angular-ui-BootStrap组件的解释以及使用
Jul 13 Javascript
微信小程序调用摄像头隐藏式拍照功能
Aug 22 Javascript
vue如何在自定义组件中使用v-model
May 14 #Javascript
JavaScript常用数学函数用法示例
May 14 #Javascript
JavaScript中常见内置函数用法示例
May 14 #Javascript
纯js封装的ajax功能函数与用法示例
May 14 #Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
May 14 #Javascript
vue动态绑定组件子父组件多表单验证功能的实现代码
May 14 #Javascript
jQuery中元素选择器(element)简单用法示例
May 14 #jQuery
You might like
PHP获取时间排除周六、周日的两个方法
2014/06/30 PHP
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
PHP实现递归目录的5种方法
2016/10/27 PHP
PHP与Web页面交互操作实例分析
2020/06/02 PHP
PHP SESSION跨页面传递失败解决方案
2020/12/11 PHP
图片按比例缩放函数
2006/06/26 Javascript
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
tangram框架响应式加载图片方法
2013/11/21 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
原生js更改css样式的两种方式
2017/03/15 Javascript
Javascript实现运算符重载详解
2018/04/07 Javascript
React 路由懒加载的几种实现方案
2018/10/23 Javascript
python获取beautifulphoto随机某图片代码实例
2013/12/18 Python
详解在Python中处理异常的教程
2015/05/24 Python
通过数据库对Django进行删除字段和删除模型的操作
2015/07/21 Python
Python的shutil模块中文件的复制操作函数详解
2016/07/05 Python
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
Python 异常处理的实例详解
2017/09/11 Python
Python get获取页面cookie代码实例
2018/09/12 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
2019/04/15 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
您在慕尼黑的跑步商店:Lauf-bar
2019/10/11 全球购物
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
物流专业大学生的自我鉴定
2013/11/13 职场文书
注塑工厂厂长岗位职责
2013/12/02 职场文书
合伙协议书范本
2014/04/21 职场文书
专题组织生活会方案
2014/06/15 职场文书
好的旅游活动方案
2014/08/19 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
资源环境与城乡规划管理专业自荐书
2014/09/26 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
2015年保险公司内勤工作总结
2015/05/23 职场文书
Django基础CBV装饰器和中间件
2022/03/22 Python
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript
Python实现简单得递归下降Parser
2022/05/02 Python