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 相关文章推荐
htm调用JS代码
Mar 15 Javascript
javascript打开新窗口同时关闭旧窗口
Jan 16 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
Oct 06 Javascript
javascript实现的DES加密示例
Oct 30 Javascript
javascript的创建多行字符串的7种方法
Apr 29 Javascript
JQuery的ON()方法支持的所有事件罗列
Feb 28 Javascript
jQuery简单实现日历的方法
May 04 Javascript
js获取页面引用的css样式表中的属性值方法(推荐)
Aug 19 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
Nov 04 Javascript
Webpack优化配置缩小文件搜索范围
Dec 25 Javascript
vue axios 表单提交上传图片的实例
Mar 16 Javascript
vue检测对象和数组的变化分析
Jun 30 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
PHP5+UTF8多文件上传类
2008/10/17 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
PHP使用ODBC连接数据库的方法
2015/07/18 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
转一个日期输入控件,支持FF
2007/04/27 Javascript
JQuery Ajax 跨域访问的解决方案
2010/03/12 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
Vue组件的使用教程详解
2018/01/05 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
js实现网页同时进行多个倒计时功能
2019/02/25 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
关于引入vue.js 文件的知识点总结
2020/01/28 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
python发腾讯微博代码分享
2014/01/10 Python
利用python实现命令行有道词典的方法示例
2017/01/31 Python
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
Python程序暂停的正常处理方法
2019/11/07 Python
Python json读写方式和字典相互转化
2020/04/18 Python
python 基于opencv实现图像增强
2020/12/23 Python
实例教程 纯CSS3打造非常炫的加载动画效果
2014/11/05 HTML / CSS
纯css3实现的动画按钮的实例教程
2014/11/17 HTML / CSS
IE9下html5初试小刀
2010/09/21 HTML / CSS
Geekbuying波兰:购买中国电子产品
2019/10/20 全球购物
香奈儿美国官网:CHANEL美国
2020/05/20 全球购物
上班玩游戏检讨书
2014/02/07 职场文书
春风行动实施方案
2014/03/28 职场文书
会计学自荐信
2014/06/03 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
教师正风肃纪剖析材料
2014/10/20 职场文书
个人工作总结范文2014
2014/11/07 职场文书
2015年宣传部部长竞选演讲稿
2014/11/28 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android