(Translated by https://www.hiragana.jp/)
GitHub - pdsuwwz/vue3-tab-demo: 🗂️ 一个 Vue3 的多 Tabs 标签页切换选项卡的演示模板, 🔨支持路由表自动生成多页签、页面缓存(KeepAlive)和标签页命名空间缓存管理. 基于 Vite 5 + Pinia 2 + TypeScript + Naive UI + Vue Router 4 + UnoCSS + Unplugin + ESLint(v9) + Vitest, 开箱即用的解决方案, 快速开发中后台前端,可用于学习和参考
Skip to content
/ vue3-tab-demo Public template
generated from pdsuwwz/vite-naive-template

🗂️ いち个 Vue3 てき Tabs 标签页切换选项卡てきえんじしめせばん, 🔨支持しじよしひょう生成せいせい页签、页面缓存(KeepAlive)かず标签页命名めいめいそら间缓そん管理かんり. もと于 Vite 5 + Pinia 2 + TypeScript + Naive UI + Vue Router 4 + UnoCSS + Unplugin + ESLint(v9) + Vitest, 开箱そくようてきかい决方あん, 快速かいそく开发ちゅうきさきだいぜんはし可用かよう于学习和参考さんこう

License

Notifications You must be signed in to change notification settings

pdsuwwz/vue3-tab-demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

85 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

vue3-tab-demo

GitHub Workflow Status (branch) thanks

License NaiveUI Version Vue Version Vite Version

简介

🗂️ いち个基于 Vite5 + Vue3 + Naive UI + Pinia + TS + ESLint(v9) + Unplugin + Husky てき Tab きり换选项卡えんじしめせ项目,其内抽象ちゅうしょうりょういち较贴きん实战てき项目管理かんりけいてき业务场景,虽不わたる及特别复杂的业务逻辑ただし也不しつ灵活,むねざいさら好地こうち理解りかい展示てんじ如何いか使用しよう Tab 标签页组けん,项目もと原子げんし UnoCSS かまち配置はいちぬし题,还自带一个模块化的组件开发环境,使つかい页面组件、みちよし组件、じょう管理かんり样式とう块可以根すえ Modules 录进ぎょうかい耦,它是一个开箱即用的解决方案,也适合作がっさく为快そく开发ちゅうきさきだいぜんはし可用かよう于学习和参考さんこう

🌈 Live Demo ざい线体验

🌱 わざ术栈

  • Naive UI 2.x
  • Vue 3.5.x
  • Vite 5.x + Vitest
  • Pinia 2.x
  • TypeScript 5.x
  • ESLint 9.x + Stylistic
  • Husky + lint-staged
  • Lodash
  • VueUse
  • Unplugin + UnoCSS
  • Iconify + Unplugin-Icons

🎉 Tab 核心かくしん特性とくせい

  • 支持しじ按照いち级 ID 进行划分てき缓存そら集合しゅうごうほんしめせれいてきいち级ID为 projectIdくだり改造かいぞうかずすすむ其耦あいいた组件ない
  • 支持しじ命名めいめいそら间的 Tab 集合しゅうごう
  • 支持しじ Caches 缓存, よう于 Keep Alive
  • 支持しじ缓存そら间的きり换及内部ないぶ Tab てき添加てんか/关闭
  • 支持しじ一键关闭其他标签页
  • 支持しじ层级动态よしさんすう页面てき缓存(如 /xxxx/:id1, /xxxx/:id1/xxx/:id2...)
  • 支持しじ关闭 Tab まえてき Hook 钩子, よう于手动处阻止そし关闭 Tab てき逻辑
  • 支持しじどう时打开多个 Tab
  • 支持しじ Tab 开时てい命名めいめい
  • 支持しじ Pinia 统一数据管理和本地 Session そん储 (自由じゆう改造かいぞう为 LocalStorage)

ぜんおけ条件じょうけん

  • Vue 3.5.x
  • Node >= 18.12.x
  • Pnpm 9.x
  • VS Code 插件 dbaeumer.vscode-eslint >= v3.0.5 (pre-release)

あんそう运行

  • あんそう
pnpm i
  • 本地ほんじ开发
pnpm dev

项目しめせれい

image image image image image

🧪 使用しようしめせれい

  • 开单个 Tab
const router = useTabRouter()
router.push({
  name: 'Xxxxxx',
  params: {
    datasetId: row.xxxId
  }
}, `てい名称めいしょう-${row.xxxId}`)
  • どう时打开多个 Tab
const router = useTabRouter()
router.pushMultiple(
  // みちよしいち级动态ID
  'xxxxprojectId',
  [
    {
      to: {
        name: 'Xxxx1',
        params: {
          datasetId: row.id
        },
        query: {
          query1: '123456'
        }
      },
      tabName: 'てい名称めいしょう1'
    },
    {
      to: {
        name: 'Xxxx2',
      },
      tabName: 'てい名称めいしょう2'
    },
  ]
)

ある直接ちょくせつ使用しようぜんみちみち

// みちよしいち级动态ID
const prefixKey = route.params.projectId // 'xxxxprojectId'
router.pushMultiple(
  prefixKey,
  [
    `/group-project/${prefixKey}/dashboard/monitor`,
    `/group-project/${prefixKey}/work-platform`,
    `/group-project/${prefixKey}/work-platform/nested-level/level-1-2`,
  ]
)

🛠️ 缓存そら间设计

よし于每个 WorkTab 代表だいひょう一个路由页面,所以ゆえんざい设计初期しょき就已经将以下いか核心かくしん概念がいねん引入いたみちよしちゅう,以方便びんさらこのみてき理解りかい组件てき设计理念りねん:

みちよし Layout ぬのきょく配置はいち

Tab 组件本身ほんみやめ经解耦了 TabContent 区域くいき TabsController 区域くいき所以ゆえんただ需要じゅようはた两者简单结合ふうそうそく完成かんせい由布ゆうきょくてき配置はいち

ほんしめせれい项目主要しゅよういたわたる及两个 Tab 由布ゆうきょく, かん兴趣てき直接ちょくせつげん码: みち由布ゆうきょく组件1, みち由布ゆうきょく组件2

为确 Tab ゆかりかいゆう较强てき耦合关系,缓存そら间 Key 则以插拔てき形式けいしき绑定いたみちよし元信もとのぶいき meta なかかたち如以よし配置はいちだい码:

// src/router/frontend/test-routes.ts
export const testRoutesExample = {
  path: 'example-component',
  name: 'ExampleComponentRoot',
  component: LayoutWork, // 配置はいち Tab 由布ゆうきょく
  redirect: {
    name: 'ExampleComponentBasic'
  },
  children: [
    {
      path: 'basic',
      name: 'ExampleComponentBasic',
      meta: {
        title: '组件しめせれい-もと础组けん',
        cacheSpaceKey: CacheSpaceKeys.exampleComponent // 配置はいち缓存そら间 Key
      },
      component: () => import('@/modules/ExampleComponent/pages/basic.vue')
    },
    {
      path: 'form',
      name: 'ExampleComponentForm',
      meta: {
        title: '组件しめせれい-おもて单',
        cacheSpaceKey: CacheSpaceKeys.exampleComponent // 配置はいち缓存そら间 Key
      },
      component: () => import('@/modules/ExampleComponent/pages/form.vue')
    },
    // ...
  ]
}

这样也就のう确保具有ぐゆうしょうどう缓存そら间 Key てきゆかり(WorkTab)のう够被归集いたどう一个缓存空间 CacheSpace うち


缓存そら间与 Tab てき缓存

为尽可能かのう地保じほ使用しようしゃ无感知的ちてき使用しようたい验并避免じゅう复编码,这里どおり过监听 Vue Router ちゅう route.fullPath てき变化らい实现动触发 Tab 缓存てき添加てんかきり换等逻辑。具体ぐたいてき实现细节以看みなもと

为了满足どう时打开一个或多个自定义命名 Tab てき需求,并克服こくふく Vue Router 自身じしんてききりせい,项目ちゅうふうそうりょう useTabRouter Hook 方法ほうほうよう于替だい原生げんせいてき useRouter なかてき push replace 方法ほうほう(也可以根すえ需要じゅよう进行扩展) ざい useTabRouter 内部ないぶさいようりょう单例しきらい处理ごと个Tabてきてい命名めいめいかん兴趣てき以深きわむ对应みなもと

其核こころ就是利用りよう Vue Router てき API かい决缓そんそら间的创建时机、缓存そら间于 Tab てき关联以及 Tab てきてい命名めいめいとう问题。

以下いか Tab 缓存そら间的核心かくしん结构设计:

  • 单个缓存そら
export interface CacheSpace {
  cacheSpaceKey: string
  tabs: Array<WorkTab>
  activeTabKey: string | null
}
  • 缓存そら集合しゅうごう
Map<cacheSpaceKey, CacheSpace>
  • 单个 Tab 页签すうすえ
export interface WorkTab {
  //  meta.title てき tab 标题名称めいしょう
  label: string
  // てい义 tab 标题名称めいしょう
  customLabel: string
  tabKey: string
  link: string
  routeName: RouteRecordName
}


💡 注意ちゅういごと

  • Vue 组件名称めいしょう需要じゅようあずか对应よし名称めいしょう保持ほじ一致いっちいや则 Keep Alive しょうかい失效しっこう
  • よし于 Tab 组件自身じしんかい耦了所有しょゆうてき业务逻辑,所以ゆえんわたる及到よしいち级动态 ID 这种跟业务路よしきょう耦合てき地方ちほう需要じゅようさいくだり传入,いやあさ烦的直接ちょくせつおさむあらためげん码中てき所有しょゆう dynamicCacheSpacePrefixKey だんあるしょうしょう关 hook ふうそういち具体ぐたい参考さんこう这两个位置いちみなもと码1 みなもと码2
  • わか Husky 未生みしょうこう可能かのうよし于未完成かんせいはつはじめ,执行 pnpm run prepare 进行はつはじめさい尝试
  • 推荐使用しようほん项目进行二次开发和定制实际的业务项目

说明

  • 如果此开げん对您ゆう帮助,您可以点みぎ上角うえすみ "Star" 支持しじいち 谢谢! ^_^ 🌹

  • あるもの您可以 "follow" いち, わがかい不断ふだん开源さらゆうおもむき实用てき项目

  • 开发环境 MacOS Ventura, VSCode

  • 如有问题请直接ちょくせつざい Issues ちゅうひっさげ, あるもの您发现问题并ゆう非常ひじょうこのみてきかい决方あん, 欢迎 PR 👍

  • 推荐いち个 Vite5 + Vue3 + TS + Element Plus 开源にゅう门项, 对 Element Plus UI 库感兴趣てき朋友ほうゆう以去ざい这里

  • 另外いち个 Vite5 + Vue3 + Naive UI + TS てきいれ门项, とうぜん项目简洁很多, 非常ひじょう适合にゅう门练习和开发。ざい这里

License

MIT License | Copyright © 2023-PRESENT Wisdom

About

🗂️ いち个 Vue3 てき Tabs 标签页切换选项卡てきえんじしめせばん, 🔨支持しじよしひょう生成せいせい页签、页面缓存(KeepAlive)かず标签页命名めいめいそら间缓そん管理かんり. もと于 Vite 5 + Pinia 2 + TypeScript + Naive UI + Vue Router 4 + UnoCSS + Unplugin + ESLint(v9) + Vitest, 开箱そくようてきかい决方あん, 快速かいそく开发ちゅうきさきだいぜんはし可用かよう于学习和参考さんこう

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks