前文的解决方法 其实是有问题的。

1. 问题

前文提到 saved_position 的返回值有时是 undefined,有时是 null。经过仔细调试,可以发现 undefined 只会出现一次,以后都是出现 null。出现的过程为:

用户访问具有 keep-alive 的 List 页面

用户点击 router-link 切换到其他页面

点击浏览器后退按钮,回到 List 页面,此时的 saved_position 值即为 undefined

之后所有的后退前进都是 null,不再有 undefined。

但是步骤 3 当中,其实应该是有值的,但 vue 的实现中会生成很多的 _key,这个实现其实是有问题的,生成了很多多余的 _key,导致与用户的浏览器历史行为不一致,导致出现 undefined。

2.终极解决文案

既然 vue-router 保存的滚动条值是错误的,那么我们自己保存好了,然后在适当的时机进行“位置修复”。

# router.coffee

router = new VueRouter(

mode: 'history'

routes: [

{

path: '/list'

name: 'list'

meta:

title: '列表页'

keep_alive: true

saved_position: {x: 0, y: 0} # 这里新增设置默认值为顶顶

component: require('../views/list.vue')

},

...

]

scrollBehavior: (to, from, saved_position) ->

# 点击了非浏览器按钮,则设置为 null,方便组件中刷新 ajax 数据

if saved_position == null

if to.meta.keep_alive

to.meta.saved_position = null

# 点击了浏览器前进/后退,则直接使用正确的位置,并且组件知道不是 null,

# 不会刷新 ajax 数据

else

saved_position = to.meta.saved_position

return saved_position ? {x: 0, y: 0}

)

router.beforeEach (to, from, next) ->

# 存储滚动条位置

if from.meta.keep_alive

from.meta.saved_position =

x: window.pageXOffset

y: window.pageYOffset

next()

我们在,router.beforeEach 中在页面切换之前,保存当前滚动条的位置到相关的 meta.saved_position 中。

在 scrollBehavior 中还原,这样位置就不会出现 undefined 了。

接下来就是在组件中如何更新 ajax 数据了:

# list.coffee

export default Dashboard =

name: 'Dashboard'

data: ->

posts: []

beforeRouteEnter: (to, from, next) ->

next (vm) ->

# 如果为 null,则说明点击了 router-link,此时可刷新 ajax 数据。

# 否则,为点击了浏览器后退/前进,什么也不做即可。

# 交给 keep-alive 处理缓存,scrollBehavior 处理修复后的滚动条位置。

if to.meta.saved_position == null

vm.fetchPosts()

# 或者你有其他控制逻辑,如:

# 帖子列表为空时,也强制获取 ajax 数据:

if (to.meta.saved_position == null) or (vm.posts.length == 0)

vm.fetchPosts()

methods:

fetchPosts: (type) ->

@$store

.dispatch(types.dashboard.actions.GET_POSTS)

.then (res) =>

...

以上。

AJAX技术文案沙雕,vue-router 中使用 keep-alive 控制 ajax 请求的缓存策略(二)相关推荐

  1. Vue项目中created生命周期重复执行,未缓存下来

    Vue项目中.vue文件的created函数进行路由切换时,执行了多次. 路由切换跳转时,发现一个页面的接口和页面展示每次进入都重新请求以及渲染,没有缓存下来,对比了一下的其它页面,并没有这个问题,所 ...

  2. vue router中hash模式和history模式的区别

    面试问答     hash 模式与 history 模式的区别,这个也是面试常问的问题,不要小看这道题其实问到这里的时候那个面试官应该是个大牛,开发经验丰富,这个题其实就是考验你的开发经验是否属实. ...

  3. VUE+Element中eldialog弹框控制最小宽度

    <template><div><div><el-button @click="dialogFormVisible=true">打开& ...

  4. Ajax技术群英会,火热报名中!

    Ajax技术群英会 --说说你最爱的Ajax框架 一.会议介绍 Ajax不仅仅是一种技术,更是Web 2.0时代最具创意的思想之一,它对Web世界的影响极其深远.随着Ajax技术的发展,各种Ajax框 ...

  5. 盘点营销策划案例之2019年沙雕广告!

    • 引言 • "一时沙雕一时爽,一直沙雕一直爽!" 2019年是"沙雕广告"元年,"沙雕文化"开始变得大众化,没有人可以躲得过"沙 ...

  6. Vue学习笔记(六)--- 前端路由 Vue Router

    一.路由 1.概念 ​ 路由本质上来说就是一种对应关系,比如说我们在浏览器中输入不同的 url 地址,我们就能访问不同的资源,那么这 url 地址与资源之间的对应关系,就是路由. 2.分类 ① 后端路 ...

  7. Vue Router 4.0 正式发布!焕然一新。

    关注若川视野,回复"pdf" 领取资料,回复"加群",可加群长期交流学习 12月8日,Vue Router 4 正式发布稳定版本. 在经历了 14 个 Alph ...

  8. python 全栈开发,Day91(Vue实例的生命周期,组件间通信之中央事件总线bus,Vue Router,vue-cli 工具)...

    昨日内容回顾 0. 组件注意事项!!!data属性必须是一个函数!1. 注册全局组件Vue.component('组件名',{template: ``})var app = new Vue({el: ...

  9. Vue Router的详细教程

    Vue Router的详细教程 安装 #直接下载 / CDN https://unpkg.com/vue-router/dist/vue-router.js Unpkg.com 提供了基于 NPM 的 ...

最新文章

  1. jQuery1.8 css模块评析
  2. vue导航栏跳转路由
  3. 女友的前男友教我该怎么照顾她......
  4. 取余运算||快速幂(洛谷-P1226)
  5. python网页提交表单_使用Python中的POST请求通过网站表单上传基本文件
  6. 房产证是不是必须房贷还完才可以拿回来?
  7. C++ 虚函数表解析(转)
  8. 【Matlab】求解函数导数
  9. jenkins下载及安装
  10. 有什么新手适合的3D建模软件
  11. 小智机器人型号_小智类人型机器人
  12. MTK DDR进行ETT之后的压力---测试环境的搭建
  13. python 单词纠错_自然语言处理1——语言处理与Python(内含纠错)
  14. win10 官方纯净版安装详细图解
  15. 如何在“运行”里打开软件
  16. 【302期】SpringBoot 项目鉴权的 4 种方式,你了解吗?
  17. OpenCV深入学习(6)--直方图之calcHist使用(补)
  18. C# 类似PS的魔棒工具(1)
  19. python进阶学什么意思_Python进阶学习
  20. matlab最优控制实验报告_最优控制的MATLAB实现.doc

热门文章

  1. 【毕业设计】jSP在线教学质量评价系统的设计与实现(源代码+论文)
  2. whitelabel error page怎么解决_pyppeteer使用遇到的bug及解决方法
  3. python 爬虫框架_小白学 Python 爬虫(28):自动化测试框架 Selenium (下)
  4. python中mean的用法_python 的numpy库中的mean()函数用法介绍
  5. java里format报错,我的Android进阶之旅------Java字符串格式化方法String.format()格式化float型时小数点变成逗号问题...
  6. 各种SQL数据库的数据类型
  7. HALCON:与C++交互
  8. Halcon PDF文档(extension_package_programmers_manual)学习总结
  9. java底层 文件操作,java底层是怎的对文件操作的
  10. githubRank: Github 项目和用户排行榜