vue2
mixin.js
import { mapGetters, mapActions } from 'vuex'
export const storeMixin = {
computed: {
...mapGetters([
'dataA',
'dataB'
])
},
methods: {
...mapActions([
'setDataA',
'setDataB',
]),
}
}
return storeMixin
页面中使用
import mixin from 'mixin.js'
export default {
mixins: [mixin],
data () {
return {}
},
methods: {
func() {}
}
}
vue3
使用vue3 Composition API可以避免vue2 mixins混入的重名问题。
但是由于vue3的setup()中没有this指向vue实例,所以需要useStore()方法来获取store,同时1.使用以下方法封装一个mapGetters 2.在store._actions中可以获取到所有的action并解构出来。
工具类中封装
/**
* 在composition api中代替mapGetters
* @param {Object} 如store.getters
* @returns 包含所有getter,解构使用
*/
export const useGetters = (getters) => {
return Object.fromEntries(
Object.keys(getters).map(
getter => [getter, computed(() => getters[getter])]
)
)
}
useSomeEffect.js
import { useGetters } from 'util'
export default function () {
const store = useStore()
let { // getters
dataA,
dataB,
} = useGetters(store.getters)
const { // actions
setDataA: [setDataA],
setDataB: [setDataB],
} = store._actions
return {
dataA, setDataA,
dataB, setDataB
}
}
页面中使用
import useSomeEffect from 'useSomeEffect'
let { dataB, setDataB } = useSomeEffect() // 想要啥用啥
参考资料: