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实例教程(19) 使用HoTMetal(1)
Dec 23 Javascript
用javascript实现的仿Flash广告图片轮换效果
Apr 24 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
Jan 06 Javascript
Javascript alert消息换行的方法
Aug 07 Javascript
jQuery类选择器用法实例
Dec 23 Javascript
学习vue.js计算属性
Dec 03 Javascript
原生js实现弹出层登录拖拽功能
Dec 05 Javascript
Vue异步组件使用详解
Apr 08 Javascript
webpack学习--webpack经典7分钟入门教程
Jun 28 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
Aug 29 Javascript
如何在Vue.js中实现标签页组件详解
Jan 02 Javascript
详解微信小程序轨迹回放实现及遇到的坑
Feb 02 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/11/06 PHP
php使用反射插入对象示例分享
2014/03/11 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
拖动一个HTML元素
2006/12/22 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
NodeJs基本语法和类型
2015/02/13 NodeJs
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
AngularJS实现的锚点楼层跳转功能示例
2018/01/02 Javascript
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
python实现屏保程序(适用于背单词)
2019/07/30 Python
Python实现RabbitMQ6种消息模型的示例代码
2020/03/30 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
html5+svg学习指南之SVG基础知识
2014/12/17 HTML / CSS
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
英国最大的在线时尚眼镜店:Eyewearbrands
2019/03/12 全球购物
党校学习思想汇报
2014/01/06 职场文书
大学生个人事迹材料
2014/01/21 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
谁动了我的奶酪读书笔记
2015/06/30 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python
分享提高 Python 代码的可读性的技巧
2022/03/03 Python
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏