vuex那些事儿
vuex适用于大型单页应用。每一个Vuex应用的核心就是store(仓库),store中储存大量状态,Vuex的状态存储是响应式的。vuex使用单一状态树,一个对象包含了全部的应用层级状态,每个应用仅仅包含一个store实例。调试页面,有可能会用到dev-tools。
一、概念
1、state(共享的状态)
要get状态,需要在计算属性computed中返回状态。要get多个状态,可以借助mapState辅助函数生成计算属性。
state属性在store实例中设置,mapState函数在vue实例的computed属性中写。
state:{
a: ''
}
//实例中
computed: {
getStateA(){
return store.state.a
}
}
//组件中
import { mapState } from 'vuex' export default {
computed: {
...mapState(['a']),
getStateA(){
return this.a;
}
}
}
2、getters(共享的方法,该方法用于get状态)
实现多个组件共享同一个状态,getters属于store的计算属性,根据依赖缓存返回值,当依赖变化时,重新计算。
getters属性在store实例中设置,mapGetters函数在vue实例或组件的computed属性中写。
getters: {
getterA: state => {
return state.a
}
}
//实例中
computed: {
getGetterA() {
return store.getters.getterA
}
}
//组件中
import { mapGetters } from 'vuex' export default {
computed: {
...mapGetters(['getterA']),
getGetterA(){
return this.getterA;
}
}
}
3、mutations(修改状态)
mutation必须是同步函数,因为回调函数进行的状态改变不能被追踪,因为mutation触发的时候,回调函数还没有被调用。
mutations属性在store实例中设置,直接修改状态,mapMutations函数在vue实例或组件的methods属性中写。
mutations: {
mutationA: state => {
state.count++
}
}
//实例中
methods: {
eventA() {
this.$store.commit('mutationA');
}
}
//组件中
import { mapMutations } from 'vuex' export default {
methods: {
...mapMutations(['mutationA']),
eventA(){
this.mutationA();
}
}
}
4、actions(提交mutation)
store中的状态是响应式的,要set状态,不能直接改变数据,而是需要提交mutation。actions属性在store实例中设置,不会直接变更状态,而是提交mutation,可以包含异步操作。mapActions函数在vue实例或组件的methods属性中写。下面介绍4种提交mutaion的办法,仅供参考。
A、在组件中提交mutation
mutations:{
//改变状态
mutationA(state, { adata }) {
state.awords = adata;
}
}
//全局定义store,在组件中提交mutation
methods:{
eventF(adata){
// 以载荷形式提交mutation
store.commit('mutationA',{ adata });
}
}
//在组件内提交mutation
methods:{
eventF(adata){
// 以载荷形式提交mutation
this.$store.commit('mutationA',{ adata });
}
}
B、在组件中提交mutation之mapMutations
import { mutationA, mutationB } from './mutation-types' export default {
[mutationA](state,payload){
state.dataA = payload;
},
[mutationB](state,payload){
state.dataB = payload;
}
}
import { mapMutations } from 'vuex'
export default {
methods: {
...mapMutations([
'mutationA',
'mutationB'
]),
...mapMutations({
add: 'mutationA'
}),
eventA(){
this.mutationA();
},
eventB(bdata){
this.mutationB(bdata);
},
eventC(cdata){
this.add(cdata);
}
}
}
C、在actions中提交mutation
mutations:{
//改变状态
mutationA(state, payload) {
state.awords = payload;
},
//改变状态
mutationB(state, payload) {
state.bwords = payload;
}
},
//在actions中提交mutation,同步,异步
actions:{
actionA({commit,state},payload){
commit('mutationA',payload);
},
actionB({commit},payload){
new Promise((resolve,reject)=>{
setTimeout(()=>{
commit('mutationB',payload);
resolve();
},1000)
})
}
}
//在组件中分发action
methods:{
eventA(){
store.dispatch('actionA','我是老大');
}
}
D、在actions中提交mutation之mapActions
import { mutationA, mutationB } from './mutation-types' export default {
[mutationA](state,payload){
state.dataA = payload;
},
[mutationB](state,payload){
state.dataB = payload;
}
}
//actions.js,提交mutation
import { mutationA, mutationB } from './mutation-types' export default {
actionA({commit,state}, payload){
commit(mutationA, payload);
},
actionB({commit,state}, payload){
commit(mutationB, payload);
}
}
import { mapActions } from 'vuex' //在组件中分发action
methods:{
...mapActions(['actionA', 'actionB']),
eventA(){
this.actionA('我是老大');
},
eventB(){
this.actionB('我是老二');
}
}
5、modules
解决状态多导致store对象臃肿,将store分割成模块,每个模块拥有自己state,getters,mutations,actions。
二、vuex的引用方法
1、用script标签
<script src="https://unpkg.com/vuex"></script>
2、npm安装
cnpm install vuex
//在js文件引入
var Vue = require('vue')
var Vuex = require('vuex') Vue.use(Vuex)
三、参考案例
const store = new Vuex.Store({
state:{
fwords: '一朵红花',
awords: '我是老大'
},
getters:{
getAwords(state){
return state.awords
}
},
mutations:{
//改变状态
listenA(state, { adata }) {
state.awords = adata;
}
}
})
1、父组件给子组件传递消息
//父组件
<com-a :apropVal="getFwords"></com-a> computed:{
getFwords(){
return store.state.fwords
}
}
//子组件
<h3>父亲给我了,{{ apropVal }}</h3> props:['apropVal']
2、子组件给父组件传递事件
//子组件
<input type="button" value="A和父亲说话" @click="eventAf"> methods:{
eventAf(){
this.$emit('a-f-msg',`谢谢父亲`);
}
}
//父组件
<com-a @a-f-msg="eventFa"></com-a> methods:{
eventFa(adata){
// 以载荷形式提交mutation
store.commit('listenA',{ adata });
}
}
const store = new Vuex.Store({
state:{
awords: '',
bwords: ''
},
getters:{
getAwords(state){
return state.awords
},
getBwords(state){
return state.bwords
}
},
mutations:{
//改变状态
mutationA(state, payload) {
state.awords = payload;
},
//改变状态
mutationB(state, payload) {
state.bwords = payload;
}
},
actions:{
actionA({commit,state},payload){
commit('mutationA',payload);
},
actionB({commit},payload){
new Promise((resolve,reject)=>{
setTimeout(()=>{
commit('mutationB',payload);
resolve();
},1000)
})
}
}
})
//子组件A
<h4>B传过来的数据是:{{ store.getters.getBwords }}</h4>
<input type="button" value="把值传给B" @click="eventAb"> methods:{
eventAb(){
store.dispatch('actionA','我是老大');
}
}
//子组件B
<h4>A传过来的数据是:{{ store.getters.getAwords }}</h4>
<input type="button" value="把值传给A" @click="eventBa"> methods:{
eventBa(){
store.dispatch('actionB','我是老二');
}
}
1、语法基础
A、引入和输出模块
//store.js,默认输出
export default store;
//main.js
import store from 'store.js';
// constants.js
export const A = 1;
export const B = 3;
//main.js
import { A, B } from './constants.js';
// constants.js,跨模块常量
export const A = 1;
export const B = 3;
export const C = 4;
// main.js
import * as constants from './constants';
console.log(constants.A); //
console.log(constants.B); //
B、对象扩展运算符
将多个对象合并为一个,传给computed属性。
# 安装插件
npm i -D babel-plugin-transform-object-rest-spread
#配置文件babelrc
{
"presets": ["env"],
"plugins": ["transform-runtime","transform-object-rest-spread"]
}
//组件内
computed:{
...mapGetters(['getterA','getterB','getterC'])
}
//mutation-types.js
export const MUTATION_A = 'MUTATION_A';
//mutations.js
import { MUTATION_A } from './mutation-types'; export default {
[MUTATION_A](state,payload){
state.dataA = payload;
}
}
//actions.js
import { MUTATION_A } from './mutation-types';
//解构赋值前,context是一个对象
export default {
actionA(context, payload){
context.commit(MUTATION_A, payload);
}
}
//解构赋值后
export default {
actionA({commit, state}, payload){
commit(MUTATION_A, payload);
}
}
commit = context.commit,为什么这样解构赋值?查看原理。
2、父组件给子组件传递
3、子组件给父组件传递
4、兄弟组件相互传递
vuex那些事儿的更多相关文章
- 关于Vuex的那些事儿
vuex vuex是一个专门为Vue.js应用程序开发的状态管理模式,集中式的存储应用的所有组件的状态 以相应的规则保证状态以一种可预测的方式发生变化 单向数据流 State:驱动应用的数据源(单向数 ...
- Vue2.0 探索之路——生命周期和钩子函数的一些理解 - JS那些事儿
在使用vue一个多礼拜后,感觉现在还停留在初级阶段,虽然知道怎么和后端做数据交互,但是对于mounted这个挂载还不是很清楚的.放大之,对vue的生命周期不甚了解.只知道简单的使用,而不知道为什么,这 ...
- 一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app
一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app 转载 作者:jrainlau 链接:https://segmentfault.com/a/1190000005844155 ...
- Vuex、Flux、Redux、Redux-saga、Dva、MobX
https://www.jqhtml.com/23003.html 这篇文章试着聊明白这一堆看起来挺复杂的东西.在聊之前,大家要始终记得一句话:一切前端概念,都是纸老虎. 不管是Vue,还是 Reac ...
- vuex存取token,http简单封装、模拟登入权限校验操作、路由懒加载的几种方式、vue单页设置title
1.config index.js下面的跨域代理设置: proxyTable: { '/api': { target: 'http://xxxx', //要访问的后端接口 changeOrigin: ...
- vuex分模块3
nuxt 踩坑之 -- Vuex状态树的模块方式使用 原创 2017年12月20日 11:24:14 标签: vue / nuxt / vuex / 模块化 / 状态管理 874 初次看到这个模块方式 ...
- Vuex,从入门到...
Vuex 是什么? 官方是这么说的:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 不懂? ...
- 说说Makefile那些事儿
说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...
- 关于Vue.js 2.0 的 Vuex 2.0,你需要更新的知识库
应用结构 实际上,Vuex 在怎么组织你的代码结构上面没有任何限制,相反,它强制规定了一系列高级的原则: 应用级的状态集中放在 store 中. 改变状态的唯一方式是提交mutations,这是个同步 ...
随机推荐
- poj2417 bsgs算法非逆元模板,用于求解A^x=B(mod C)的方程
参考博客 https://blog.csdn.net/clover_hxy/article/details/50683832关于欧拉定理推论的证明 https://www.cnblogs.com/as ...
- 利用vue-cli创建新项目
1.安装vue-cli npm i vue-cli --gd 2.初始化一个项目 vue init webpack test //test 是个项目名称并且配置相应的配置,(测试部份的可以选择no) ...
- easyui之自定义字体图标(鼠标覆盖时切换颜色)
项目要求是自定义字体图标,使用easyui框架结构,众所周知easyui强功能弱样式,字体图标其实就是一张图片.要达到切换图标颜色的效果,要么就是有两套图,使用js控制.但是我这个人比较懒,不喜欢做复 ...
- JMeter 如何把上一个请求的结果作为下一个请求的参数 —— 使用正则提取器
有这样一个压力测试环境,有一个上传页面,上传成功之后服务器会返回一些上传信息(比如文件的 id 或者保存路径之类的信息),然后压力机会继续下一个请求,比如调整 id 为 xx 的文件的一些信息等等.问 ...
- Linux-server-sshd
Linux-server-sshd 1:安装 OpenSSH 服务需要4 个软件包 openssh-5.3p1-114.el6_7.x86_64:包含OpenSSH 服务器及客户端需要的核心文件 op ...
- Redis 学习手册
一:Redis的简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包 ...
- noip飞扬的小鸟
题解: 挺简单的题目 f[i][j]表示x坐标为i,y坐标为j的最小值 会发现那个东西是个完全背包 从f[i][j-a[i]]转移一下就是O(1)转移的了 另外上界为m这个要特判一下 我把sum[a[ ...
- 【BZOJ4155】[Ipsc2015]Humble Captains
题解: 第一问裸的最小割 第二问考虑贪心 我们把边权平均分配给两个点 然后就变成了给n个数分两组差最小 np-hard问题 暴力背包,操作存在区间左移,右移,or bieset优化
- 【C#】WebApi 添加过滤器,实现对请求参数和响应内容的日志记录
filter的介绍 filter在Web API中经常会用到,主要用于记录日志,安全验证,全局错误处理等:Web API提供两种过滤器的基本类型:actionfilterattribute,excep ...
- 【Android】ContentValues的用法
ContentValues 和HashTable类似都是一种存储的机制 但是两者最大的区别就在于,contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,而 ...