相当于组件里面的计算属性computed,就是对数据仓库(状态)通过类似computed包装,提供给外部组件直接使用,就不用在各个组件里面用computed包裹了。

直接使用

src/store/index.js
image.png

组件内使用
image.png image.png

引用其他 getters

第二个参数可以直接使用其他getters属性
image.png

外部传参数(重要)

正常来说一个getters是返回一个值,不能接受参数。

但是如果你返回的是一个函数,那么就可以给这个函数传参数,相当于不同的地方还可以做到差异化,增加代码复用
image.png

外部组件内使用
image.png

批量引入 mapGetters(重要)

和mapState差不多

Vue2 和 Vue3 选项API

image.png

Vue3 组合API

和上面mapState差不多,只是一个是mapState,一个是mapGetters。

同样可以封装成hook函数,直接给组件调用。

封装
image.png

外部组件使用
image.png

因为基本上差不多,所以还可以再做一层封装,把一样的代码进行复用,外部使用还是上图那样使用

hook/useMapper.js

  1. import { computed } from 'vue'
  2. import { mapState, useStore } from 'vuex'
  3. export function useMapper(mapper, mapFn) {
  4. // 拿到store独享
  5. const store = useStore()
  6. // 获取到对应的对象的functions: {name: function, age: function}
  7. const storeStateFns = mapFn(mapper)
  8. // 对数据进行转换
  9. const storeState = {}
  10. Object.keys(storeStateFns).forEach(fnKey => {
  11. const fn = storeStateFns[fnKey].bind({$store: store})
  12. storeState[fnKey] = computed(fn)
  13. })
  14. return storeState
  15. }

hook/useState.js

  1. import { mapState } from 'vuex'
  2. import { useMapper } from './useMapper'
  3. export function useState(mapper) {
  4. return useMapper(mapper, mapState)
  5. }

hook/useGetters.js

  1. import { mapGetters } from 'vuex'
  2. import { useMapper } from './useMapper'
  3. export function useGetters(mapper) {
  4. return useMapper(mapper, mapGetters)
  5. }

hook 函数总出口

image.png
给这些hook一个总出口js文件,最终在外部文件内引入总出口即可

  1. import { useState,useGetters } from '@/hooks/index.js' // 你自己项目路径