vue跳转页面之后返回_vue-router 页面跳转后如何记录返回后的位置

前两种方法需要设置路由history模式,后两种方法貌似更合适。

方法一:

1.在router.js里面(即路由文件中),此时模式为 history

const router = new VueRouter({

mode: 'history',

routes,

scrollBehavior (to, from, savedPosition) {

if (savedPosition) {

return savedPosition

} else {

if (from.meta.keepAlive) {

from.meta.savedPosition = document.body.scrollTop

}

return { x: 0, y: to.meta.savedPosition || 0 }

}

}

})

2.在router.js里面需要记录位置的单页面里面

let routes = [

{

path: '/',

name: 'home',

component: home,

meta: {

title: 'home',

keepAlive: true

}

}

3.App.vue里面

 这样写的意义就是不缓存所有页面,哪个地方写了 keepAlive:true,哪个地方就记录位置(加缓存)

4.位置确实记录上了(加缓存,返回不刷新页面),也就是说,返回不触发created,所以有些页面需要返回触发的东西都写在activated里面。其实整个过程很简单,代码也很干练,因为这是路由自带的功能,只不过之前没有发现罢了

方法二:scrollBehavior方法

1.router文件中设置为 mode: 'history', 模式

2.router设置

scrollBehavior (to, from, savedPosition) {

if (savedPosition) {

return savedPosition

} else {

return { x: 0, y: 0 }

}

}

3.详情页返回列表页时, 用 history.back() 返回

方法三:用默认的hash模式的

一个list页点击进入detail页,我在这时记录下list页滚动条的位置,然后在detail页返回到list页时设置滚动条位置为刚才保存那个值。

// list页route中的data钩子

route : {

data : function () {

var _this = this;

// 返回同一个位置

var scrollTop = sessionStorage.getItem("scrollTop");

if (scrollTop) {

_this.$nextTick(function () {

$(".abuild-record-layout").scrollTop(scrollTop);

});

}

}

}

$nextTick将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上。

方法四:

beforeRouteLeave(to, from, next){

let position = window.scrollY()

this.$store.commit('SAVE_POSITION', position) //离开路由时把位置存起来

next()

}

在页面中取值

updated () {

this.$nextTick(function(){

let position = this.$store.state.position //返回页面取出来

window.scroll(0, position)

})

}

用updated 或者 beforeUpdate 钩子都可以  代码都写在要保存滑动距离的界面如果data在进入页面被更新,那update可能不那么合适,这个时候,可以使用组件内守卫

//组件内的守卫

beforeRouteEnter (to, from, next) {

next(vm => {

// 通过 `vm` 访问组件实例

vm.$nextTick(function(){

let position = vm.$store.state.position //返回页面取出来

console.log("beforeRouteEnter moments update: ", position);

window.scroll(0, position)

// setTimeout(function(){window.scroll(0, position)},1000)

})

})

}

参考:

https://router.vuejs.org/zh/guide/advanced/scroll-behavior.html#%E5%BC%82%E6%AD%A5%E6%BB%9A%E5%8A%A8

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值