vuex是专门用来管理vue.js应用程序中状态的一个插件。他的作用是将应用中的所有状态都放在一起,集中式来管理。需要声明的是,这里所说的状态指的是vue组件中data里面的属性。
vuex的特点是把数据单独隔离,形成一棵树状图。单独隔离就意味着它有自己的生态系统。
- 1.state – 存放状态
- 2.getters – state的计算属性
- 3.mutations – 更改状态的逻辑,同步操作
- 4.actions – 提交mutation,异步操作
- 5.mudules – 将store模块化
store 中存储的状态是响应式的,当组件从store中读取状态时,如果store中的状态发生了改变,那么相应的组件也会得到更新;
不能直接改变store中的状态。改变store中的状态的唯一途径是提交(commit)mutations。这样使得我们可以方便地跟踪每一个状态的变化。
mutations即变化,修改state的数据,而且只能是同步的,不能存在异步的操作。异步操作要放在actions里,拿到数据再通过mutations同步处理。
npm i -S vuex
/ src
/ store
- index.js
- actions.js
- mutations.js
- state.js
- getters.js
vuex 中最关键的是store对象,这是vuex的核心。可以说,vuex这个插件其实就是一个store对象,每个vue应用仅且仅有一个store对象。
import Vue from 'vue'
import Vuex from 'vuex'
import state from './state.js'
import mutations from './mutations.js'
import actions from './actions.js'
import getters from './getters.js'
Vue.use(Vuex)
export default new Vuex.Store({
state,
mutations,
actions,
getters
})
引入store main.js
import Vue from 'vue'
import App from './App'
import store from './store'
new Vue({
el: '#app',
store,
render: h => h(App)
})
state就是需要管理的状态,即数据
export default {
name: "dd",
age: 18
}
mounted() {
this.$store.state.name
}
//简写
import { mapState } from "vuex";
computed: {
...mapState(['name'])
}
有时需要对state中的数据进行处理,可以通过getters定义对应函数
export default {
name(state) {
return state.name + "tl"
}
}
mounted(
this.$store.state.name;//dd
this.$store.getters.name;//ddt1
}
//简写
import { mapState,mapGetters } from "vuex";
computed: {
...mapState(['name']);//dd
...mapGetters(['name'])//ddt1
}
mutations即改动的意思,用来定义数据的更新操作
export default {
addAge(state) {
state.age += 1;
}
}
mounted() {
this.$store.state.age;//18
// 触发mutations需要用commit
this.$store.commit('addAge');
this.$store.state.age;//19
}
//简写
import { mapState,mapMutations } from "vuex";
computed: {
...mapState(['age']);//dd
this.addAge();
...mapState(['age']);//dd1
}
methods: {
...mapMutations('addAge');
}
需要异步更新数据,因为数据通常是通过异步的Ajax请求获取的
mutations只能通过commit执行,而这个方法没有返回值,如果在mutations内定义了Promise对象我们也取不到
actions.js
export default {
addAgeAsync({commit}) {
console.log('1')
return new Promise((resolve, reject)=>{
console.log('2')
setTimeout(()=>{
console.log('4')
commit('addAge')
}, 0)
})
}
}
mounted() {
this.$store.state.age
// 调用actions需要使用dispatch方法,有返回值的
this.$store.dispatch("addAgeAsync");
this.$store.state.age
}
//简写
import { mapState,mapAction } from "vuex";
computed:{
...mapState(['age']);//dd变ddt1
}
mounted() {
...mapAction(['addAgeAsync']);
}
//背景音乐
bgMusic: {
path: "",
isPlay: false,
isMusic: true
}
updateBgMusic(state, data) {
//Object.assign方法实行的是浅拷贝
state.bgMusic = Object.assign({}, state.bgMusic, data);
},
let obj = {
isMusic=!this.bgMusic.isPlay,
isPlay: true,
path,
};
this.updateBgMusic(obj);
commit('vip/receive', data, {root: true})
rootGetters['vip/get']
rootState.user.info
rootState['vip/data']
作者不再维护啦,以后迁移到Pinia
npm i -S vuex-persistedstate
store
下的index.js
中import createPersistedState from "vuex-persistedstate"
const store =newVuex.Store({
state: {},
mutations: {},
actions: {},
plugins: [createPersistedState()]
})
store
下的index.js
中import createPersistedState from "vuex-persistedstate"
const store = newVuex.Store({
state: {},
mutations: {},
actions: {},
plugins: [createPersistedState({
storage:window.sessionStorage
})]
})
store
下的index.js
中import createPersistedState from "vuex-persistedstate"
const store = newVuex.Store({
state: {},
mutations: {},
actions: {},
plugins: [createPersistedState({
storage:window.sessionStorage,
reducer(val) {
return {
// 只储存state中的token
assessmentData: val.token
}
}
})]
})
1、指定需要持久化的state,有时会失效
使用全局缓存