keep-alive缓存文章列表案例完整代码(Vue3)

keep-alive缓存文章列表案例完整代码(Vue3)

环境准备

创建一个项目

bash 复制代码
vue create 项目名

也可以用 vite

bash 复制代码
npm create vite@latest 项目名 --template vue

安装 vue router

bash 复制代码
npm install vue-router@4

目录结构

完整代码

main.js

js 复制代码
import { createApp } from "vue";
import App from "./App.vue";
import router from "./router";

createApp(App).use(router).mount("#app");

App.vue

这里和vue2一样也有两种写法,可以看 keep-alive缓存文章列表案例完整代码(Vue2)

这边就用第二种。

js 复制代码
<template>
  <RouterView v-slot="{ Component }">
    <KeepAlive>
      <component :is="Component" v-if="route.meta.keepAlive" />
    </KeepAlive>
    <component :is="Component" v-if="!route.meta.keepAlive" />
  </RouterView>
</template>
<script setup>
import { useRoute } from "vue-router";
const route = useRoute();
</script>

ArticleList.vue

js 复制代码
<script setup>
import {
  onMounted,
  onActivated,
  onDeactivated,
  ref,
  nextTick,
  onUnmounted,
} from "vue";

const articles = ref([]);
const scrollTop = ref(0);

function fakeFetch() {
  return Array.from({ length: 100 }, (_, i) => ({
    id: i + 1,
    title: "文章标题 " + (i + 1),
  }));
}

function handleScroll() {
  scrollTop.value = window.scrollY || document.documentElement.scrollTop;
  // console.log("滚动位置:", scrollTop.value);
}

onMounted(() => {
  // console.log("mounted:" + scrollTop.value);
  articles.value = fakeFetch();
  window.addEventListener("scroll", handleScroll);
});

//onUnmounted(() => {
//  console.log("unmounted"); // 有就说明没缓存成功
//});

onActivated(() => {
	nextTick(() => {
		// console.log("activated:", scrollTop.value);
		window.scrollTo(0, scrollTop.value);
	  });
	window.addEventListener("scroll", handleScroll);
});

onDeactivated(() => {
  // console.log("deactivated:", scrollTop.value);
  window.removeEventListener("scroll", handleScroll);
});
</script>

<template>
  <div>
    <div v-for="item in articles" :key="item.id" class="item">
      <router-link :to="{ name: 'ArticleDetail', query: { id: item.id } }">
        {{ item.title }}
      </router-link>
    </div>
  </div>
</template>

<style>
.item {
  padding: 16px;
  border-bottom: 1px solid #eee;
}
</style>

ArticleDetail.vue

js 复制代码
<script setup>
import { onMounted } from "vue";
import { useRoute } from "vue-router";

// 获取路由信息
const route = useRoute();

onMounted(() => {
  // 模拟请求内容
  // console.log("详情页 mounted,ID:", route.query.id);
});
</script>

<template>
  <div>
    <h2>文章详情 {{ route.query.id }}</h2>
    <p>内容详情...</p>
    <router-link to="/list">返回列表</router-link>
  </div>
</template>

router.js

js 复制代码
import { createRouter, createWebHistory } from "vue-router";
import ArticleList from "@/components/ArticleList.vue";
import ArticleDetail from "@/components/ArticleDetail.vue";

const routes = [
  {
    path: "/list",
    name: "ArticleList",
    component: ArticleList,
    meta: { keepAlive: true },
  },
  {
    path: "/detail",
    name: "ArticleDetail",
    component: ArticleDetail,
    meta: { keepAlive: false },
  },
];

const router = createRouter({
  history: createWebHistory(),
  routes,
});

export default router;

vue2 版本

keep-alive缓存文章列表案例完整代码(Vue2)

相关推荐
遂心_13 小时前
JavaScript 函数参数传递机制:一道经典面试题解析
前端·javascript
Gracemark13 小时前
高德地图-地图选择经纬度问题【使用输入提示-使用Autocomplete进行联想输入】(复盘)
vue.js
遂心_14 小时前
深入理解 React Hook:useEffect 完全指南
前端·javascript·react.js
前端Hardy14 小时前
HTML&CSS: 谁懂啊!用代码 “擦去”图片雾气
前端·javascript·css
前端Hardy14 小时前
HTML&CSS:好精致的导航栏
前端·javascript·css
天下无贼14 小时前
【手写组件】 Vue3 + Uniapp 手写一个高颜值日历组件(含跨月补全+今日高亮+选中状态)
前端·vue.js
一个不爱写代码的瘦子15 小时前
迭代器和生成器
前端·javascript
洋葱头_15 小时前
vue3项目不支持低版本的android,如何做兼容
前端·vue.js
奔跑的蜗牛ing16 小时前
Vue3 + Element Plus 输入框省略号插件:零侵入式全局解决方案
vue.js·typescript·前端工程化
源猿人18 小时前
企业级文件浏览系统的Vue实现:架构设计与最佳实践
前端·javascript·数据可视化