有关vue3中vuex mapStates、mapMutations 和 mapActions的自定义方法

有关vue3中vuex mapStates、mapMutations 和 mapActions的自定义方法

重写原因:vue3中一般常用setup语法,会发现如果像vue2.0里一样使用vuex自带的mapStates、mapMutations和mapActions自动映射会发现效果并不如意,所以我就自定义了这三个方法,用来在vue3中setup使用。
代码如下:

import {useStore} from "vuex";
import {reactive, computed} from "vue";

export {
    mapStates, mapMutations, mapActions
}

/**
 * 自动映射store对应的state属性
 * @returns {ComputedRef<*>|null|UnwrapNestedRefs<{}>}
 * @author 园丁
 * @date 2022/4/10
 * @example const user = mapStates("user") 单个使用是OK的,多个好像无法响应
 */
function mapStates () {
    const store = useStore()
    if (arguments.length === 1) {
        let mapper = arguments[0]
        if (typeof mapper === "string" && mapper.length > 0) {
            return computed(() => store.state[mapper])
        }
        // 这边参数如果是数组的话,会出现页面数据无法响应式更新问题,希望有大佬帮忙解决
        if (mapper instanceof Array && mapper.length > 0) {
            let mappers = reactive({})
            mapper.forEach(item => {
                mappers[item] = mapStates(item)
            })
            return mappers
        }
    }
    console.error("使用方法有误,请检查输入参数的格式!")
    return null
}

/**
 * 自动映射store对应的Mutation方法
 * @returns {(function(*): void)|*|UnwrapNestedRefs<{}>|UnwrapNestedRefs<{}>}
 * @author 园丁
 * @date 2022/4/10
 * @example const {refreshVerificationCode} = mapMutations(["refreshVerificationCode"])
 */
function mapMutations () {
    const store = useStore()
    if (arguments.length === 1) {
        let mapper = arguments[0]
        if (typeof mapper === "string" && mapper.length > 0) {
            return param =>{
                store.commit(mapper, param)
            }
        }
        if (mapper instanceof Array && mapper.length > 0) {
            let mappers = reactive({})
            mapper.forEach(item => {
                mappers[item] = mapMutations(item)
            })
            return mappers
        }
    }
    if (arguments.length === 2) {
        const moduleName = arguments[0]
        const mapper = arguments[1]
        if (typeof moduleName !== "string") {
            console.error("传入的moduleName类型或格式错误!")
            return null
        }
        if (typeof mapper === "string" && mapper.length > 0) {
            let mapperName = moduleName + "/" + mapper
            return mapMutations(mapperName)
        }
        if (mapper instanceof Array && mapper.length > 0) {
            let mappers = reactive({})
            mapper.forEach(item => {
                mappers[item] = mapMutations(moduleName, item)
            })
            return mappers
        }
    }
    console.error("使用方法有误,请检查输入参数的格式!")
    return null
}

/**
 * 自动映射store对应的Action方法
 * @returns {(function(*): Promise<unknown>)|(function(*): Promise<unknown>)|UnwrapNestedRefs<{}>|*|UnwrapNestedRefs<{}>}
 * @author 园丁
 * @date 2022/4/10
 * @example const {refreshVerificationCode} = mapActions(["refreshVerificationCode"])
 */
function mapActions () {
    const store = useStore()
    if (arguments.length === 1) {
        let mapper = arguments[0]
        if (typeof mapper === "string" && mapper.length > 0) {
            return param =>{
                return new Promise((resolve, reject) => {
                    store.dispatch(mapper, param)
                        .then(res => resolve(res)).catch(err => reject(err))
                })
            }
        }
        if (mapper instanceof Array && mapper.length > 0) {
            let mappers = reactive({})
            mapper.forEach(item => {
                mappers[item] = mapActions(item)
            })
            return mappers
        }
    }
    console.error("使用方法有误,请检查输入参数的格式!")
    return null
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3,要在Vuex添加同步方法,可以按照以下步骤进行操作: 1. 首先,在store文件夹下的index.js文件,导入VuexVue,并使用Vue.use(Vuex)来启用Vuex。 2. 在state对象定义需要管理的状态。 3. 在mutations对象定义同步方法。例如,可以添加一个名为increment的方法来增加计数器的值。 4. 在actions对象定义异步方法。这里不需要添加同步方法,因为同步方法应该直接在mutations定义。 5. 在需要使用store的组件,使用useStore函数来获取store实例。 6. 使用store.commit方法来调用mutations定义的同步方法。例如,可以使用store.commit('increment')来调用增加计数器的方法。 下面是一个示例代码: ```javascript // store/index.js import { createStore } from 'vuex' export default createStore({ state: { counter: 0 }, mutations: { increment(state) { state.counter++ } }, actions: { // 异步方法可以在这里定义 }, modules: { // 模块可以在这里定义 } }) ``` ```javascript // 组件使用store import { useStore } from 'vuex' import { computed } from 'vue' export default { setup() { const store = useStore() const sCounter = computed(() => store.state.counter) // 调用同步方法 store.commit('increment') return { sCounter } } } ``` 通过以上步骤,你可以在Vue3使用Vuex来添加同步方法。 #### 引用[.reference_title] - *1* *2* [VUE2,VUE3Vuex的使用详解](https://blog.csdn.net/ICanWin_lll/article/details/119732633)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Vue3Vuex的使用](https://blog.csdn.net/qq_45934504/article/details/123462736)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值