需求

在开发vue的项目中有遇到了这样一个需求:一个视频列表页面,展示视频名称和是否收藏,点击进去某一项观看,可以收藏或者取消收藏,返回的时候需要记住列表页面的页码等状态,同时这条视频的收藏状态也需要更新, 但是从其他页面进来视频列表页面的时候不缓存这个页面,也就是进入的时候是视频列表页面的第一页
一句话总结一下: pageAList->pageADetail->pageAList, 缓存pageAList, 同时该视频的收藏状态如果发生变化需要更新, 其他页面->pageAList, pageAList不缓存
在网上找了很多别人的方法,都不满足我们的需求
然后我们团队几个人捣鼓了几天,还真的整出了一套方法,实现了这个需求
实现后的效果
无图无真相,用一张gif图来看一下实现后的效果吧!!!
操作流程:
说明:
实现二级缓存
用vue-cli2的脚手架搭建了一个项目,用这个项目来说明如何实现
先来看看项目目录
删除了无用的components目录和assets目录,新增了src/pages目录和src/store目录, pages页面用来存放页面组件, store不多说,存放vuex相关的东西,新增了server/app.js目录,用来启动后台服务
1. 前提条件
const express = require('express')
// const bodyParser = require('body-parser')
const app = express()
let allList = Array.from({length: 30}, (v, i) => ({
id: i,
name: '视频' + i,
isCollect: false
}))
// 后台设置允许跨域访问
// 前后端都是本地localhost,所以不需要设置cors跨域,如果是部署在服务器上,则需要设置
// app.all('*', function (req, res, next) {
// res.header('Access-Control-Allow-Origin', '*')
// res.header('Access-Control-Allow-Headers', 'X-Requested-With')
// res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS')
// res.header('X-Powered-By', ' 3.2.1')
// res.header('Content-Type', 'application/json;charset=utf-8')
// next()
// })
app.use(express.json())
app.use(express.urlencoded({extended: false}))
// 1 获取所有的视频列表
app.get('/api/getVideoList', function (req, res) {
let query = req.query
let currentPage = query.currentPage
let pageSize = query.pageSize
let list = allList.slice((currentPage - 1) * pageSize, currentPage * pageSize)
res.json({
code: 0,
data: {
list,
total: allList.length
}
})
})
// 2 获取某一条视频详情
app.get('/api/getVideoDetail/:id', function (req, res) {
let id = Number(req.params.id)
let info = allList.find(v => v.id === id)
res.json({
code: 0,
data: info
})
})
// 3 收藏或者取消收藏视频
app.post('/api/collectVideo', function (req, res) {
let id = Number(req.body.id)
let isCollect = req.body.isCollect
allList = allList.map((v, i) => {
return v.id === id ? {...v, isCollect} : v
})
res.json({code: 0})
})
const PORT = 3003
app.listen(PORT, function () {
console.log('app is listening port' + PORT)
})