vue可以通过<keep-alive>元素包裹组件,实现缓存,下次使用时不需要重新创建该组件。但存在一个问题:keep-alive包裹的组件中有滚动元素时,keep-alive不会储存滚动位置。实现后退不刷新主要依据keep-alive组件的activated和deactivated这两个生命周期钩子函数。
vue钩子函数的执行顺序:
不使用keep-alive
beforeRouteEnter --> created --> mounted --> destroyed
使用keep-alive
初次进入页面,beforeRouteEnter --> created --> mounted --> activated --> deactivated
再次进入缓存的页面,只会触发beforeRouteEnter -->activated --> deactivated。created和mounted不会再执行。
其中,activated在keep-alive组件激活时调用.deactivated在keep-alive组件被停用时调用.
Demo实现了后退不刷新,并且返回时滚动到上次浏览的深度。
该demo中,包含三个链接导航。
home --> pageA --> pageB --> pageC
依次前进,每次前进到一个新页面都需要获取数据,而按下后退键后,
从pageC返回到pageB,pageB不再获取新数据,而是使用之前缓存的数据。
从pageB返回到pageA时,pageA不再获取新数据,而是使用之前的数据。并且当pageA存在滚动条时,返回时会滚动到上次浏览高度。
所以,pageA和pageB需要缓存,pageC不需要缓存。
//router.js
import Vue from 'vue';
import Router from 'vue-router';
Vue.use(Router);
const router = new Router({
mode: 'hash',
routes: [
{
path: '/',
name: 'home',
component: () =>
import('./views/Home.vue'),
meta: {
title: '首页',
keepAlive: false //此组件不需要被缓存
}
},
{
path: '/pageA',
name: 'pageA',
component: () =>
import('./views/pageA.vue'),
meta: {
title: 'pageA',
keepAlive: true,
isBack: false
}
},
{
path: '/pageB',
name: 'pageB',
component: () =>
import('./views/pageB.vue'),
meta: {
title: 'pageB',
keepAlive: true,
isBack: false
}
},
{
path: '/pageC',
name: 'pageC',
component: () =>
import('./views/pageC.vue'),
meta: {
title: 'pageC',
keepAlive: false
}
}
]
});
export default router;
//pageA.vue
<template>
<div class="page-a">
<h1>pageA</h1>
<div>
<div class="item" v-for="item in items" @click="goPageB">
{{ item }}
</div>
</div>
<h1 @click="goPageB">go pageB</h1>
</div>
</template>
<script>
export default {
name: 'PageA',
data() {
return {
msg: "我是PageA页面",
items: Array.from({length:50}, (v,k) => k),
data: "",
scrollTop: 0
};
},
beforeRouteEnter(to, from, next) {
if(from.name == 'pageB'){
to.meta.isBack = true;
}
next();
},
mounted() {
console.log('mounted....');
// this指向组件的实例,$el指向当前组件的dom元素
const $el = this.$el;
//滚动事件
$el.addEventListener("scroll", () => {
//记录位置
this.scrollTop = $el.scrollTop;
});
},
activated() {
if(!this.$route.meta.isBack){
// 如果isBack是false,表明需要获取新数据,否则就不再请求,直接使用缓存的数据
this.getData();
} else {
//恢复滚动条高度
if(this.scrollTop) {
setTimeout(() => {
this.$el.scrollTop = this.scrollTop;
}, 100);
}
}
// 恢复成默认的false,避免isBack一直是true
this.$route.meta.isBack = false;
},
methods: {
getData() {
// getData方法,模拟从后台请求数据
this.data = "数据";
console.log('get data')
},
goPageB(){
this.$router.push({ path: "/pageB" });
},
back() {
this.$router.push({ path: "/" });
}
},
}
</script>
<style>
.page-a {
height: 100vh;
overflow-y: auto;
}
.item {
margin: 5px;
padding: 10px;
background: #ccc;
}
</style>
代码请参考链接;
后退不刷新还可以通过include实现,可参考链接
原文:https://segmentfault.com/a/1190000022038272
vue页面跳转到新页面之后,再由新页面返回到原页面时候若想返回调出原页面的初始位置,怎么来解决这个问题呢?1、使用vuex存储滚动状态,2、使用缓存keepAlive的实现
实现下拉刷新主要分为三步:监听原生touchstart事件,记录其初始位置的值,e.touches[0].pageY;监听原生touchmove事件,记录并计算当前滑动的位置值与初始位置值的差值,大于某个临界值时,显示下拉刷新头
使用2.2.0 新增的provide / inject控制<router-view>的显示隐藏,在App.vue中使用provide,在使用局部刷新的组件中使用inject
浏览器F5刷新的时候有一个刷新执行之前的事件,beforeunload 事件,这个事件可以提示用户在刷新页面之前有一个提示。下面是beforeunload的用法:
把一个组件重置到初始状态是一个常见的需求,推荐的做法有两种:一种是父组件重置子组件的 prop,另一种是子组件暴露一个重置的方法供父组件调用。
在实际的vue项目中,当我们的应用遇到多个组件之间的共享问题时,通常会用到Vuex(一个状态管理的插件,可以解决不同组件之间的数据共享和数据持久化),解决组件之间同一状态的共享问题。
在一个列表页中,第一次进入的时候,请求获取数据。点击某个列表项,跳到详情页,再从详情页后退回到列表页时,不刷新。
最近在用 element-ui 开发一个网站,使用 table 组件时,发现修改完数据,有时候会延迟一两秒,页面才会发生变化。看了一下代码,发现修改数据的代码是这样的
缺点:同 this.$router.go(0) 一样,会白屏。通过 $nextTick(),协助实现。先把 <router-view /> 移除,移除后再重新添加,达到刷新当前页面的功能。是目前最合适的实现方式。
想必大家在刨坑vue的时候也遇到过下面情形:比如在删除或者增加一条记录的时候希望当前页面可以重新刷新或者如下面这种:如果希望点击确定的时候
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!