vuex如何模块重用?

先说一下我的业务场景,我现在有A、B两个页面,
A页面里有a1、a2两个子组件,通过vuex的isComponent来显示具体的某一个组件

A.vue的代码如下:

<template>
    <div class="box">
        <keep-alive>
            <component :is="isComponent"></component>
        </keep-alive>
    </div>
</template>

<script>
    // a1组件
    import a1 from './a1';

    // a2组件
    import a2 from './a2';

    import { mapState } from 'vuex';
    export default {
        data () {
            return {};
        },
        computed: {
            ...mapState({
                isComponent: state => state.a.isComponent
            })
        },
        components: {
            a1,
            a2
        },
        methods: {},
        created () {
            this.$store.commit('setComponent', 'a1');
        }
    };
</script>

A页面的vuex文件a.js的代码如下:


export default {
    state () {
        return {
            // 当前展示的组件名称
            isComponent: ''
        };
    },

    gettters: {},

    mutations: {
        // 设置当前要展示的组件
        setComponent: (state, componentName) => {
            state.isComponent = componentName;
        }
    }
};

B页面对应的代码和A页面类似
B.vue的代码如下:

<template>
    <div class="box">
        <keep-alive>
            <component :is="isComponent"></component>
        </keep-alive>
    </div>
</template>

<script>
    // b1组件
    import b1 from './b1';

    // b2组件
    import b2 from './b2';

    import { mapState } from 'vuex';
    export default {
        data () {
            return {};
        },
        computed: {
            ...mapState({
                isComponent: state => state.b.isComponent
            })
        },
        components: {
            b1,
            b2
        },
        methods: {},
        created () {
            this.$store.commit('setComponent', 'b1');
        }
    };
</script>

B页面的vuex文件b.js的代码如下:


export default {
    state () {
        return {
            // 当前展示的组件名称
            isComponent: ''
        };
    },

    gettters: {},

    mutations: {
        // 设置当前要展示的组件
        setComponent: (state, componentName) => {
            state.isComponent = componentName;
        }
    }
};

后期可能还有C、D、E...等页面,问:vuex中的a.js和b.js里的代码基本一致,怎样可以避免重复代码?

阅读 4.6k
3 个回答

我是这么理解的,可封装成公共的组件,所有的页面都可以调用,然后就涉及到如何使用公共组件模块,但是做到不互相影响的问题。目前知道的两种方案:
1.就是在使用vuex时候,加上路由进行区分。例如

this.$store.dispatch('setComponent', [{route: this.$route.path, data: {}}])

2.使用vuex的modules,不同的页面使用不同的modules,区分so easy。
仅供参考,(不知道各位大神有没有更好的)

新手上路,请多包涵

请问问题解决了吗

新手上路,请多包涵
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题