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 LigerUI 使用教程表格篇(1)
Jan 18 Javascript
js判断背景图片是否加载成功使用img的width实现
May 29 Javascript
火狐下table中创建form导致两个table之间出现空白
Sep 02 Javascript
详解jquery uploadify 上传文件
Nov 09 Javascript
JavaScript函数详解
Feb 27 Javascript
详解升级react-router 4 踩坑指南
Aug 14 Javascript
浅谈Node异步编程的机制
Oct 18 Javascript
Vue使用json-server进行后端数据模拟功能
Apr 17 Javascript
使用vue-router为每个路由配置各自的title
Jul 30 Javascript
Vue 中 filter 与 computed 的区别与用法解析
Nov 21 Javascript
JS正则表达式验证密码强度
Mar 18 Javascript
webpack的移动端适配方案小结
Jul 25 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往windows中添加用户
2006/12/06 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
php 常用的系统函数
2017/02/07 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
DHTML Slide Show script图片轮换
2008/03/03 Javascript
关于JavaScript与HTML的交互事件
2013/04/12 Javascript
一个JavaScript的求爱小特效
2014/05/09 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
2015/11/02 Javascript
Node.js实现文件上传
2016/07/05 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
微信小程序-获得用户输入内容
2017/02/13 Javascript
手机端转换rem适应
2017/04/01 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
React 组件渲染和更新的实现代码示例
2019/02/21 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
Python socket编程实例详解
2015/05/27 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
python Yaml、Json、Dict之间的转化
2020/10/19 Python
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
什么是命名空间(NameSpace)
2015/11/24 面试题
工作交流会欢迎词
2014/01/12 职场文书
人力资源部经理岗位职责规定
2014/02/23 职场文书
火箭队口号
2014/06/18 职场文书
营销与策划专业求职信
2014/06/20 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
反邪教警示教育活动总结
2015/05/09 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
vue+elementui 实现新增和修改共用一个弹框的完整代码
2021/06/08 Vue.js
一次Mysql update sql不当引起的生产故障记录
2022/04/01 MySQL