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 相关文章推荐
前后台交互过程中json格式如何解析以及如何生成
Dec 26 Javascript
JS显示日历和天气的方法
Mar 01 Javascript
JavaScript实现复制内容到粘贴板代码
Mar 31 Javascript
关于JS中的方法是否加括号的问题
Jul 27 Javascript
js select实现省市区联动选择
Apr 17 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
May 03 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
Jun 22 Javascript
详解angular路由高亮之RouterLinkActive
Apr 28 Javascript
详解微信小程序调用支付接口支付
Apr 28 Javascript
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
May 05 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
May 22 Javascript
深入解析koa之异步回调处理
Jun 17 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
通过文字传递创建的图形按钮
2006/10/09 PHP
PHP常用的文件操作函数经典收藏
2013/04/02 PHP
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
laravel 实现登陆后返回登陆前的页面方法
2019/10/03 PHP
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
分享一个用Mootools写的鼠标滑过进度条改变进度值的实现代码
2011/12/12 Javascript
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
javascript中加号(+)操作符的一些神奇作用
2014/06/06 Javascript
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
JavaScript实现动态添加,删除行的方法实例详解
2015/07/02 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
浅析Vue项目中使用keep-Alive步骤
2018/07/27 Javascript
Jquery的autocomplete插件用法及参数讲解
2019/03/12 jQuery
详解Vue.directive 自定义指令
2019/03/27 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
JavaScript中的函数申明、函数表达式、箭头函数
2019/12/06 Javascript
Python使用urllib模块的urlopen超时问题解决方法
2014/11/08 Python
Python判断中文字符串是否相等的实例
2018/07/06 Python
Django中使用Celery的方法示例
2018/11/29 Python
使用Python操作FTP实现上传和下载的方法
2019/04/01 Python
python如何求数组连续最大和的示例代码
2020/02/04 Python
Python定义函数实现累计求和操作
2020/05/03 Python
解决Keras自带数据集与预训练model下载太慢问题
2020/06/12 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
初探CSS3中的calc()功能
2015/07/14 HTML / CSS
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
WINDOWS域的具体实现方式是什么
2014/02/20 面试题
个人授权委托书范本格式
2014/10/12 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL