在微信spa中模拟一个路由堆栈系统

Posted by Yinode on Sunday, October 14, 2018

TOC

最近再写一个活动模块,用 vue 写的。这个活动模块需要融合到我们的主项目之中,这就意味着在用路由做其实不太好,活动本身的数据交换比较频繁,用 vuex 太大材小用,用公共对象事件和 Props 传递的方式又不是很方便,所以决定用动态的组件切换来做这个活动模块,也就是说一个活动对应一个路由中的主组件,其中子页面都利用组件做。那么就需要在微信中模拟一个路由系统,否则就无法做到返回。

// 路由切换 返回拦截 模拟一个路由
export const commonActivityMixin = {
    mounted() {
        pushHistory()
        function pushHistory() {
            var state = {
                title: 'title',
                url: '#' + window.location.href.split('#')[1]
            }
            window.history.pushState(
                state,
                'title',
                '#' + window.location.href.split('#')[1]
            )
        }
        window.addEventListener('popstate', this.backHandle, false)
    },
    destroyed() {
        window.removeEventListener('popstate', this.backHandle, false)
    },
    data() {
        return {
            pageStack: [] // 组件栈
        }
    },
    methods: {
        backHandle() {
            if (this.pageStack.length > 0) {
                let prevComponent = this.pageStack.pop()
                this.currentComponent = prevComponent.Com
                this.currentComponentName = prevComponent.ComName
            }
        },
        togglePageHandle(page, meta) {
            // 使用子组件传递PAGE KEY的方式来切换页面
            if (this.componentsMap[page]) {
                // 切换组件前先将当前页面加入到栈中
                this.pageStack.push({
                    Com: this.currentComponent,
                    ComName: this.currentComponentName
                })
                this.currentComponent = this.componentsMap[page]
                this.currentComponentName = page
            // 额外信息 用于组件通讯
            if (meta) {
                this.meta = meta
            } else {
                this.meta = null
            }
        },
    }