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 相关文章推荐
JavaScript isPrototypeOf和hasOwnProperty使用区别
Mar 04 Javascript
javascript五图轮播切换实用版
Aug 17 Javascript
jquery 实现窗口的最大化不论什么情况
Sep 03 Javascript
jquery 清空file域示例(兼容个浏览器)
Oct 11 Javascript
java和javascript获取word文档的书签位置对比
Jun 19 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
Oct 14 Javascript
js实现TAB切换对应不同颜色的代码
Aug 31 Javascript
Angular.js 实现数字转换汉字实例代码
Jul 14 Javascript
JavaScript纯色二维码变成彩色二维码
Jul 23 Javascript
深入浅出es6模板字符串
Aug 26 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
Oct 08 Javascript
JavaScript实现轮播图效果代码实例
Sep 28 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的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
easyui的tabs update正确用法分享
2014/03/21 PHP
PHP利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
JS在IE和FF下attachEvent,addEventListener学习笔记
2009/11/26 Javascript
jquery模拟LCD 时钟的html文件源代码
2014/06/16 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
ES6新增数据结构WeakSet的用法详解
2017/08/07 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
2018/06/07 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
Python字符串逐字符或逐词反转方法
2015/05/21 Python
Python设置Socket代理及实现远程摄像头控制的例子
2015/11/13 Python
python实现实时监控文件的方法
2016/08/26 Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
2019/04/25 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
纯CSS3实现的井字棋游戏
2020/11/25 HTML / CSS
日本著名的服饰鞋帽综合类购物网站:MAGASEEK
2019/01/09 全球购物
物流专业大学生求职信范文
2013/10/28 职场文书
信息工程学院毕业生推荐信
2013/11/05 职场文书
室内拓展活动方案
2014/02/13 职场文书
2014年幼儿园元旦活动方案
2014/02/13 职场文书
关于元旦的广播稿
2014/02/16 职场文书
学生保证书范文
2014/04/28 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
离婚律师函范本
2015/05/27 职场文书
《夹竹桃》教学反思
2016/02/23 职场文书
安装pytorch时报sslerror错误的解决方案
2021/05/17 Python
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers
python Tkinter模块使用方法详解
2022/04/07 Python