详细页返回列表保留原来滚动条所在位置

简介: 最近学校要求做个项目,在新闻列表页中向下滑动后,随别打开一个新闻,进入该新闻的详情页面,当看完后,从详情页返回到新闻列表页。而且滚动条也回到了最顶上的第1个新闻了。这样影响用户的体验效果。

最近学校要求做个项目,在新闻列表页中向下滑动后,随别打开一个新闻,进入该新闻的详情页面,当看完后,从详情页返回到新闻列表页。而且滚动条也回到了最顶上的第1个新闻了。这样影响用户的体验效果。

解决这个问题需要用路由守卫

第一步我们要在index.js给需要缓存的新闻列表添加meta属性用来缓存组件,代码如下:

import Vue from 'vue'
import VueRouter from 'vue-router'
import News from '../views/News'
import New from '../components/new'
Vue.use(VueRouter)
const routes = [{
    path: '/',
    component: News,
    meta: { keepAlive: true }
}, {
    path: '/new/:id',
    component: New
}]

keepAlive如果为true说明该组件需要缓存

第二步我们要在主入口文件App.vue添加keepAlive标签 代码如下:

<template>
  <div id="app">
    <keep-alive>
      <router-view v-if="$route.meta.keepAlive"></router-view>
    </keep-alive>
    <router-view v-if="!$route.meta.keepAlive"></router-view>
  </div>
</template>

通过v-if来判断,前面路由配置的$route.meta.keepAlive是否为true,为true的话则会将组件进行缓存,所以我们要在新闻列表添加keepAlive为true

第三步我们要给新闻列表news.vue添加路由守卫

<template>
  <div id="news" ref="listBox">
    <ul>
      <li v-for=" newa in news" :key="newa.id">
        <router-link :to="'/new/' +newa.id">{{newa.title}}</router-link>
      </li>
    </ul>
    <router-view></router-view>
  </div>
</template>
<script>
export default {
  name: 'news',
  data() {
    return {
      scroll: 0,
      news: [
        { id: 1, title: '新闻1', desc: '新闻1' },
        { id: 2, title: '新闻2', desc: '新闻2' },
        { id: 3, title: '新闻3', desc: '新闻3' },
        { id: 4, title: '新闻4', desc: '新闻4' },
        { id: 5, title: '新闻5', desc: '新闻5' },
        { id: 6, title: '新闻6', desc: '新闻6' },
        { id: 7, title: '新闻7', desc: '新闻7' },
        { id: 8, title: '新闻8', desc: '新闻8' },
        { id: 9, title: '新闻9', desc: '新闻9' },
        { id: 10, title: '新闻10', desc: '新闻10' },
        { id: 11, title: '新闻11', desc: '新闻11' },
        { id: 12, title: '新闻12', desc: '新闻12' },
        { id: 13, title: '新闻13', desc: '新闻13' },
        { id: 14, title: '新闻14', desc: '新闻14' },
        { id: 15, title: '新闻15', desc: '新闻15' }
      ]
    }
  },
  beforeRouteLeave(to, from, next) {
    console.log('激活beforeRouteLeave路由')
    // }
    this.scroll = this.$refs.listBox.scrollTop
    console.log(this.scroll)
    next()
  },
  activated() {
    console.log('激活activated钩子函数')
    this.$refs.listBox.scrollTop = this.scroll
  }
}
</script>

我们要用到beforeRouteLeave,和activated

beforeRouteLeave守卫:即将离开该组件的路由是调用,三个参数:to表示即将进入的目标路由对象,from表示当前导航正要离开的路由对象,newt是一个函数对象,next():进入管道中的下一个钩子,如果没有钩子则确认导航。

activated钩子:该组件缓存后调用,没有使用缓存,也就是没有被<keep-alive>包裹的话,activated是不起作用,

滚动条在那就在那添加ref:listBox属性 用来获取改标签的滚动条

目录
相关文章
|
关系型数据库 MySQL
925. 【mysql】convert 函数
925. 【mysql】convert 函数
522 3
|
数据可视化 索引
数据可视化之antv/g6 元素之边(edge)
数据可视化之antv/g6 元素之边(edge)
2259 0
echarts 柱状图/折线图x轴坐标间隔
echarts 柱状图/折线图x轴坐标间隔
1524 0
|
11月前
|
Java 开发者 Spring
java springboot监听事件和处理事件
通过上述步骤,开发者可以在Spring Boot项目中轻松实现事件的发布和监听。事件机制不仅解耦了业务逻辑,还提高了系统的可维护性和扩展性。掌握这一技术,可以显著提升开发效率和代码质量。
379 13
|
前端开发 数据可视化 开发者
D3.js 内置的动画函数
D3.js 内置的动画函数
275 0
|
JavaScript
Vue学习之--------插槽【默认插槽、具名插槽、作用域插槽】
这篇文章详细介绍了Vue.js中的插槽概念,包括默认插槽、具名插槽和作用域插槽的使用方式和实际应用示例,通过代码演示了如何在组件中定义和使用插槽来实现内容的灵活替换和展示。
Vue学习之--------插槽【默认插槽、具名插槽、作用域插槽】
|
关系型数据库 MySQL 大数据
DataX:数据同步的超音速英雄!阿里开源工具带你飞越数据传输的银河系,告别等待和故障的恐惧!快来见证这一数据工程的奇迹!
【8月更文挑战第13天】DataX是由阿里巴巴开源的一款专为大规模数据同步设计的工具,在数据工程领域展现强大竞争力。它采用插件化架构,支持多种数据源间的高效迁移。相较于Apache Sqoop和Flume,DataX通过并发写入和流处理实现了高性能同步,并简化了配置流程。DataX还支持故障恢复,能够在同步中断后继续执行,节省时间和资源。这些特性使其成为构建高效可靠数据同步方案的理想选择。
979 2
|
资源调度 JavaScript
vue项目:集成富文本编辑器 - 百度ueditor(vue-ueditor-wrap)
vue项目:集成富文本编辑器 - 百度ueditor(vue-ueditor-wrap)
1647 0
|
Java 应用服务中间件 对象存储
富文本编辑器Ueditor实战(二)-图片上传
本文重点阐述了如何扩展Ueditor的图片上传功能,以及在实际中,如何根据项目实际情况,设置图片信息的动态展示思路。
1252 0
富文本编辑器Ueditor实战(二)-图片上传
|
存储 数据采集 机器人
介绍大语言模型:langchain
**LangChain框架** 是一个开源工具,由Lang.AI开发,专为基于大语言模型(LLM)的应用程序设计。它简化了与LLM的交互,整合数据检索和功能模块,支持上下文感知和逻辑推理。框架包括**基础层**(Models、LLM、Index)、**能力层**(Chains、Memory、Tools)和**应用层**(Agent),提供模型集成、提示管理、内存系统、索引、链和代理等模块。LangChain的特点包括上下文感知、逻辑推理、预制链和组件,以及开发工具如LangSmith和LangServe。广泛应用在文档分析、聊天机器人、智能助手、代码生成、内容创作和数据科学等领域。