先上最终封装的useGetter.js
import { mapGetters, createNamespacedHelpers } from 'vuex'
import { useMapper } from './useMapper'
export function useGetters(moduleName, mapper) {
let mapperFn = mapGetters
if (typeof moduleName === 'string' && moduleName.length > 0) {
mapperFn = createNamespacedHelpers(moduleName).mapGetters
} else {
mapper = moduleName
}
return useMapper(mapper, mapperFn)
}
getters的基本使用
某些属性我们可能需要警告变化后来使用,这个时候可以使用getters:
getters第二个参数getters
getters的返回函数
mapGetters的辅助函数
这里我们也可以使用mapGetters的辅助函数。
<template>
<div>
<h2>总价值: {{ $store.getters.totalPrice }}</h2>
<h2>总价值: {{ $store.getters.totalPriceCountGreaterN(1) }}</h2>
<hr>
<h2>{{ sNameInfo }}</h2>
<h2>{{ sAgeInfo }}</h2>
<!-- <h2>{{ ageInfo }}</h2>
<h2>{{ heightInfo }}</h2> -->
<hr>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
export default {
computed: {
...mapGetters(["nameInfo", "ageInfo", "heightInfo"]),
...mapGetters({
sNameInfo: "nameInfo",
sAgeInfo: "ageInfo"
})
},
setup() {
}
}
在setup中使用
传统方法
<script>
import { computed } from "vue"
import { mapGetters, useStore } from 'vuex'
export default {
setup() {
const store = useStore();
const sNameInfo = computed(() => store.getters.nameInfo)
return {
sNameInfo
}
}
}
封装一个hooks下的useGetters.js
import { computed } from 'vue'
import { mapGetters, useStore } from 'vuex'
export function useGetters(mapper) {
// 拿到store独享
const store = useStore()
// 获取到对应的对象的functions: {name: function, age: function}
const storeStateFns = mapGetters(mapper)
// 对数据进行转换
const storeState = {}
Object.keys(storeStateFns).forEach(fnKey => {
const fn = storeStateFns[fnKey].bind({$store: store})
storeState[fnKey] = computed(fn)
})
return storeState
}
组件中使用getter的封装
<template>
<div>
<h2>总价值: {{ $store.getters.totalPrice }}</h2>
<h2>总价值: {{ $store.getters.totalPriceCountGreaterN(1) }}</h2>
<hr>
<h2>{{ nameInfo }}</h2>
<h2>{{ ageInfo }}</h2>
<h2>{{ heightInfo }}</h2>
<hr>
</div>
</template>
<script>
import { useGetters } from '../hooks/useGetters'
export default {
computed: {
},
setup() {
const storeGetters = useGetters(["nameInfo", "ageInfo", "heightInfo"])
return {
...storeGetters
}
}
}
</script>