如何使用vuex实现兄弟组件通信


Posted in Javascript onNovember 02, 2018

前言

vuex主要是是做数据交互,父子组件传值可以很容易办到,但是兄弟组件间传值,需要先将值传给父组件,再传给子组件,异常麻烦。

下面这篇文章就来给大家介绍下vuex兄弟组件通信的方法,下面话不多说了,来一起看看详细的介绍吧

1. 核心想法

使用vuex进行兄弟组件通信的核心思路就是将vuex作为一个store(vuex被设计的原因之一),将每个子组件的数据都存放进去,每个子组件都从vuex里获取数据,其实就是一句话——把vuex作为一个桥

2. 具体代码

父组件App.vue

<template>
 <div id="app">
 <ChildA/>
 <ChildB/>
 </div>
</template>

<script>
 import ChildA from './components/ChildA' // 导入A组件
 import ChildB from './components/ChildB' // 导入B组件

 export default {
 name: 'App',
 components: {ChildA, ChildB} // 注册A、B组件
 }
</script>

<style>
 #app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
 }

 div {
 margin: 10px;
 }
</style>

子组件ChildA

<template>
 <div id="childA">
 <h1>我是A组件</h1>
 <button @click="transform">点我让B组件接收到数据</button>
 <p>因为你点了B,所以我的信息发生了变化:{{BMessage}}</p>
 </div>
</template>

<script>
 export default {
 data() {
 return {
 AMessage: 'Hello,B组件,我是A组件'
 }
 },
 computed: {
 BMessage() {
 // 这里存储从store里获取的B组件的数据
 return this.$store.state.BMsg
 }
 },
 methods: {
 transform() {
 // 触发receiveAMsg,将A组件的数据存放到store里去
 this.$store.commit('receiveAMsg', {
  AMsg: this.AMessage
 })
 }
 }
 }
</script>

<style>
 div#childA {
 border: 1px solid black;
 }
</style>

子组件ChildB

<template>
 <div id="childB">
 <h1>我是B组件</h1>
 <button @click="transform">点我让A组件接收到数据</button>
 <p>因为你点了A,所以我的信息发生了变化:{{AMessage}}</p>
 </div>
</template>

<script>
 export default {
 data() {
 return {
 BMessage: 'Hello,A组件,我是B组件'
 }
 },
 computed: {
 AMessage() {
 // 这里存储从store里获取的A组件的数据
 return this.$store.state.AMsg
 }
 },
 methods: {
 transform() {
 // 触发receiveBMsg,将B组件的数据存放到store里去
 this.$store.commit('receiveBMsg', {
  BMsg: this.BMessage
 })
 }
 }
 }
</script>

<style>
 div#childB {
 border: 1px solid green;
 }
</style>

vuex模块store.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const state = {
 // 初始化A和B组件的数据,等待获取
 AMsg: '',
 BMsg: ''
}

const mutations = {
 receiveAMsg(state, payload) {
 // 将A组件的数据存放于state
 state.AMsg = payload.AMsg
 },
 receiveBMsg(state, payload) {
 // 将B组件的数据存放于state
 state.BMsg = payload.BMsg
 }
}

export default new Vuex.Store({
 state,
 mutations
})

我把所有的代码+注释都放在github了,源码链接,预览链接 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript instanceof 与typeof使用说明
Jan 11 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
Apr 02 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
Dec 18 Javascript
JavaScript中几种排序算法的简单实现
Jul 29 Javascript
AngularJs学习第八篇 过滤器filter创建
Jun 08 Javascript
js控制按钮,防止频繁点击响应的实例
Feb 15 Javascript
Vue的Class与Style绑定的方法
Sep 01 Javascript
详解webpack运行Babel教程
Jun 13 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
Nov 05 Javascript
基于JavaScript实现单例模式
Oct 30 Javascript
基于vue和bootstrap实现简单留言板功能
May 30 Javascript
HTML元素拖拽功能实现的完整实例
Dec 04 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
Nov 02 #Javascript
vue头部导航动态点击处理方法
Nov 02 #Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
Nov 02 #Javascript
vue单页面实现当前页面刷新或跳转时提示保存
Nov 02 #Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
Nov 02 #Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
Nov 02 #Javascript
axios使用拦截器统一处理所有的http请求的方法
Nov 02 #Javascript
You might like
mysql 全文搜索 技巧
2007/04/27 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
php Session无效分析资料整理
2016/11/29 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
JS获得图片alt信息的方法
2015/04/01 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
JS不完全国际化&amp;本地化手册 之 理论篇
2016/09/27 Javascript
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
2017/02/20 Javascript
bootstrap表单示例代码分享
2017/05/18 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
javaScript强制保留两位小数的输入数校验和小数保留问题
2018/05/09 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
2019/04/17 Javascript
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
对python列表里的字典元素去重方法详解
2019/01/21 Python
用pycharm开发django项目示例代码
2019/06/13 Python
python脚本实现mp4中的音频提取并保存在原目录
2020/02/27 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
Keras实现将两个模型连接到一起
2020/05/23 Python
韩国江南富人区高端时尚百货商场:Galleria(格乐丽雅)
2018/03/27 全球购物
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
新书吧创业计划书
2014/01/31 职场文书
主持词开场白
2014/03/17 职场文书
《荷花》教学反思
2014/04/16 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
预备党员表决心的话
2015/09/22 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers