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插件化开发教程(五)
Feb 01 Javascript
js通过iframe加载外部网页的实现代码
Apr 05 Javascript
jQuery版本升级踩坑大全
Jan 12 Javascript
jQuery实现HTML表格单元格的合并功能
Apr 06 Javascript
Vue.js双向绑定操作技巧(初级入门)
Dec 27 Javascript
浅谈Webpack自动化构建实践指南
Dec 18 Javascript
小程序tab页无法传递参数的方法
Aug 03 Javascript
Node 搭建一个静态资源服务器的实现
May 20 Javascript
微信小程序保持session会话的方法
Mar 20 Javascript
vue抽出组件并传值实例
Jul 31 Javascript
Vue中强制组件重新渲染的正确方法
Jan 03 Vue.js
JavaScript流程控制(分支)
Dec 06 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 文件夹删除、php清除缓存程序
2009/08/25 PHP
使用 PHPMAILER 发送邮件实例应用
2012/11/07 PHP
php判断文件上传类型及过滤不安全数据的方法
2014/12/17 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
2018/01/29 PHP
javascript 动态设置已知select的option的value值的代码
2009/12/16 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
用innerhtml提高页面打开速度的方法
2013/08/02 Javascript
动态加载脚本提升javascript性能
2014/02/24 Javascript
jquery禁用右键示例
2014/04/28 Javascript
火狐下input焦点无法重复获取问题的解决方法
2014/06/16 Javascript
JavaScript中Null与Undefined的区别解析
2015/06/30 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
javascript适合移动端的日期时间拾取器
2015/11/10 Javascript
学习JavaScript设计模式之享元模式
2016/01/18 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
domReady的实现案例
2016/11/23 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
2019/05/22 Javascript
vuex实现购物车的增加减少移除
2020/06/28 Javascript
进一步探究Python中的正则表达式
2015/04/28 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
Python使用flask框架操作sqlite3的两种方式
2018/01/31 Python
Python实现Kmeans聚类算法
2020/06/10 Python
python smtplib模块自动收发邮件功能(一)
2018/05/22 Python
python3爬取数据至mysql的方法
2018/06/26 Python
python交易记录链的实现过程详解
2019/07/03 Python
python 操作mysql数据中fetchone()和fetchall()方式
2020/05/15 Python
python3爬虫中多线程的优势总结
2020/11/24 Python
Python 内存管理机制全面分析
2021/01/16 Python
拉歌口号大全
2014/06/13 职场文书
商场租赁意向书
2014/07/30 职场文书
2014年销售经理工作总结
2014/12/01 职场文书
三好学生主要事迹材料
2015/11/03 职场文书