uni-app 内置了 vuex ,在 main.js 中的引用即可。

创建状态管理文件

项目根下新建一个 store 文件夹,创建一个 index.js

store/index.js

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. Vue.use(Vuex)
  4. export default new Vuex.Store({
  5. state: {
  6. appName: 'test app',
  7. version: '0.0.1',
  8. globalCount: 0
  9. },
  10. mutations: {
  11. increment (state) {
  12. state.globalCount ++
  13. },
  14. setCount (state, num) {
  15. state.globalCount = num
  16. },
  17. ['SET_APPNAME'] (state, arg) {
  18. state.appName = arg
  19. }
  20. },
  21. actions: {
  22. setCount ({commit}, args) {
  23. commit('setCount', args.count)
  24. }
  25. },
  26. getters: {
  27. version: state => {
  28. return state.version
  29. }
  30. }
  31. })

以上代码创建了一个简单的状态管理文件,使用不同写法定义了 state、mutations、actions、getters

在 main.js 中引入

然后在 main.js 中引入,跟平常写 Vue 程序一样:

main.js

  1. import Vue from 'vue'
  2. import App from './App'
  3. import store from './store'
  4. Vue.prototype.$store = store
  5. Vue.config.productionTip = false
  6. App.mpType = 'app'
  7. const app = new Vue({
  8. ...App,
  9. store
  10. }).$mount()

在组件中使用

在组件中使用就很容易了,跟平常一样用即可:

  1. import {mapState, mapMutations, mapActions, mapGetters} from 'vuex'
  2. export default {
  3. computed: {
  4. ...mapState({
  5. appName: state => state.appName,
  6. globalCount: state => state.globalCount
  7. }),
  8. ...mapGetters({
  9. version: 'version'
  10. })
  11. },
  12. created () {
  13. // State
  14. console.log(this.appName); // test app
  15. // Mutation
  16. this.setAppName('Hello uni-app')
  17. console.log(this.appName); // Hello uni-app
  18. this.increment()
  19. console.log(this.$store.state.globalCount); // 1
  20. // Action
  21. this.setCount({count: 10})
  22. console.log(this.globalCount); // 10
  23. // Getter
  24. console.log(`version: ${this.version}`); // version: 0.0.1
  25. },
  26. methods: {
  27. ...mapMutations({
  28. setAppName: 'SET_APPNAME',
  29. increment: 'increment'
  30. }),
  31. ...mapActions({
  32. setCount: 'setCount'
  33. })
  34. }
  35. }

当然,也可使用 commit 和 dispatch 方法进行提交:

  1. // Mutation
  2. this.$store.commit('SET_APPNAME', 'Hello uni-app')
  3. console.log(this.appName); // Hello uni-app
  4. this.$store.commit('increment')
  5. console.log(this.$store.state.globalCount); // 1
  6. // Action
  7. this.$store.dispatch('setCount', {count: 10})
  8. console.log(this.globalCount); // 10

参考资料