如何维护Vue.js中的路由跳转记录

在Vue的项目中,如果我们想要回退或者后退,我们一般会调用api router.go(n),但是在实际操作中,使用这个api是有风险的,就是会让用户跳出当前的应用,因为它记录的是浏览器的访问记录,而不是你当前应用的访问记录,这是一件非常可怕的事情。

解决方法是我们自己维护一个历史跳转记录。

案例和使用场景

代码地址:/dora-zc/mini-vue-mall(本地下载)

这是一个基于Vue.js的小型商场案例,应用场景是:

实现一个Vue插件src/utils/history.js,通过堆栈维护页面跳转的历史,控制返回跳转。

点击返回按钮是一个堆栈操作。

在全局路由router.js中,路由器的back()方法在实例化路由之前通过原型进行扩展。

在全局afterEach中存储历史记录

代码实现

实现历史插件并维护历史。

// src/utils/history.js

常量历史= {

_history: [],//历史堆栈

安装(Vue) {

//提供Vue插件需要的安装方法。

object . define property(vue . prototype,' $routerHistory ',{

get() {

回归历史;

}

})

},

在堆栈上推送(path) {//消息

这个。_history.push(路径);

},

pop() {

这个。_ history . pop();

},

canBack(){

归还这个。_ history.length & gt1;

}

}

导出默认历史记录;

在路由实例化之前扩展back()方法。

// src/router.js

从“vue”导入Vue

从“vue路由器”导入路由器

从'导入历史记录。/utils/history ';

Vue.use(路由器);

Vue.use(历史);

//实例化前扩展路由器。

router . prototype . go back = function(){

this.isBack = true

this . back();

}

每次之后,在路由全局中记录跳转历史。

// src/router.js

//在每个记录历史之后

router.afterEach((to,from)= & gt;{

if (router.isBack) {

//后退

history . pop();

router.isBack = false

router . transition name = ' route-back ';

}否则{

history . push(to . path);

router . transition name = ' route-forward ';

}

})

用于公共头组件

// Hearder.vue

& lt模板& gt

& ltdiv class="header " >

& lth 1 & gt;{ { title } } & lt/h 1 & gt;

& ltI v-if = " $ router history . can back()" @ click = " back " & gt;& lt/I & gt;

& ltdiv class="extend " >

& ltslot & gt& lt/slot & gt;

& lt/div & gt;

& lt/div & gt;

& lt/template & gt;

& lt脚本& gt

导出默认值{

道具:{

标题:{

类型:字符串,

预设值: ""

}

},

方法:{

back() {

这个。$ router . go back();

}

}

};

& lt/script & gt;

请查看完整代码:/dora-zc/mini-vue-mall(本地下载)

摘要