uni-app 内置了 vuex ,在 main.js 中的引用即可。
创建状态管理文件
项目根下新建一个 store 文件夹,创建一个 index.js
store/index.js
import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {appName: 'test app',version: '0.0.1',globalCount: 0},mutations: {increment (state) {state.globalCount ++},setCount (state, num) {state.globalCount = num},['SET_APPNAME'] (state, arg) {state.appName = arg}},actions: {setCount ({commit}, args) {commit('setCount', args.count)}},getters: {version: state => {return state.version}}})
以上代码创建了一个简单的状态管理文件,使用不同写法定义了 state、mutations、actions、getters
在 main.js 中引入
然后在 main.js 中引入,跟平常写 Vue 程序一样:
main.js
import Vue from 'vue'import App from './App'import store from './store'Vue.prototype.$store = storeVue.config.productionTip = falseApp.mpType = 'app'const app = new Vue({...App,store}).$mount()
在组件中使用
在组件中使用就很容易了,跟平常一样用即可:
import {mapState, mapMutations, mapActions, mapGetters} from 'vuex'export default {computed: {...mapState({appName: state => state.appName,globalCount: state => state.globalCount}),...mapGetters({version: 'version'})},created () {// Stateconsole.log(this.appName); // test app// Mutationthis.setAppName('Hello uni-app')console.log(this.appName); // Hello uni-appthis.increment()console.log(this.$store.state.globalCount); // 1// Actionthis.setCount({count: 10})console.log(this.globalCount); // 10// Getterconsole.log(`version: ${this.version}`); // version: 0.0.1},methods: {...mapMutations({setAppName: 'SET_APPNAME',increment: 'increment'}),...mapActions({setCount: 'setCount'})}}
当然,也可使用 commit 和 dispatch 方法进行提交:
// Mutationthis.$store.commit('SET_APPNAME', 'Hello uni-app')console.log(this.appName); // Hello uni-appthis.$store.commit('increment')console.log(this.$store.state.globalCount); // 1// Actionthis.$store.dispatch('setCount', {count: 10})console.log(this.globalCount); // 10
