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 相关文章推荐
IE和Firefox下event事件杂谈
Dec 18 Javascript
Jquery+WebService 校验账号是否已被注册的代码
Jul 12 Javascript
ExtJs 表单提交登陆实现代码
Aug 19 Javascript
Ext对基本类型的扩展 ext,extjs,format
Dec 25 Javascript
使用focus方法让光标默认停留在INPUT框
Jul 29 Javascript
深入分析jquery解析json数据
Dec 09 Javascript
使用js画图之圆、弧、扇形
Jan 12 Javascript
Bootstrap学习笔记之css样式设计(2)
Jun 07 Javascript
js实现获取两个日期之间所有日期的方法
Jun 17 Javascript
ES6 Promise对象概念与用法分析
Apr 01 Javascript
Webpack如何引入bootstrap的方法
Jun 17 Javascript
Node.js+Express+MySql实现用户登录注册功能
Jul 10 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学习之数组值的操作
2011/04/17 PHP
php将fileterms函数返回的结果变成可读的形式
2011/04/21 PHP
Yii实现MySQL多数据库和读写分离实例分析
2014/12/03 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
2015/10/27 PHP
php实现socket推送技术的示例
2017/12/20 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
IE中jscript/javascript的条件编译
2006/09/07 Javascript
javascript 事件查询综合 推荐收藏
2010/03/10 Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
2010/11/05 Javascript
JS中window.open全屏命令解析及使用示例
2013/12/11 Javascript
DIV始终居中的js代码
2014/02/17 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
详解JavaScript的while循环的使用
2015/06/03 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
jquery实现简单实用的轮播器
2017/05/23 jQuery
基于iview的router常用控制方式
2019/05/30 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
[10:21]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster 选手采访
2021/03/11 DOTA
Python通过DOM和SAX方式解析XML的应用实例分享
2015/11/16 Python
Django接受前端数据的几种方法总结
2016/11/04 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
Python threading的使用方法解析
2019/08/28 Python
python多环境切换及pyenv使用过程详解
2019/09/27 Python
Python动态导入模块和反射机制详解
2020/02/18 Python
基于python实现可视化生成二维码工具
2020/07/08 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
2014年五四青年节演讲比赛方案
2014/04/22 职场文书
市场营销毕业求职信
2014/08/07 职场文书