Vue兄弟组件(非父子组件)状态共享与传值
前言:网上大部分文章写的有点乱,很少有讲得易懂的文章。
所以,我写了篇在我能看得懂的基础上又照顾到大家的文章 =。=
- 作者:X1aoYE
- 备注:此文原创,转载请注明~ 内容里的<br>请无视。。
关键字:Vue、非父子组件、兄弟组件、传值、共享状态
- 应用例子:
- 主题颜色更换
- 购物车传值
- 就像名字所说的兄弟组件传值,自己理解其他例子了哈~
- 小型项目:
推荐使用 global event bus (事件总线) ,不然小项目里用 Vuex 相对来说会挺繁琐
步骤:
1. 新建一个 bus.vue (只是个 .vue ,不用想太多)
import Vue from 'vue' //import一个vue类
export const bus = new Vue() //实例化并将它export
2. 使用
在我们的一个组件(这里指的是发送方)里:
import { bus } from 'bus.js'
// 其他代码~
bus.$emit('myEvent', 'this.mydata')
// 其他代码~
// 解释:bus.$emit('自定义事件名',要传送的数据);
3. 接着使用 bus.vue
紧接着在我们另一个组件(这里指的是接收方)里:
备注:bus.$on('事件名',callback) ---------- callback即指回调$emit要传送的数据;
import { bus } from 'bus.js'
created () { //监听传值
bus.$on('myEvent', (mydata) => {
this.mydata = mydata;
})
}
备注:若只想监听一次事件 ,则使用bus.$once
注销:bus.$off('myEvent', ~~~自己写~~~);
步骤大致就这样~
- 中大型项目:
推荐使用 Vuex ,
解释一波:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式;
vuex解决了组件之间同一状态的共享问题 (解决了不同组件之间的数据共享) ,使组件里面的数据持久化。
1. 安装vuex :cnpm install vuex --save (什么是cnpm就不解释了,能学到Vuex的应该都了解cnpm了)
2. 创建一个 vuex 文件夹,并在里面新建一个 store.js 写入以下代码:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
接着往下写:
state 定义数据:state在vuex中用于存储数据
//1.state在vuex中用于存储数据
var state={ //存放数据,数据中心
count:1,
// 其他数据格式:orderList: [],
// 其他数据格式:params: {}
}
getters 类似计算属性:
//2.
var getters= {
computedCount: (state) => {
return state.count*2
}
}
mutations 定义方法:mutations里面放的是方法,方法主要用于改变state里面的数据
//3.mutations里面放的是方法,方法主要用于改变state里面的数据
var mutations={
incCount(){
++state.count;
}
}
action 定义方法:异步操作,Action 提交的是 mutation,而不是直接变更状态。
//4.
var actions= {
incMutationsCount(context) { /*因此你可以调用 context.commit 提交一个 mutation*/
context.commit('incCount'); /*执行 mutations 里面的incCount方法 改变state里面的数据*/
//此处按照实际情况扩展~
}
}
暴露!:暴露上面那四个~
const store = new Vuex.Store({
state,
mutations,
getters,
actions
})
export default store;
3. 组件里去使用 Vuex:
(1). 获取state里面的数据
this.$store.state.数据
(2). 获取 getters里面方法返回的的数据 (一般vue 和 store 进行交互 用 $store.getters, getters的值放在计算属性里,动态绑定在计算属性computed里)
this.$store.getters.computedCount
(3). 触发 mutations 改变 state里面的数据 (别记混了)
this.$store.commit('incCount');
(4). 触发 actions里面的方法 (别记混了)
this.$store.dispatch('incMutationsCount'); ps:这个 incMutationsCount 会再去 执行 mutations 里面的incCount方法
4. 在src下新建一个文件夹store,接着新建一个文件index.js来放store对象。记得在 main.js 里添加store
main.js:
importstore from'./store/index'
new Vue({
el: '#app',
router,
store,
template: '<按你的写/>',
//第一层
components: { 按你的写 }
})
index.js:
import Vuex from 'vuex'
import Vue from 'vue'
import storefrom './modules/store' //这个是我的store.js
Vue.use(Vuex) export default new Vuex.Store({
modules:{ //模型
store
}
})
大概就这样~
这只是基础步骤,详细的要自己按照自己的详细情况加~
Vue兄弟组件(非父子组件)状态共享与传值的更多相关文章
- 【vue】父组件主动调用子组件 /// 非父子组件传值
一 父组件主动调用子组件: 注意:在父组件使用子组件的标签上注入ref属性,例如: <div id="home"> <v-header ref="he ...
- Vue 组件 非父子组件通信
有时候两个组件也需要通信(非父子关系),在简单的场景下,可以使用一个空的vue实例作为中央事件总线: var bus = new Vue(); //触发组件a中的事件 bus.$emit('id-se ...
- Vue bus的使用(兄弟|非父子组件传值)-->可以使用一个空的Vue实例作为中央事件总线new Vue()
1.在main.js中注册全局的bus Vue.prototype.bus=new Vue(); 2.在组建中使用 子组建使用:this.bus.$emit('自定义事件名',data) metho ...
- vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例
vue2中废弃了$dispatch和$broadcast广播和分发事件的方法.父子组件中可以用props和$emit().如何实现非父子组件间的通信,可以通过实例一个vue实例Bus作为媒介,要相互通 ...
- 简述在Vue脚手架中,组件以及父子组件(非父子组件)之间的传值
1.组件的定义 组成: template:包裹HTML模板片段(反映了数据与最终呈现给用户视图之间的映射关系) 只支持单个template标签: 支持lang配置多种模板语法: script:配置Vu ...
- Vue 非父子组件通信方案
Vue 非父子组件通信方案 概述 在 Vue 中模块间的通信很普遍 如果是单纯的父子组件间传递信息,父组件可以使用 props 将数据向下传递到子组件,而在子组件中可以使用 events (父组件需要 ...
- Vue 非父子组件通信
组件是Vue核心的一块内容,组件之间的通信也是很基本的开发需求.组件通信又包括父组件向子组件传数据,子组件向父组件传数据,非父子组件间的通信.前两种通信Vue的文档都说的很清楚,但是第三种文档上确只有 ...
- vue父子组件及非父子组件通信
1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: <parent> <child :child-msg="msg" ...
- Vue父子组件及非父子组件如何通信
1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: 子组件通过props来接收数据: 方式1: 方式2 : 方式3: 这样呢,就实现了父组件向子组件传递数 ...
随机推荐
- 用SendNotifyMessage代替PostMessage避免消息丢失(WIN7下消息队列的默认长度是10000,队列满后消息将被丢弃)
大家都知道PostMessage会丢消息,但是消息队列的大小是多少呢,下面做了一个测试. 代码: 1 unit Unit1; 2 3 interface 4 5 uses 6 Windows, M ...
- Servlet 3.1实践
Servlet 3.1 新特性详解 参考: IBM developerworks: Servlet 3.0 新特性详解 开涛的博客: Servlet3.1规范(最终版) 关键特性 Asynchroni ...
- c# windows程序调用本地输入法
原文:c# windows程序调用本地输入法 好久没写博客了,今天写了一个DEMO,在WINform程序中调用本地输入法,并在窗体中显示出来.其中使用到了很多API,现把代码贴出来,供大家参考 ...
- 【C#】获取任意文件的缩略图
原文:[C#]获取任意文件的缩略图 因为用shell取缩略图时,对于损坏的文件,读出来的图有黑边,所以就诞生了以下方法,不过这个效率要比用shell取的低3-4倍. 1.添加类WindowsThumb ...
- 在 __CC_ARM 编译器环境下,使用$Sub$$ 与 $Super$$ 的“补丁”功能
$Sub$$ 与 $Super$$ 的“补丁”功能(详见 ARM® Compiler v5.06 for µVision® armlink User Guide): 这是一种特殊模式:用于有一个已经存 ...
- SQLServer 不允许保存更改的解决办法
启动SQL Server Management Studio 工具菜单----选项----Designers(设计器)----阻止保存要求重新创建表的更改 取消勾选即可.
- canvas——粒子系统(1)
这个动画在很早之前就见过,当时就没迷住了.最近在学canavs动画,动手实现了一下.代码在这里.展示效果在这里. 这属于粒子系统的一种,粒子系统就是需要管理一堆粒子嘛,动画实现的关键在于,遍历这些粒子 ...
- fatal error LNK1169:找到一个或多个重定义的符号
这个算是个比较基础的问题,由于我不是C程序员,本行java,临时拉来做的,所以有些坑还得自己走出来. 这个问题是由于,全局变量在a.h中定义,在两个源文件a.cpp和b.cpp中引用,之后被编译器认为 ...
- Windows XP 每次开机都自动检测硬盘 解决办法(可以用HDDRegenerate修复坏道)
Windows XP,每次开机都自动检测硬盘,之前正常关机,没有任何非法操作.Windows XP,每次开机都自动检测硬盘,之前正常关机,没有任何非法操作. 1.和硬盘的分区格式有关,FAT32格式在 ...
- ASP.NET 5 (vNext) 牛刀小試:自帶 DI 容器
小引 在 ASP.NET 5(vNext)之前,亦即 MVC 4/5.Web API 2 的时代,MVC 与 Web API 框架彼此有非常相似的设计,却是以不同的代码来实现.现在,ASP.NET 5 ...