1. Vuex是什么?什么场景下使用?
- Vuex是vue的一个插件,叫做状态管理模式,全局共享某一些状态
- 通俗来讲,当各组件需要共享某一组状态的时候,会用到Vuex,兄弟组件及跨级组件传值也可以派上用场(如果数据量不大,或者组件状态不需要共享也可以用中央信息插件event-bus)
2. Vuex的基本使用
- vue-cli 4.0 以上,在搭建脚手架的时候选择此项就可以
- 项目搭建完成,便会在src文件夹下看到一个store,这就是自动生成的仓库
- 以下是vuex的一些基本操作,供参考:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
name: 'Vuex',
age: 18
},
getters: {
addName(state) {
return `${state.name}牛逼`
}
},
mutations: {
syncAdd(state, payload){
state.age += payload
},
syncReduce(state, payload){
state.age -= payload
}
},
actions: {
asyncReduce({commit}, payload) {
setTimeout( () => {
commit('syncReduce', payload)
}, 1000)
}
},
modules: {
}
})
<template>
<div id="app">
<h2>{{$store.state.name}}</h2>
<div>{{$store.getters.addName}}</div>
<div>年龄: {{$store.state.age}}</div>
<div><button @click="add()">加10</button></div>
<div><button @click="reduce()">减10-异步</button></div>
</div>
</template>
<script>
export default {
mounted () {
console.log(this.$store)
},
methods: {
add(){
this.$store.commit('syncAdd', 10)
},
reduce() {
this.$store.dispatch('asyncReduce', 2)
}
}
}
</script>
3. 手写一个vuex
let Vue;
class Store {
constructor(options = {}) {
this.s = new Vue({
data() {
return { state: options.state }
}
})
let getters = options.getters
this.getters = {}
Object.keys(getters).forEach((getterName) => {
Object.defineProperty(this.getters,
getterName, {
get: () => {
return getters[getterName](this.state)
}
})
})
let mutations = options.mutations
this.mutations = {}
Object.keys(mutations).forEach( (mutationName)=> {
this.mutations[mutationName] = (payload) =>{
mutations[mutationName](this.state, payload)
}
})
let actions = options.actions
this.actions = {}
forEachFn(actions, (actionName, fn) => {
this.actions[actionName] = (payload) => {
fn(this, payload)
}
})
}
commit = (mutationName, payload) => {
this.mutations[mutationName](payload)
}
dispatch = (actionName, payload) => {
this.actions[actionName](payload)
}
get state() {
return this.s.state
}
}
const install = (_Vue) => {
Vue = _Vue
Vue.mixin({
beforeCreate() {
console.log('beforeCreate')
if (this.$options && this.$options.store) {
this.$store = this.$options.store
} else {
this.$store = this.$parent && this.$parent.$store
}
}
})
}
export default {
install,
Store
}
- 总体思路就是在Vue实例上挂上一个store实例,使用Vue提供的install方法注入,之后将用户传入的都绑定上去即可
1. 希望本文能对大家有所帮助,如有错误,敬请指出
2. 原创不易,还请各位客官动动发财的小手支持一波(关注、评论、点赞、收藏) 3. 拜谢各位!后续将继续奉献优质好文 4. 如果存在疑问,可以私信我(主页有Q)
|