vue3单独讲store的action封装不起作用?

发布于 2022-09-13 01:28:56 字数 1929 浏览 32 评论 0

lib.ts:

import { Store, useStore } from 'vuex';

export const getLang = (): ComputedRef<SupportLanguageType> => {
    const store: Store<RootState> = useStore();

    return computed(() => store.state.language);
};

export const toogleMenu = async (status?: boolean): Promise<void> => {
    const store: Store<RootState> = useStore();

    return store.dispatch('toogleSideShrink', status);
};

test.vue:

<button @click="toogleMenu">{{ language }}</button>

<script lang="ts">
import { defineComponent } from 'vue';
import { getLang, toogleMenu } from './lib';

export default defineComponent({
    setup() {
        return {
            language: getLang(),
            toogleMenu
        };
    }
});
</script>

language的获取没有问题,也会跟着store里面的数据变化,但是toogleMenu方法点击就报store是undefined,就很好奇为啥,感觉与响应式和vue生命周期有关系,但是试了很多办法都不行,感觉dispatch不能单独使用,只能这么写:

// test.vue
export default defineComponent({
    setup() {
        const store: Store<RootState> = useStore();
        const toogleMenu = (status?: boolean) => store.dispatch('toogleSideShrink', status);

        return {
            language: getLang(),
            toogleMenu
        };
    }
});

或者

// lib.ts
export const toogleMenu = {
    methods: {
        async toogleMenu(status?: boolean): Promise<void> {
            // eslint-disable-next-line @typescript-eslint/ban-ts-comment
            //@ts-ignore
            return await this.$store.dispatch('toogleSideShrink', status);
        }
    }
};

// test.vue
export default defineComponent({
    mixins: [toogleMenu],
    setup() {
        return {
            language: getLang()
        };
    }
});

有知道的大神能解释一下不o( ̄︶ ̄)o

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

恬淡成诗 2022-09-20 01:28:56

看不懂为什么要这么写,是因为ts引用很麻烦吗?第一个应该直接定义getters,第二个是因为上下文关系的原因,可以再包一层,在setup里执行返回一个方法进行绑定。
推荐使用const store = inject('store')
想要更简单使用的vuex实现类型提示,请看我发布的文章!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文