在开发vue的项目中有遇到了这样一个需求:一个视频列表页面,展示视频名称和是否收藏,点击进去某一项观看,可以收藏或者取消收藏,返回的时候需要记住列表页面的页码等状态,同时这条视频的收藏状态也需要更新,但是从其他页面进来视频列表页面的时候不缓存这个页面,也就是进入的时候是视频列表页面的第一页
一句话总结一下:pageAList→pageADetail→pageAList,缓存pageAList,同时该视频的收藏状态如果发生变化需要更新,其他页面→pageAList, pageAList不缓存
在网上找了很多别人的方法,都不满足我们的需求
然后我们团队几个人捣鼓了几天,还真的整出了一套方法,实现了这个需求
无图无真相,用一张gif图来看一下实现后的效果吧! ! !
操作流程:
-
<李>首页→pageAList,跳转第二页→首页→pageAList,页码显示第一页,说明从其他页面进入pageAList, pageAList页面没有被缓存李>
<李> pageAList,跳转到第三页,点击视频22→进入视频详情页pageADetail,点击收藏,收藏成功,点击返回→pageAList显示的是第三页,并且视频22的收藏状态从未收藏变成已收藏,说明从pageADetail进入pageAList, pageAList页面缓存了,并且更新了状态李>
说明:
-
<李>二级缓存:也就是从一个→B→,缓存一个李>
<李>三级缓存:→B→C→B→,缓存,B 因为项目里面绝大部分是二级缓存,这里我们就做二级缓存,但是这不代表我的这个缓存方法不适用三级缓存,三级缓存后面我也会讲如何实现李>
用vue-cli2的脚手架搭建了一个项目,用这个项目来说明如何实现
先来看看项目目录
删除了无用的组件目录和资产目录,新增了src/页目录和src/存储目录,页页面用来存放页面组件,商店不多说,存放vuex相关的东西,新增了服务器/应用程序。js目录,用来启动后台服务
<强> 1。前提条件强>
-
<李>项目引入vue, vuex, vue-router, axios等vue全家桶李>
<李>引入element-ui,只是为了项目美观,毕竟本人懒癌晚期,不想自己写样式李>
<李>在配置/index.js里面配置前端代理李>
-
<李>引入表达,启动后台,后端开3003端口,给前端提供api支持,来看看服务端代码服务器/app.js,非常简单,就是造了30条数据,写了3个接口,几十行文件直接搭建了一个节点服务器,简单粗暴解决数据模拟问题,会模拟用模拟也行李>
const表达=要求(表达)//const bodyParser=要求(体) const应用=表示() 让allList=Array.from({长度:30},(v, i)=比;({ id:我, 名称:“视频' +我, isCollect:假 }))//后台设置允许跨域访问//前后端都是本地localhost,所以不需要设置歌珥跨域,如果是部署在服务器上,则需要设置//app.all(‘*’,函数(下)要求,res, {//res.header (‘Access-Control-Allow-Origin’,‘*’)//res.header (“Access-Control-Allow-Headers”、“X-Requested-With”)//res.header (“Access-Control-Allow-Methods”、“PUT、POST、GET、删除选项”)//res.header (“X-Powered-By”、“3.2.1”)//res.header(“内容类型”、“application/json; charset=utf - 8”)//next ()//}) app.use (express.json ()) app.use(表达。urlencoded({扩展:假}))//1获取所有的视频列表 app.get (/api/getVideoList,函数(点播,res) { 让查询=req.query 让currentPage=query.currentPage 让页大?query.pageSize 让=allList列表。片((当前页- 1)*页大小,当前页*页大小) res.json ({ 代码:0, 数据:{ 列表, 总:allList.length } }) })//2获取某一条视频详情 app.get (/api/getVideoDetail: id,函数(点播,res) { 让id=号(req.params.id) 让信息=allList。找到(v=比;v。id===id) res.json ({ 代码:0, 数据:信息 }) })//3收藏或者取消收藏视频 app.post (/api/collectVideo,函数(点播,res) { 让id=号(req.body.id) 让isCollect=req.body.isCollect allList=allList。地图((v, i)=比;{ 返回v。id===id & # 63;{…v, v isCollect}: }) res.json({代码:0}) }) const端口=3003 app.listen(港口,函数(){ 控制台。日志(“应用程序监听端口”+端口) })vue项目中实现缓存的最佳方案详解