Vue 中的组件缓存

一、介绍

先来看一个问题?
在这里插入图片描述

从首页的区块链模块切换到文章详情页面,再从文章详情页面回到首页,我们发现首页重新渲染原来的状态没有了,又回到了推荐模块。

首先,这是正常的状态,并非问题,路由在切换的时候会销毁切出去的页面组件,然后渲染匹配到的页面组件。

但是我想要某些页面保持状态,而不会随着路由切换导致重新渲染。

二、解决方案

使用 keep-alive 缓存组件

官方文档:在动态组件上使用 keep-alive

主要用于保留组件状态或避免重新渲染,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。

(1)组件缓存不是持久化,它只是在应用运行期间不会重新渲染,如果页面刷新还是会回到初始状态。

(2) 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在组件的父组件链中。

(3) 要求被切换到的组件都有自己的名字,不论是通过组件的 name 选项还是局部/全局注册。

(4)组件生命周期钩子和缓存
在这里插入图片描述
(5)include 和 exclude 属性允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示。

<!-- 逗号分隔字符串 -->
<keep-alive include="a,b"><component :is="view"></component>
</keep-alive><!-- 正则表达式 (使用 `v-bind`) -->
<keep-alive :include="/a|b/"><component :is="view"></component>
</keep-alive><!-- 数组 (使用 `v-bind`) -->
<keep-alive :include="['a', 'b']"><component :is="view"></component>
</keep-alive>

匹配首先检查组件自身的 name 选项,如果 name 选项不可用,则匹配它的局部注册名称 (父组件 components 选项的键值)。匿名组件不能被匹配。

三、项目中的缓存配置

参考链接:

https://juejin.im/post/5d22f0f3f265da1b94216d0b

问题描述:

在这里插入图片描述
我们希望

  1. 登录成功后,就把缓存给清除掉,让组件重新进行渲染。

  2. 等页面渲染完成后,再给页面加上缓存(keep-alive)

实现思路:给keep-alive 的include属性绑定一个动态的数组,因为keep-alive只会缓存include数组中的组件

首页在Vuex容器中定义这个动态数组cachePages:
在这里插入图片描述
然后,在用户登录成功之后,清除layout组件的缓存:
在这里插入图片描述
在这里插入图片描述
这样就解决了上面提到的,用户1登录后退出登录,使用用户2的账号登录时,”我的“页面的个人信息展示的还是用户1的个人信息的问题。
在这里插入图片描述
但是此时,layout组件没有缓存,当登录的用户从区块链频道点击 某篇文章 -> 进入文章详情页面后,再返回到首页时,首页会重新进行渲染,无法回到之前用户所在的区块链频道,而是直接变成首页渲染成功后默认显示的推荐频道。

为了解决这个问题:我们可以在layout组件的渲染完成之后,给它加上缓存。
在这里插入图片描述

解决缓存带来的列表滚动位置问题:

就是列表滚动的位置没有缓存下来,也就是用户在首页的 区块链模块的文章列表滚动了一段距离后,进去文章详情页面,再返回到首页时,页面确实还在区块链模块,但是列表滚动的位置又回到了列表顶部。

在这里插入图片描述

在这里插入图片描述
layout切换到文章详情页面,触发activated生命钩子:
在这里插入图片描述
文章详情页面切换到layout,触发deactivated生命钩子:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLlite 分页

如果我要去11-20的Account表的数据 Select * From Account Limit 9 Offset 10; 以上语句表示从Account表获取数据&#xff0c;跳过10行&#xff0c;取9行 嗯&#xff0c;我觉得这个特性足够让很多的web中型网站使用这个了。 也可以这样写 select * from account limit10,9和上面…

thief book怎么用_战略管理工具箱--30个好用的战略管理好工具

-原创转载请告知-十年多年前&#xff0c;在上海做咨询的时候&#xff0c;曾经在书店买了一本《战略管理工具箱》的Poket小书&#xff0c;一直看一直看&#xff0c;里面包含常用的战略管理工具&#xff08;30个&#xff09;&#xff0c;虽然不用都用上&#xff0c;用其中几个常用…

Vue中使用axios的响应拦截器处理请求失败的情况(处理token过期问题)以及 登录成功跳转回原来页面问题

参考axios官方文档 // 响应拦截器 // Add a response interceptor request.interceptors.response.use(// 在2xx范围内的任何状态代码都会触发此函数&#xff0c;这里主要用于处理响应数据response > {return response},// 任何超出2xx范围的状态码都会触发此函数&#xff0…

cocoapods 命令

1.使用CocoaPods a 新建一个项目&#xff0c;名字cocoapods b 终端中&#xff0c;cd到项目总目录&#xff08;直接拖过来&#xff09; [objc] copy? cd /Users/pengjian/Desktop/cocoapodsc 建立Podfile&#xff08;配置文件&#xff09; 接着上一步&#xff0c;终端输入 v…

Vue项目中使用 路由导航守卫 处理页面的访问权限

参考Vue-Router官方文档 Vue-Router导航守卫 效果展示 1、给需要登录状态才能访问的页面路由对象的 meta 中添加配置属性 { // 小智同学name: user-chat,path: /user/chat,component: () > import(/views/user-chat),meta: { requiresAuth: true } },2、通过路由拦截器…

失败,因为你其实太过傲慢

因为你太过傲慢&#xff0c;不肯放低姿态去向他人学习&#xff0c;勤加练习&#xff0c;所以失败。转载于:https://www.cnblogs.com/panie2015/p/5667464.html

Uniapp学习笔记(数据展示、数据循环、条件编译、计算属性、组件的使用、组件插槽、生命周期)

1.项目准备 1.1开发方式 uni-app为我们提供2种开发方式&#xff1a; 使用DCloud公司提供HBuilderX工具来快速开发&#xff1b; 使用脚手架来快速开发&#xff08;我们这次项目使用此方式&#xff09;&#xff1b; 1.2脚手架搭建项目 全局安装&#xff0c;如果你以前安装过…

word图片嵌入式为何只能看到一部分_Word排版的正确姿势!(Word论文排版教学)...

Hello&#xff0c;最近正值着手写毕业论文的初期&#xff0c;趁着这个时间点&#xff0c;我做了一个简易的&#xff0c;简单的&#xff0c;0基础的Word论文排版教学&#xff0c;帮助你在撰写论文的时候不再花费大量的时间浪费在调整格式里。初次做视频&#xff0c;难免有错误&a…

云计算三种服务模式SaaS、PaaS和IaaS及其之间关系(顺带CaaS、MaaS)

云计算架构图 很明显&#xff0c;这五者之间主要的区别在于第一个单词&#xff0c;而aaS都是as-a-service&#xff08;即服务&#xff09;的意思&#xff0c;这五个模式都是近年来兴起的&#xff0c;且这五者都是云计算的落地产品&#xff0c;所以我们先来了解一下云计算是什么…

uni-ui介绍uni-api

一、uni-ui介绍 安装 二、uni-api 解决uni-app中的跨域问题&#xff1a; "h5" : {"router" : {"mode" : "hash"},"devServer": {"https": false,"proxy": {"/web": {"target": …

一、uniapp项目(封装异步请求、moment.js时间处理、封装手势滑动组件、下载图片到本地)

一、封装异步请求&#xff1a; 1. 为什么要封装&#xff1f; 2. 封装的思路 export default (params) > {// 显示加载中uni.showLoading({title: "加载中"})return new Promise((resolve, reject) > {wx.request({...params,success(res) {resolve(res)},fail…

.net中如何发送HTTP请求网络资源

应用场景 应该说只要是需要通过发送Http请求获取网络资源的地方都要使用它&#xff0c;网络资源可以是指以URI来表示的资源&#xff0c;比如web api接口等。 HttpWebRequest .net2.0 ~ .net4.0使用HttpWebRequest 代码如下&#xff1a; 1 //.net2.0 ~ .net4.0使用HttpWebReque…

二、uniapp项目(分段器的使用、scroll-view、视频下载、转发)

一、分段器组件的使用 uniapp官方文档 <template><view class"category"><view class"category_tab"> <view class"category_tab_title"><view class"title_inner"><uni-segmented-control :curr…

problem b: 一年中的第几天_第九届蓝桥杯B组试题

1.标题&#xff1a;第几天2000年的1月1日&#xff0c;是那一年的第1天。那么&#xff0c;2000年的5月4日&#xff0c;是那一年的第几天&#xff1f;注意&#xff1a;需要提交的是一个整数&#xff0c;不要填写任何多余内容。“手动分割”大小月判断&#xff1a;https://jingyan…

一、express 路由 todos案例

一、express路由 动态路由参数 params 路径参数 query 二、 todos案例 2.1 准备工作 新建一个文件夹01-demo执行npm init -y 生成package.json配置文件执行npm install express --save 安装express新建app.js文件&#xff0c;这是程序的入口文件新建db.json文件&#xff0…

二、express中间件

一、中间件引入 实现加入日志模块功能&#xff1a; 1. 我们能想到的方案&#xff1a; 将日志输出代码封装到函数中&#xff0c;然后需要日志输出的地方调用这个函数即可。 app.js文件&#xff1a; const express require(express)const app express()const myLogger (r…

三、Express 路由

一、路由 路由是指应用程序的端点(URI)如何响应客户端请求. 你可以使用app与HTTP方法相对应的Express对象的方法来定义路由. 例如,app.get()处理GET请求和app.post POST 请求。 你还可以使用app.all()处理所有HTTP方法,并使用app.use()将中间件指定为回调函数. 这些路由方法…

RESTful 接口设计规范

一、RESTful 接口设计规范 1. 协议 API与用户的通信协议&#xff0c;尽量使用HTTPs协议。 2. 域名 应该尽量将API部署在专用域名之下。 https://api.example.com 如果确定API很简单&#xff0c;不会有进一步扩展&#xff0c;可以考虑放在主域名下。 https://example.org/ap…

是引进外部函数吗_使用PowerBI的这两个函数,灵活计算各种占比

计算个体占总体的比例是一个很常见的分析方式&#xff0c;它很简单&#xff0c;就是两个数字相除&#xff0c;但是当需要计算的维度、总体的范围发生动态变化时&#xff0c;如何灵活且快速的计算出各种占比&#xff0c;还是需要动一点心思的。本文就通过 DAX 中的 ALL 和 ALLSE…

WCF入门(五)---创建WCF服务

使用Microsoft Visual Studio2012创建WCF服务&#xff0c;理解如下所有必要的编码&#xff0c;更好地创建WCF服务的概念&#xff0c;这里做一个简单的任务。 启动Visual Studio 2012。 单击新建项目&#xff0c;然后在Visual C&#xff03;标签&#xff0c;选择WCF选项。 WCF服…