先放出两张图(没错,你还在9012,做为一名资深设计师我唯一的技能点就是留白),简单说明下问题
未做回退定位(从落地页回退,每次都回到A位置)想死啊有木有,每次都需要手动重新定位来选择,你大哥看到你做个这肯定想扣死你:

添加回退定位后(从落地页回退,定位到点击位置)哈,好用到爆 有木有~:


按照WBD国际通用惯例(我编的),先对这个demo中用到的文件做一个索引,方便对整个回退功能有个宏观的视角,更容易理解整个流程是怎么走通的,做到心中有术。
这个回退定位demo共涉及到5个文件,分别如下:
BackToA.vue 组件A,也就是需要回退定位的组件,也就是开篇的车祸现场
Alphabet.vue 组件B,跳转落地页,不重要
index.js 在这个文件中进行,配置路由,添加meta属性(keepAlive),很重要
App.vue 模板文件,引入组件(router-view),依据路由是否添加meta属性判断是否启用keep-alive进行组件缓存
main.js 入口文件,引入vuex,在state定义_scrollTop来记录scrollTop值,和改变state值的actions方法来提交mutation更新状态
demo目录结构如下图:

看到这,有没有感觉很宏观。是不是心中有了术,对这个小demo产生了王的蔑视。少年请留步,话说,有术无道,止于术,再给我两分钟,让我把记忆结成冰,说“道”。
道:首先对组件BackToA启用keep-alive缓存,当组件BackToA上下滚动时记录当前页的scrollTop值,并把这个值存储在vuex的state中。当从落地组件B回退到组件BackToA时,缓存生效,组件BackToA不再重新渲染。此时拿到vuex state中存储的scrollTop值,赋值给BackToA组件,实现定位到跳转前的位置。
其实我是一名程序员,ok,下面开始我们喜闻乐见的编程环节。
1.引入vuex存储scrollTop值
因为vuex是整个流程的核心,先把这部分放到第一个梳理清楚方便后面的流程持续进行(我们都受过被打断的伤痛在我这决不允许)(打断的都是工作,没有其它的乱七八糟的什么东西不要乱联想)。
打开入口文件main.js(一般都是这个文件),在这个文件中定义一个store常量、存储一个_scrollTop来存储组件上下滚动时页面的scrollTop值、引入vuex,并启用

源码如下

import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
state: {
_scrollTop: 0 // 存储组件的scrollTop值
},
mutations: {
updatePosition (state, payload) {
state._scrollTop = payload.top // 更改scrollTop值
}
},
actions: {
updatePosition ({commit}, top) {
commit({type: 'updatePosition', top: top}) // 提交mutation 更改状态
}
}
})

2.创建组件BackToA

①引入vuex中的mapState和mapActions

import { mapState, mapActions } from 'vuex'

②在computed计算属性中定义demoTop变量,并读取state中的_scrollTop值给其赋值

computed: {
...mapState({
demoTop: state => state._scrollTop, // 获取 state 中存储的top值
}),
},

③创建监听页面滚动方法,实时监听当前页面的scrollTop值,这个监听放在mounted钩子中触发的原因是:此时页面dom已经渲染完毕

mounted: function () {
console.log("==mounted===");
document.querySelector('.hello').addEventListener('scroll', this.handleScroll, false);
},

  

methods:{
handleScroll(){
this.box = document.querySelector('.hello')
},
},

④实时获取当前页面scrollTop值,提交mutation更新状态

methods:{
handleScroll(){
this.box = document.querySelector('.hello')
this.updatePosition(this.box.scrollTop)
},
...mapActions([
'updatePosition'
]),
},

⑤缓存数据读取,更新scrollTop值,实现定位

activated () {
document.querySelector('.hello').scrollTop = this.demoTop // 更新缓存组件的scrollTop值
},

⑥页面布局

注:我们在这个例子中得到的scrollTop值,是属于class='hello'的,所以在组件中BackToA必须只有class='hello'的div支持 overflow:scroll才行

<template>
<div class="hello">
<ul>
<li v-for="(item,index) in 26" :key="index">
<router-link :to="{ name: 'Alphabet', params: { letter: String.fromCharCode(64+item) }}">{{String.fromCharCode(64+item)}}</router-link>
</li>
</ul>
</div>
</template>
<style scoped>
.hello{
height:600px;
overflow:scroll;
}
.hello>ul{
height:auto;
overflow:hidden;
background:#eee;
}
.hello>ul>li{
height:60px;
line-height:60px;
width:100%;
float:left;
margin:0;
border-bottom:1px dashed #ccc;
}
</style>

3.创建落地组件Alphabet

<template>
<div class="hello">
<div><button @click="goback">goback</button></div>
<ul>
<li>
this is <strong>{{ $route.params.letter }}</strong>
</li>
</ul>
</div>
</template>

4.配置组件缓存

①在router/index.js文件中给/backto/backtoa路由添加meta缓存属性:meta: { keepAlive: true }

{
path: '/backto/backtoa',
name: 'BackToA',
component: BackToA,
meta: { keepAlive: true }
}

②在App.vue模板文件中根据是否添加meta属性判断是否开启缓存机制:

<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>

**本篇完再见**

vue+vuex 回退定位到初始位置的更多相关文章

  1. vue+vuex初入门

    Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 解决问题: 传参的方法对于多层嵌 ...

  2. 我的音乐盒子(nodejs7 + koa2 + vue + vuex + vue-router)

    你们知道的,nodejs对jser来说,是个好东西,快快的,自从接触nodejs后,总想弄点东西. 这弄个啥了,一天打开百度音乐盒,哟,自己弄一个如何了,好啊好啊. 后台: nodejs 7 + ko ...

  3. use vue vuex vue-router, not use webpack

    vue,vuex,vue-router放在一起能做什么?不用webpack之类的打包工具使用他们是否可行?各位道友在初学vue时是否有这样的困惑.因为现代构建前端项目的一般模式是: 安装webapck ...

  4. [ABP开源项目]--vue+vuex+vue-router+EF的权限管理系统

    好久没写文字了,当然大家也不期待嘛,反正看代码就行了. 演示网站 首先说下这个项目吧. 如标题一样是基于VUE+.NET开发的框架,也是群友一直吼吼吼要一个vue版本的ABP框架. 我们先来看看首页吧 ...

  5. vue vuex vue-rouert后台项目——权限路由(超详细简单版)

    项目地址:vue-simple-template共三个角色:adan barbara carrie 密码全是:123456 adan 拥有 最高权限A 他可以看到 red , yellow 和 blu ...

  6. 基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面

    一.项目简介 基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面,实现了微信聊天.搜索.点赞.通讯录(快速导航).个人中心.模拟对话.朋友圈.设置等功能. 二. ...

  7. vue+vuex+axios+echarts画一个动态更新的中国地图

    一. 生成项目及安装插件 # 安装vue-cli npm install vue-cli -g # 初始化项目 vue init webpack china-map # 切到目录下 cd china- ...

  8. vuejs学习——vue+vuex+vue-router项目搭建(三)

    前言 vuejs学习——vue+vuex+vue-router项目搭建(一) vuejs学习——vue+vuex+vue-router项目搭建(二) 为什么用vuex:组件之间的作用域独立,而组件之间 ...

  9. vuejs学习——vue+vuex+vue-router项目搭建(二)

    前言 最近比较忙,所有第二章发布晚了,不好意思各位. vuejs学习——vue+vuex+vue-router项目搭建(一) 中我们搭建好了vue项目,我相信大家已经体验了vue其中的奥妙了,接下来我 ...

随机推荐

  1. win10系统电脑无法识别u盘的解决办法

    一些win10系统用户说插入usb设备的时候出现无法识别usb设备的问题,就此问题,接下来是对应的解决方法. win10系统电脑无法识别U盘的应对方法: 右键“计算机”,从弹出的菜单中选择“属性”项: ...

  2. Java注解之 @Target、@Retention简介

    先来看一个Spring中的一个常用注解 package org.springframework.stereotype; import java.lang.annotation.Documented; ...

  3. (转)cookie和session的区别

    存放位置不同 cookie数据存放在客户的浏览器上,session数据放在服务器上. 安全程度不同cookie不是很安全,别人可以解析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用 ...

  4. face++静态库转为动态库之二

    上一篇的时候,已经介绍了如何将carthage转为动态库.这一篇,我们是单纯的建一个动态库.还是以face++为例 查看上一篇: face++静态库转为动态库 制作动态库 1.创建一个工程MGLive ...

  5. 取模性质,快速幂,快速乘,gcd和最小公倍数

    一.取模运算 取模(取余)运算法则: 1. (a+b)%p=(a%p+b%p)%p; 2.(a-b)%p=(a%p-b%p)%p; 3.(a*b)%p=(a%p * b%p)%p; 4.(a^b)%p ...

  6. Aliyun OSS Nginx proxy module(阿里云OSS Nginx 签名代理模块)

    1.此文章主要介绍内容 本文主要介绍如何利用Nginx lua 实现将阿里云OSS存储空间做到同本地磁盘一样使用.核心是利用Nginx lua 对OSS请求进行签名并利用内部跳转将所有访问本地Ngin ...

  7. supervisor 从安装到使用

    (转)https://www.jianshu.com/p/3658c963d28b 一.安装 源码安装 先下载最新的supervisor安装包:https://pypi.python.org/pypi ...

  8. Java 多线程之Timer与ScheduledExecutorService

    1.Timer管理延时任务的缺陷 a.以前在项目中也经常使用定时器,比如每隔一段时间清理项目中的一些垃圾文件,每个一段时间进行数据清洗:然而Timer是存在一些缺陷的,因为Timer在执行定时任务时只 ...

  9. SSM(Spring4.x.x+SpringMVC4.x.x+Mybatis3.4.x)框架整合

    本文是参考SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)修改而来的 一.环境 1. Myeclipse2016 2. Mysql 二.具体步骤 1. 整合Spring和 ...

  10. HTML5培训入门基础知识了解CSS3 3D属性

    CSS3 3D 什么是3d的场景呢? 2d场景,在屏幕上水平和垂直的交叉线x轴和y轴 3d场景,在垂直于屏幕的方法,相对于3d多出个z轴 Z轴:靠近屏幕的方向是正向,远离屏幕的方向是反向 CSS3中的 ...