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 相关文章推荐
Prototype使用指南之dom.js
Jan 10 Javascript
js实现按钮加背景图片常用方法
Nov 01 Javascript
jQuery的position()方法详解
Jul 19 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
Jul 30 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
Aug 10 Javascript
JavaScript文本框脚本编写的注意事项
Jan 25 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
May 16 Javascript
基于 jQuery 实现键盘事件监听控件
Apr 04 jQuery
微信小程序云开发实现数据添加、查询和分页
May 17 Javascript
vue h5移动端禁止缩放代码
Oct 28 Javascript
如何在微信小程序中使用骨架屏的步骤
Jun 12 Javascript
Vue点击切换Class变化,实现Active当前样式操作
Jul 17 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
ie6 动态缩略图不显示的原因
2009/06/21 PHP
php之CodeIgniter学习笔记
2013/06/17 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
thinkphp3.2框架中where条件查询用法总结
2019/08/13 PHP
prototype 1.5 &amp; scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
看了就知道什么是JSON
2007/12/09 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
有关json_decode乱码及NULL的问题
2015/10/13 Javascript
AngularJS中的DOM操作用法分析
2016/11/04 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
python中enumerate的用法实例解析
2014/08/18 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
pip matplotlib报错equired packages can not be built解决
2018/01/06 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
python如何实现word批量转HTML
2020/09/30 Python
美国演唱会订票网站:Ticketmaster美国
2017/10/05 全球购物
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
SneakerStudio英国:最佳运动鞋商店
2019/05/22 全球购物
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
外企C语言笔试题
2013/11/10 面试题
应届生求职自荐信范文
2014/04/07 职场文书
党员四风剖析材料
2014/08/27 职场文书
高等学院职业生涯规划书范文
2014/09/16 职场文书
2014学校领导四风对照检查材料思想汇报
2014/09/23 职场文书
社区母亲节活动总结
2015/02/10 职场文书
龙猫观后感
2015/06/09 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL