[Vue] vuex进行组件间通讯
vue 组件之间数据传输(vuex)
初始化 store
src/main.js
import Vuex from "vuex";
Vue.use(Vuex);
new Vue({
...,
store,
...,
});
src/store/index.js
import mutations from "./mutations";
const initStore = {
state: {
userBasicInfo: {},
siteBaseInfo: {
download: "",
invitation: "",
register_enable: "",
service_qq1: "",
service_qq2: "",
service_wechat: "",
},
},
mutations
};
export default initStore;
src/store/mutations.js
const SET_USER_BASIC_INFO = 'SET_USER_BASIC_INFO';
const SET_SITE_BASE_INFO = 'SET_SITE_BASE_INFO';
export default {
[SET_USER_BASIC_INFO](state, payload) {
state.userBasicInfo = payload.data;
},
[SET_SITE_BASE_INFO](state, payload) {
state.siteBaseInfo = Object.assign({}, state.siteBaseInfo, payload);
},
}
state
正常使用 state
Vuex 的状态存储是响应式的,从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态。每当 store.state.count 变化的时候, 都会重新求取计算属性,并且触发更新相关联的 DOM。
Vuex 通过 store 选项,提供了一种机制将状态从根组件“注入”到每一个子组件中。
const app = new Vue({
el: '#app',
// 把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件
store,
components: { Counter },
template: `
<div class="app">
<counter></counter>
</div>
`
})
在子组件中使用
const Counter = {
template: `<div>{{ count }}</div>`,
computed: {
count () {
return this.$store.state.count
}
}
}
mapState 辅助函数
按官网的案例
import { mapState } from 'vuex'
export default {
// ...
computed: mapState({
// 箭头函数
siteBaseInfo: state => state.siteBaseInfo,
// 传字符串参数
siteBaseInfo: "siteBaseInfo",
// 为了能够使用 `this` 获取局部状态,必须使用常规函数
download_ios (state) {
return state.siteBaseInfo.download + this.prefix
},
download: state => state.siteBaseInfo.download
})
}
当映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组
computed: mapState([
// 映射 this.count 为 store.state.count
'count'
])
mapState 与局部计算属性混合使用
使用对象展开运算符将多个对象合并为一个,以使我们可以将最终对象传给 computed 属性。
computed: {
localComputed () { /* ... */ },
// 使用对象展开运算符将此对象混入到外部对象中
...mapState({
// ...
})
}
getter 的使用
有时候我们需要从通过 state 得到一些新的状态,因为这一状态可能其他很多组件都要使用这一状态.比如余额这一参数,我们当前只有盈利和亏损额,但是很多页面都要使用余额进行显示,那么每个引入页面都要进行一次计算吗?想想就麻烦,还是只计算一次,然后直接获取这个余额值来的方便
store/getters.js
export default {
balance: (state) => {
return Number(state.userBasicInfo.profit) - Number(state.userBasicInfo.loss);
},
download: (state) => {
return state.siteBaseInfo.download;
}
}
mapGetters 辅助函数
辅助函数仅仅是将 store 中的 getter 映射到局部计算属性
import { mapGetters } from 'vuex'
export default {
// ...
computed: {
// 使用对象展开运算符将 getter 混入 computed 对象中
...mapGetters([
'balance',
'download',
// ...
])
}
}
getter 的使用
//直接使用
store.getters.download
//组件中使用
computed: {
download () {
return this.$store.getters.download
}
}
//使用辅助函数
...mapGetters([
'download',
'balance',
])
//和mapState一起用
computed: {
...mapState({
siteBaseInfo: "siteBaseInfo",
}),
...mapGetters({
download: 'download'
})
},
Getter 也可以接受其他 getter 作为第二个参数
getters: {
// ...
doneTodosCount: (state, getters) => {
return getters.doneTodos.length
}
}
总之,getter 就是一个将一些需要进行再次计算的 state 计算好,然后将其作为 state 进行快捷的引用
mutation 使用
- 最好提前在你的 store 中初始化好所有所需属性
- 当需要在对象上添加新属性时,你应该使用 Vue.set(obj, 'newProp', 123)或以新对象替换老对象(对象展开符)
- mutation 必须是同步函数
每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler),会接受 state 作为第一个参数
//设置
mutations: {
SET_USER_BASIC_INFO(state) {
state.userBasicInfo = {a:1,b:2};
},
}
//使用
store.commit('SET_USER_BASIC_INFO')
提交载荷(Payload)
//设置
mutations: {
SET_USER_BASIC_INFO(state, payload) {
state.userBasicInfo = Object.assign({},payload);
},
}
//使用
store.commit('SET_USER_BASIC_INFO', {
a:1,
b:2
})
对象风格的提交方式
提交 mutation 的另一种方式是直接使用包含 type 属性的对象
store.commit({
type: 'SET_USER_BASIC_INFO',
data:{
a:1,
b:2,
}
})
//mutations的效果
mutations: {
increment (state, payload) {
state.userBasicInfo = Object.assign({},payload.data);
}
}
使用常量替代 Mutation 事件类型
// mutation-types.js
export const SET_USER_BASIC_INFO = 'SET_USER_BASIC_INFO';
// mutations.js
import { SET_USER_BASIC_INFO } from './mutation-types';
mutations: {
// 我们可以使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名
[SET_USER_BASIC_INFO] (state) {
// mutate state
}
}
mapMutations 辅助函数
//正常
this.$store.commit('SET_USER_BASIC_INFO');
//mapMutations
import { mapMutations } from 'vuex';
export default {
...,
methods:{
...mapMutations({
setUserBasicInfo: 'SET_USER_BASIC_INFO' // 将 `this.setUserBasicInfo()` 映射为 `this.$store.commit('SET_USER_BASIC_INFO')`
})
}
}
action
用来提交一个 mutation,还可以进行异步操作
//注册
const store = new Vuex.Store({
state,
mutations,
actions: {
//解构context.commmit
GET_HOME_INFO({commit}) {
commit("SET_USER_BASIC_INFO");
},
}
})
//触发
store.dispatch('GET_HOME_INFO')
//载荷形式
store.dispatch('GET_HOME_INFO',{})
//对象形式
store.dispatch({
type:'GET_HOME_INFO',
data:{}
})
mapActions 辅助函数
import { mapActions } from 'vuex'
export default {
...
methods: {
...mapActions({
getHomeInfo: 'GET_HOME_INFO' // 将 `this.getHomeInfo()` 映射为 `this.$store.dispatch('GET_HOME_INFO')`
})
}
}
异步的 action
action 中的中支持的异步 ajax,setTimeout,acync/await,promise...
store.dispatch('actionA').then(() => {
// ...
})
其他的传值还有一些方式
比如 props,seventBus,slocalStorage,sessionStorage,router 传参,cookie(不推荐,虽然就跟之前做购物车差不多的传递形式)
vue 组件之间数据传输(props 传值方式)
这个多用于父子组件之间的传值,是最基本的传值方式
父亲组件进行绑定,将数据绑定,其中 personal,personalData,imgUrl 是绑定的数据,@updata 是绑定的事件
<template>
...
<slideBar
@updata="updata"
:personal="personal"
:personalData="personalData"
:imgUrl="imgUrl"
></slideBar>
...
<template>
子组件进行获取数据通过 props 进行获取,可以设置一些静态类型检查,类似于 react 的 proptypes,同时子组件想要向父组件进行传值,可以通过 emit 进行传值就行了
export default {
props: {
slideMsg: Array,
personal: Object,
personalData: Object,
imgUrl: String
},
...
methods:{
submitEvent(){
...
this.emit("updata","我是获取的数据");
...
}
}
}
vue 组件之间数据传输(eventBus 进行组件传递)
事件 bus 通过一个新的 vue 实例,来进行事件监听和事件分发
commom/bus.js
//极简单的vue实例
import Vue from 'vue';
// 使用 Event Bus
const bus = new Vue();
export default bus;
在 game 组件中引入
import bus from "@/common/bus";
...
bus.$emit("moneyChange", {....});
...
在用 money 组件中引入
import bus from "@/common/bus";
...
bus.$on("moneyChange", msg => {
msg && this.initHomeData();
});
...
在最初的项目阶段这是一个不错的选择,但是随着项目体积的增大,事件触发和数据流向变得越来越不可见,后续开发和维护变得越来越困难.
sessionstorage
项目中使用的 sessionStorage
sessionStorage.setItem("msg", JSON.stringify(res.data)); //为了兼容之前的代码,有用到msg这个本地缓存的数据
sessionStorage.setItem("isMobile", res.data.mobile);
sessionStorage.setItem("invi", res.data.invitation);
sessionStorage.setItem("isLogin", res.data.trier);
sessionStorage.setItem("setPwd", res.data.fundpwd);
sessionStorage.setItem("isShow", res.data.bankcard);
localStorage
项目中关于声音的开关,样式选择,背景切换等,用来将用户的一些操作一直保存
//组件userSetting
localStorage.setItem("audio", this.switchValue);
//组件audioPlay
let audio = localStorage.getItem("audio");
sessionstorage 和 localStorage 看情况使用就好,sessionstorage 是浏览器关闭没了,localStorage 是一直存储不删除就在存在
params
依赖于 vue-router
this.$router.push({
name: "Main",
params: {
id: this.setting_id,
type: "3"
}
});
Vuex
Vuex - 标签 - 掘金
浪里行舟 从头开始学习 Vuex
VueJS 中学习使用 Vuex 详解
到底 vuex 是什么?
基于 vue2 + vuex 构建一个具有 45 个页面的大型单页面应用
[Vue] vuex进行组件间通讯的更多相关文章
- vue中兄弟组件间通讯
vue2.0中兄弟组件间的通讯是通过eventBus(事件发布订阅)实现的. eventBus.js import Vue from 'vue' const eventBus = new Vue() ...
- React 组件间通讯
React 组件间通讯 说 React 组件间通讯之前,我们先来讨论一下 React 组件究竟有多少种层级间的关系.假设我们开发的项目是一个纯 React 的项目,那我们项目应该有如下类似的关系: 父 ...
- vue 和 react 组件间通信方法对比
vue 和 react 组件间通信方法对比: 通信路径 vue的方法 react的方法 父组件 => 子组件 props(推荐).slot(推荐).this.$refs.this.$childr ...
- AngularJs学习笔记-组件间通讯
组件间通讯 (1)输入属性@Input Tips:子组件属性的改变不会影响到父组件 如下,子组件中stockCode属性发生变化不会引起父组件stock属性的变化 (2)输入属性@Output 子组件 ...
- vue仓库、组件间通信、前后台数据交互、前端储存数据大汇总
目录 路由重定向 仓库介绍 vuex插件:可以完成任意组件间信息交互(移动端) 前端存储数据大汇总 前后台交互方式(重点) 前后台数据交互 axios插件:完成前后台ajax交互的 同源策略 - 前后 ...
- vue非父子组件间传参问题
最近在使用vue进行开发,遇到了组件之间传参的问题,此处主要是针对非父子组件之间的传参问题进行总结,方法如下:一.如果两个组件用友共同的父组件,即 FatherComponent.vue代码 < ...
- 【原】vue单文件组件互相通讯
在vue中,我们可以把一个页面各个部分单独封装起来,做成各种小组件,然后加载,这样的好处是代码维护起来比较容易,重复的代码多处调用! 在一个vue项目中,单文件组件以.vue形式文件命名 每个组件之间 ...
- vue的父子组件间的相互传参props及props数据的多种验证机制
感觉自己即将完全步入前端大军,后台老板都不需要我弄了,塞翁失马...时间会告诉我们是好是坏 好了言归正传,最近vue是搞的不亦乐乎啊,下面来总结一下vue组件间的各种使用方法以及一些技巧 ------ ...
- Vue的父子组件间通信及借助$emit和$on解除父子级通信的耦合度高的问题
1.父子级间通信,父类找子类非常容易,直接在子组件上加一个ref,父组件直接通过this.$refs操作子组件的数据和方法 父 这边子组件中 就完成了父 => 子组件通信 2. 子 =&g ...
随机推荐
- BZOJ_1334_[Baltic2008]Elect_DP+语文题
BZOJ_1334_[Baltic2008]Elect_DP Description N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于 总数的一半 ...
- 面试阿里前端P6血和泪换来的收获
我的一个朋友在前端耕耘一段时间,也在网上进行了高度培训学习,最近一段时间他打算跳槽去阿里面试前端P6开发岗位,结果被痛虐了一回,估计从此以后会给他留下不可磨灭的阴影啊 真是十年生死两茫茫,一鲁代码 ...
- Oracle系列-锁表与解锁解决方案(基础版)
[Oracle锁表查询和解锁解决方案] 一.了解原因(借鉴整理) 数据库操作语句的分类 DDL:数据库模式定义语言,关键字:createDML:数据操纵语言,关键字:Insert.delete.upd ...
- ruby整理
参考博客:https://www.cnblogs.com/felixzh/p/8081622.html 官网地址 https://rvm.io/rvm/install 一.前提 centos6.8下 ...
- 回归树(Regression Tree)
目录 回归树 理论解释 算法流程 ID3 和 C4.5 能不能用来回归? 回归树示例 References 说到决策树(Decision tree),我们很自然会想到用其做分类,每个叶子代表有限类别中 ...
- Deepin linux Compass.app安装
compass.app是集成了sass的工具,安装完Compass就能够使用sass. 首先,上官网 可以看到官网上推荐的两种sass使用方式,application&command line ...
- SharePoint布局页创建(实战)
分享人:广州华软 极简 一. 前言 SharePoint有母版页及布局页,母版页控制页面头部.底部,而布局页则控制页面中间内容区域.通过布局页,可以快速修改页面内容区域. SharePoint的页面布 ...
- solr搭建(linux)
Solr版本:7.4.0 Tomcat版本:8.5 Jdk版本:1.8 最好在root用户下进行操作,为了更方便初学者理解,选用ubuntu操作,当然用命令操作过程是一样的,会命令操作的话看懂图形化操 ...
- Microsoft SQL Server 双机热备份,实时同步
1.两台服务器,主服务器,从服务器,两台服务器都安装SQL Server 2008R2并且安装相同表结构的数据库(需要实时同步的数据库) 2.主服务器数据库安装完毕,打开SQL Server 配置管理 ...
- Windows Server 2016-批量设置用户下次登陆须更改密码
Powershell设置某OU下所有用户下次登陆必须更改密码: Get-ADUser -Filter * -SearchBase "ou=syncall,dc=azureyun,dc=com ...