Vue 兄弟组件通信的方法(不使用Vuex)


Posted in Javascript onOctober 26, 2017

项目中,我们经常会遇到兄弟组件通信的情况。在大型项目中我们可以通过引入vuex轻松管理各组件之间通信问题,但在一些小型的项目中,我们就没有必要去引入vuex。下面简单介绍一下使用传统方法,实现父子组件通信的方法。

简单实例:我们在a组件中点击按钮,将信息传给b组件,从而使b组件弹出。

Vue 兄弟组件通信的方法(不使用Vuex)

主要的思路就是:先子传父,在父传子

首先我们在 a.vue 组件中 ,给按钮botton绑定一个handleClick事件,事件中我们通过 this.$emit() 方法去触发一个自定义事件,并传递我们的参数。

示例中我们通过this.$emit() 去触发isLogFn 这个方法自定义事件,并将log 参数传递出去

a.vue

<template>
 <div class="adiv">
 <p>a组件</p>
 <button type="button" v-on:click="handleClick">点击打开组件b弹窗</button>
 </div>
</template>

<script>

export default {
 methods: {
 handleClick () {
  this.$emit('isLogFn','log')
 }
 }
}
</script>

<style>
.adiv{
 width: 400px;
 height: 200px;
 border: 1px solid #000;
 margin: 0 auto;
}
</style>

第二步,我们要在父组件中去监听这个自定义事件,去触发对应的方法,并接受a组件传过来的参数。此时我们就完成了子组件向父组件传值的过程。

示例中,<aPage @isLogFn = "lisLogFn"></aPage> 监听isLogFn 去触发我们在父组件中定义的方法lisLogFn,并拿到传过来的 ‘log' 数据。完成子父传值。

到此,整个过程还没有结束,只是完成了一半。接下来我们要完成父子组件传值,将a组件的信息在传给b组件。

在< bPage > 标签中绑定islog 属性,动态绑定data中的login 字段,在我们通过lisLogFn 方法拿到 ‘data'之后,我们要判断 data 传过来的数据,根据判断结果去改变data()中的数据,从而将数据传递给b组件

App.vue

<template>
 <div id="app">
 <aPage @isLogFn = "lisLogFn"></aPage>
 <bPage :isLog = "login"></bPage>
 </div>
</template>

<script>

import aPage from './components/a.vue'
import bPage from './components/b.vue'

export default {
 data () {
 return {
  login: 'false'
 }
 },
 name: 'app',
 components: {
 aPage,
 bPage
 },
 methods: {
 lisLogFn (data) {
  if (data == 'log') {
  this.login = 'true'
  }
 }
 }
}
</script>

<style>
</style>

最后,b组件中需要创建props,定义一个isLog 属性,这个属性就是我们传过来的数值。然后我们在计算属性中处理这个数据,最终供b组件使用。示例中,我们在v-show="isLogin" 中用来控制弹窗是否打开。

切记!不能直接使用这个props,一定要经过computed处理,原因我引用vue官方说明

单向数据流

b.vue

<template>
 <div class="bdiv" v-show="isLogin">我是组件B弹窗</div>
</template>

<script>
export default {
 props: ['isLog'],
 data () {
 return {

 }
 },
 computed: {
 isLogin () {
  if(this.isLog == 'true'){
  return true
  } else {
  return false
  }
 }
 }
}
</script>

<style>
 .bdiv{
 width: 200px;
 height: 200px;
 border: 1px #000 solid;
 margin: 0 auto;
 }

</style>

总结: 想要实现兄弟组件传值,一定要首先熟悉子父,父子之间的传值。

子父:

  1. 子组件中需要以某种方式例如点击事件的方法来触发一个自定义事件
  2. 将需要传的值作为$emit的第二个参数,该值将作为实参传给响应自定义事件的方法
  3. 在父组件中注册子组件并在子组件标签上绑定对自定义事件的监听

父子:

  1. 子组件在props中创建一个属性,用以接收父组件传过来的值
  2. 在子组件标签中添加子组件props中创建的属性,把需要传给子组件的值赋给该属性

文中示例 github 地址:https://github.com/enjoy-pany/vue-emit

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
跟着JQuery API学Jquery 之二 属性
Apr 09 Javascript
JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结
Apr 13 Javascript
分享14个很酷的jQuery导航菜单插件
Apr 25 Javascript
这些年、我收集的JQuery代码小结
Aug 01 Javascript
js 程序执行与顺序实现详解
May 13 Javascript
JavaScript函数定义的常见注意事项小结
Sep 16 Javascript
jQuery实现跨域iframe接口方法调用
Mar 14 Javascript
Javascript 高阶函数使用介绍
Jun 15 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
Mar 22 Javascript
jQuery实现的纵向下拉菜单实例详解【附demo源码下载】
Jul 09 Javascript
详解react如何在组件中获取路由参数
Jun 15 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
Feb 20 Javascript
JS手机端touch事件计算滑动距离的方法示例
Oct 26 #Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
Oct 26 #Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
Oct 26 #Javascript
详述 Sublime Text 打开 GBK 格式中文乱码的解决方法
Oct 26 #Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
Oct 26 #Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
Oct 26 #Javascript
Node.js中环境变量process.env的一些事详解
Oct 26 #Javascript
You might like
隐性调用php程序的方法
2009/03/09 PHP
php strrpos()与strripos()函数
2013/08/31 PHP
详解php中空字符串和0之间的关系
2016/10/23 PHP
PHP数组常用函数实例小结
2018/08/20 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
2015/09/24 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
Angular2中如何使用ngx-translate进行国际化
2017/05/21 Javascript
JavaScript之underscore_动力节点Java学院整理
2017/07/03 Javascript
node.js博客项目开发手记
2018/03/16 Javascript
[07:08]2014DOTA2西雅图国际邀请赛 小组赛7月11日TOPPLAY
2014/07/11 DOTA
pymongo实现控制mongodb中数字字段做加法的方法
2015/03/26 Python
Python实现的字典值比较功能示例
2018/01/08 Python
python实现五子棋小游戏
2020/03/25 Python
Python增强赋值和共享引用注意事项小结
2019/05/28 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
2019/08/24 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
Python线程threading模块用法详解
2020/02/26 Python
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
写自荐信的七个技巧
2013/10/15 职场文书
最新党员思想汇报
2014/01/01 职场文书
员工培训邀请函
2014/01/11 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
《学棋》教后反思
2014/04/14 职场文书
促销活动总结怎么写
2014/06/25 职场文书
水电工岗位职责
2015/02/14 职场文书
自主招生自荐信范文
2015/03/04 职场文书
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python
集英社今正式宣布 成立游戏公司“集英社Games”
2022/03/31 其他游戏