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实现textarea输入字符控制(仿微博输入控制字符)
Apr 26 Javascript
jquery使用jxl插件导出excel示例
Apr 14 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
Aug 10 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
Aug 12 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
Sep 09 Javascript
JS实现的数组去除重复数据算法小结
Nov 17 Javascript
webstorm和.vue中es6语法报错的解决方法
May 08 Javascript
基于webpack4搭建的react项目框架的方法
Jun 30 Javascript
vue生命周期实例小结
Aug 15 Javascript
使用angularjs.foreach时return的问题解决
Sep 30 Javascript
Node.js path模块,获取文件后缀名操作
Nov 07 Javascript
vue实现抽屉弹窗效果
Nov 15 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
Windows下的PHP5.0详解
2006/11/18 PHP
php网站来路获取代码(针对搜索引擎)
2010/06/08 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
2019/12/13 PHP
基于Jquery的简单图片切换效果
2011/01/06 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
2013/01/24 Javascript
js 获取后台的字段 改变 checkbox的被选中的状态 代码
2013/06/05 Javascript
JavaScript instanceof 的使用方法示例介绍
2013/10/23 Javascript
深入浅析JavaScript中数据共享和数据传递
2016/04/25 Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
2016/12/02 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
老生常谈javascript的面向对象思想
2017/08/22 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
Flexible.js可伸缩布局实现方法详解
2020/11/13 Javascript
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
python使用socket进行简单网络连接的方法
2015/04/29 Python
Django框架教程之正则表达式URL误区详解
2018/01/28 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
详解Python中的文件操作
2021/01/14 Python
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
法国最大的在线眼镜店:EasyLunettes
2019/08/26 全球购物
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
介绍一下Linux文件的记录形式
2012/04/18 面试题
大学生个人学年总结
2015/02/15 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL