最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How can I get the Vue routers history? - Stack Overflow

programmeradmin2浏览0评论

I need to detect whether or not the Vue router has any more entries in its history to go back to. I would use this to detect whether or not to trigger the exit app function. As long as the app can go back to a previous page, it should, but when it es to the end it should exit.

I need to detect whether or not the Vue router has any more entries in its history to go back to. I would use this to detect whether or not to trigger the exit app function. As long as the app can go back to a previous page, it should, but when it es to the end it should exit.

Share Improve this question asked May 1, 2017 at 5:39 Simon HyllSimon Hyll 3,6383 gold badges27 silver badges49 bronze badges 1
  • 4 The router does not store history. It's a router, ie it takes an ining URI and routes the request appropriately. I suggest reading this ~ developer.mozilla/en-US/docs/Web/API/History_API – Phil Commented May 1, 2017 at 5:55
Add a ment  | 

2 Answers 2

Reset to default 2

So I had a similar issue, running both an angularjs and vue.js app side by side. Once the vue.js history stack was empty, go to angularjs. Here is my vuex solution I used:

/** store/history.ts */

import { clientRouter } from '@/views'
import { Route } from 'vue-router'
import { ActionTree, GetterTree, Module, MutationTree } from 'vuex'
import { IRootState } from '.'

export interface IHistoryState {
    history: Route[]
}

const historyState: IHistoryState = {
    history: []
}

const getters: GetterTree<IHistoryState, IRootState> = {
    history: state => state.history
}

const mutations: MutationTree<IHistoryState> = {
    pop: state => state.history.pop(),
    push: (state, route: Route) => state.history.push(route)
}

const actions: ActionTree<IHistoryState, IRootState> = {
    back: context => {
        const history = context.state.history
        if (history.length === 1) {
            window.location.href = '/angular.html'
        }
        else {
            clientRouter.back()
        }
    },
    record: (context, route: Route) => {
        const history = context.state.history

        // Reloading same page
        if (history.length && history[history.length - 1].name === route.name) {
            context.mit('pop')
            context.mit('push', route)
            return false
        }
        // Going back
        else if (history.length > 1 && history[history.length - 2].name === route.name) {
            context.mit('pop')
            return false
        }
        else {
            context.mit('push', route)
            return true
        }
    }
}

export default {
    state: historyState,
    getters,
    mutations,
    actions,
    namespaced: true
} as Module<IHistoryState, IRootState>

I'm using clientRouter here because of SSR but you can use whichever router. Also its in typescript, I can convert it to vanilla if requested. With this method you should always go back using the action here. Then all you need is a way to record the history, I used this code on the main app ponent:

/** app.vue */

@Action('history/record') recordHistory: (to: Route) => forward:boolean

@Watch('$route')
function (to: Route) {
    // Push to history
    this.recordHistory(to)

    // Analytics
    analytics.trackPageView()
}

Your question is a little unclear in regards to "As long as the app can go back to a previous page" - by previous do you mean any page in the browser's history or a page in your application?

If it's the first, you could simply do:

history.back();
app.exitProcess();

So your script can only reach the exitProcess if the browser couldn't go back in history.

You could also look up document.referrer, but it's often times an empty or undefined value.

However, if it's the second option, then I feel you should keep a history state to know when is the last 'back' action performed inside your app and when it would go over aka go back to a different site.

发布评论

评论列表(0)

  1. 暂无评论