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 相关文章推荐
Javascript的匿名函数小结
Dec 31 Javascript
按给定几率进行随机抽取的js代码
Dec 28 Javascript
JS中图片缓冲loading技术的实例代码
Aug 29 Javascript
js超时调用setTimeout和间歇调用setInterval实例分析
Jan 28 Javascript
canvas雪花效果核心代码分享
Feb 19 Javascript
微信小程序 template模板详解及实例
Feb 21 Javascript
微信小程序实现手指触摸画板
Jul 09 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
Aug 15 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
Aug 24 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
Jan 07 Javascript
JS使用new操作符创建对象的方法分析
May 30 Javascript
uniapp与webview之间的相互传值的实现
Jun 29 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 工厂模式使用方法
2010/05/18 PHP
PHP随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
JavaScript SHA512&amp;SHA256加密算法详解
2015/08/11 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
Windows下搭建python开发环境详细步骤
2020/07/20 Python
Python设计模式之抽象工厂模式
2016/08/25 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
python的常用模块之collections模块详解
2018/12/06 Python
Python实现元素等待代码实例
2019/11/11 Python
Python requests模块session代码实例
2020/04/14 Python
基于CSS3实现立方体自转效果
2016/03/01 HTML / CSS
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
商务英语毕业生自荐信范文
2013/11/08 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
产品售后服务承诺书
2014/05/21 职场文书
小学教师个人工作总结2015
2015/04/20 职场文书
初中体育教学随笔
2015/08/15 职场文书
田径运动会广播稿
2015/08/19 职场文书
业余无线电通联Q语
2022/02/18 无线电