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对JSON数据进行排序输出的方法
Jun 24 Javascript
JS实现仿QQ效果的三级竖向菜单
Sep 25 Javascript
JS提交form表单实例分析
Dec 10 Javascript
基于JavaScript实现类似于百度学术高级检索功能
Mar 02 Javascript
深入理解Node中的buffer模块
Jun 03 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
Oct 17 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
Apr 18 Javascript
[原创]jquery判断元素内容是否为空的方法
May 04 jQuery
js比较两个单独的数组或对象是否相等的实例代码
Apr 28 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
Oct 31 Javascript
Vue使用Element实现增删改查+打包的步骤
Nov 25 Vue.js
JavaScript原型链中函数和对象的理解
Jun 16 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安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
2013/07/05 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
php抽象类和接口知识点整理总结
2019/08/02 PHP
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
JSONP之我见
2015/03/24 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
JavaScript数组各种常见用法实例分析
2015/08/04 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
jQuery Masonry瀑布流布局神器使用详解
2017/05/25 jQuery
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
layui 给数据表格加序号的方法
2018/08/20 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
微信小程序实现时间进度条功能
2020/11/17 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
vue 使用async写数字动态加载效果案例
2020/07/18 Javascript
[04:54]DOTA2-DPC中国联赛1月31日Recap集锦
2021/03/11 DOTA
python pandas实现excel转为html格式的方法
2018/10/23 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
python利用selenium进行浏览器爬虫
2019/04/25 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
Autopep8的使用(python自动编排工具)
2021/03/02 Python
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
斯洛伐克香水和化妆品购物网站:Parfemy-Elnino.sk
2020/01/28 全球购物
文化宣传方案
2014/03/13 职场文书
保护环境倡议书100字
2014/05/19 职场文书
严以用权学习心得体会
2016/01/12 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL