refactor: hook 关键字替换为 composable

This commit is contained in:
pany 2024-11-21 20:41:48 +08:00
parent f9b1f080b5
commit 7a29374c2e
44 changed files with 60 additions and 60 deletions

View File

@ -1,16 +1,16 @@
{ {
"Vue3 Hook 代码结构一键生成": { "Vue3 Composable 代码结构一键生成": {
"prefix": "Vue3 Hook", "prefix": "Vue3 Composable",
"body": [ "body": [
"import { ref } from \"vue\"\n", "import { ref } from \"vue\"\n",
"const refName1 = ref<string>(\"这是一个响应式变量\")\n", "const refName1 = ref<string>(\"这是一个响应式变量\")\n",
"export function useHookName() {", "export function useName() {",
"\tconst refName2 = ref<string>(\"这是一个响应式变量\")\n", "\tconst refName2 = ref<string>(\"这是一个响应式变量\")\n",
"\tconst fnName = () => {}\n", "\tconst fnName = () => {}\n",
"\treturn { refName1, refName2, fnName }", "\treturn { refName1, refName2, fnName }",
"}", "}",
"$1" "$1"
], ],
"description": "Vue3 Hook" "description": "Vue3 Composable"
} }
} }

View File

@ -57,7 +57,7 @@ China repository: [Gitee](https://gitee.com/un-pany/v3-admin-vite)
- **Multiple layouts**Left, Top, Left Top, three layout modes - **Multiple layouts**Left, Top, Left Top, three layout modes
- **Error page**: 403, 404 - **Error page**: 403, 404
- **Dashboard**: Display different Dashboard pages according to different users - **Dashboard**: Display different Dashboard pages according to different users
- **Other functions**SVG, Dynamic Sidebar, Dynamic Breadcrumb Navigation, Tabbed Navigation, Screenfull, Adaptive Shrink Sidebar, Hook (Composables) - **Other functions**SVG, Dynamic Sidebar, Dynamic Breadcrumb Navigation, Tabbed Navigation, Screenfull, Adaptive Shrink Sidebar, Composable
## 🚀 Development ## 🚀 Development

View File

@ -57,7 +57,7 @@ V3 Admin Vite 是一个免费开源的中后台管理系统基础解决方案,
- **多布局**:左侧、顶部、混合, 三种布局模式 - **多布局**:左侧、顶部、混合, 三种布局模式
- **错误页面**: 403、404 - **错误页面**: 403、404
- **Dashboard**:根据不同用户显示不同的 Dashboard 页面 - **Dashboard**:根据不同用户显示不同的 Dashboard 页面
- **其他内置功能**SVG、动态侧边栏、动态面包屑、标签页快捷导航、Screenfull 全屏、自适应收缩侧边栏、HookComposables - **其他内置功能**SVG、动态侧边栏、动态面包屑、标签页快捷导航、Screenfull 全屏、自适应收缩侧边栏、Composable
## 🚀 开发 ## 🚀 开发

View File

@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useGreyAndColorWeakness } from "@/hooks/useGreyAndColorWeakness" import { useGreyAndColorWeakness } from "@/composables/useGreyAndColorWeakness"
import { useTheme } from "@/hooks/useTheme" import { useTheme } from "@/composables/useTheme"
import { ElNotification } from "element-plus" import { ElNotification } from "element-plus"
import zhCn from "element-plus/es/locale/lang/zh-cn" // Element Plus import zhCn from "element-plus/es/locale/lang/zh-cn" // Element Plus

View File

@ -1,5 +1,5 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useDevice } from "@/hooks/useDevice" import { useDevice } from "@/composables/useDevice"
interface Props { interface Props {
total: number total: number

View File

@ -1,7 +1,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { ElScrollbar } from "element-plus" import type { ElScrollbar } from "element-plus"
import type { RouteRecordName, RouteRecordRaw } from "vue-router" import type { RouteRecordName, RouteRecordRaw } from "vue-router"
import { useDevice } from "@/hooks/useDevice" import { useDevice } from "@/composables/useDevice"
import { usePermissionStore } from "@/store/modules/permission" import { usePermissionStore } from "@/store/modules/permission"
import { isExternal } from "@/utils/validate" import { isExternal } from "@/utils/validate"
import { ElMessage } from "element-plus" import { ElMessage } from "element-plus"

View File

@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { ThemeName } from "@/hooks/useTheme" import type { ThemeName } from "@/composables/useTheme"
import { useTheme } from "@/hooks/useTheme" import { useTheme } from "@/composables/useTheme"
import { MagicStick } from "@element-plus/icons-vue" import { MagicStick } from "@element-plus/icons-vue"
const { themeList, activeThemeName, setTheme } = useTheme() const { themeList, activeThemeName, setTheme } = useTheme()

View File

@ -14,7 +14,7 @@ function initGreyAndColorWeakness() {
}) })
} }
/** 灰色模式和色弱模式 hook */ /** 灰色模式和色弱模式 Composable */
export function useGreyAndColorWeakness() { export function useGreyAndColorWeakness() {
return { initGreyAndColorWeakness } return { initGreyAndColorWeakness }
} }

View File

@ -58,7 +58,7 @@ function initTheme() {
}) })
} }
/** 主题 hook */ /** 主题 Composable */
export function useTheme() { export function useTheme() {
return { themeList, activeThemeName, initTheme, setTheme } return { themeList, activeThemeName, initTheme, setTheme }
} }

View File

@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useDevice } from "@/hooks/useDevice" import { useDevice } from "@/composables/useDevice"
import { useLayoutMode } from "@/hooks/useLayoutMode" import { useLayoutMode } from "@/composables/useLayoutMode"
import { useAppStore } from "@/store/modules/app" import { useAppStore } from "@/store/modules/app"
import { useSettingsStore } from "@/store/modules/settings" import { useSettingsStore } from "@/store/modules/settings"
import { storeToRefs } from "pinia" import { storeToRefs } from "pinia"

View File

@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { RouteLocationMatched } from "vue-router" import type { RouteLocationMatched } from "vue-router"
import { useRouteListener } from "@/hooks/useRouteListener" import { useRouteListener } from "@/composables/useRouteListener"
import { compile } from "path-to-regexp" import { compile } from "path-to-regexp"
import { ref } from "vue" import { ref } from "vue"
import { useRoute, useRouter } from "vue-router" import { useRoute, useRouter } from "vue-router"

View File

@ -2,7 +2,7 @@
import logo from "@/assets/layouts/logo.png?url" import logo from "@/assets/layouts/logo.png?url"
import logoText1 from "@/assets/layouts/logo-text-1.png?url" import logoText1 from "@/assets/layouts/logo-text-1.png?url"
import logoText2 from "@/assets/layouts/logo-text-2.png?url" import logoText2 from "@/assets/layouts/logo-text-2.png?url"
import { useLayoutMode } from "@/hooks/useLayoutMode" import { useLayoutMode } from "@/composables/useLayoutMode"
interface Props { interface Props {
collapse?: boolean collapse?: boolean

View File

@ -3,8 +3,8 @@ import Notify from "@/components/Notify/index.vue"
import Screenfull from "@/components/Screenfull/index.vue" import Screenfull from "@/components/Screenfull/index.vue"
import SearchMenu from "@/components/SearchMenu/index.vue" import SearchMenu from "@/components/SearchMenu/index.vue"
import ThemeSwitch from "@/components/ThemeSwitch/index.vue" import ThemeSwitch from "@/components/ThemeSwitch/index.vue"
import { useDevice } from "@/hooks/useDevice" import { useDevice } from "@/composables/useDevice"
import { useLayoutMode } from "@/hooks/useLayoutMode" import { useLayoutMode } from "@/composables/useLayoutMode"
import { useAppStore } from "@/store/modules/app" import { useAppStore } from "@/store/modules/app"
import { useSettingsStore } from "@/store/modules/settings" import { useSettingsStore } from "@/store/modules/settings"
import { useUserStore } from "@/store/modules/user" import { useUserStore } from "@/store/modules/user"

View File

@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useLayoutMode } from "@/composables/useLayoutMode"
import { LayoutModeEnum } from "@/constants/app-key" import { LayoutModeEnum } from "@/constants/app-key"
import { useLayoutMode } from "@/hooks/useLayoutMode"
const { isLeft, isTop, isLeftTop, setLayoutMode } = useLayoutMode() const { isLeft, isTop, isLeftTop, setLayoutMode } = useLayoutMode()
</script> </script>

View File

@ -1,5 +1,5 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useLayoutMode } from "@/hooks/useLayoutMode" import { useLayoutMode } from "@/composables/useLayoutMode"
import { useSettingsStore } from "@/store/modules/settings" import { useSettingsStore } from "@/store/modules/settings"
import { removeConfigLayout } from "@/utils/cache/local-storage" import { removeConfigLayout } from "@/utils/cache/local-storage"
import { Refresh } from "@element-plus/icons-vue" import { Refresh } from "@element-plus/icons-vue"

View File

@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useDevice } from "@/hooks/useDevice" import { useDevice } from "@/composables/useDevice"
import { useLayoutMode } from "@/hooks/useLayoutMode" import { useLayoutMode } from "@/composables/useLayoutMode"
import { useAppStore } from "@/store/modules/app" import { useAppStore } from "@/store/modules/app"
import { usePermissionStore } from "@/store/modules/permission" import { usePermissionStore } from "@/store/modules/permission"
import { useSettingsStore } from "@/store/modules/settings" import { useSettingsStore } from "@/store/modules/settings"

View File

@ -2,7 +2,7 @@
import type { ElScrollbar } from "element-plus" import type { ElScrollbar } from "element-plus"
import type { RouterLink } from "vue-router" import type { RouterLink } from "vue-router"
import Screenfull from "@/components/Screenfull/index.vue" import Screenfull from "@/components/Screenfull/index.vue"
import { useRouteListener } from "@/hooks/useRouteListener" import { useRouteListener } from "@/composables/useRouteListener"
import { useSettingsStore } from "@/store/modules/settings" import { useSettingsStore } from "@/store/modules/settings"
import { ArrowLeft, ArrowRight } from "@element-plus/icons-vue" import { ArrowLeft, ArrowRight } from "@element-plus/icons-vue"
import { nextTick, ref } from "vue" import { nextTick, ref } from "vue"

View File

@ -1,7 +1,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { TagView } from "@/store/modules/tags-view" import type { TagView } from "@/store/modules/tags-view"
import type { RouteLocationNormalizedLoaded, RouteRecordRaw, RouterLink } from "vue-router" import type { RouteLocationNormalizedLoaded, RouteRecordRaw, RouterLink } from "vue-router"
import { useRouteListener } from "@/hooks/useRouteListener" import { useRouteListener } from "@/composables/useRouteListener"
import { usePermissionStore } from "@/store/modules/permission" import { usePermissionStore } from "@/store/modules/permission"
import { useTagsViewStore } from "@/store/modules/tags-view" import { useTagsViewStore } from "@/store/modules/tags-view"
import { Close } from "@element-plus/icons-vue" import { Close } from "@element-plus/icons-vue"

View File

@ -1,5 +1,5 @@
import { useRouteListener } from "@/composables/useRouteListener"
import { DeviceEnum } from "@/constants/app-key" import { DeviceEnum } from "@/constants/app-key"
import { useRouteListener } from "@/hooks/useRouteListener"
import { useAppStore } from "@/store/modules/app" import { useAppStore } from "@/store/modules/app"
import { onBeforeMount, onBeforeUnmount, onMounted } from "vue" import { onBeforeMount, onBeforeUnmount, onMounted } from "vue"

View File

@ -1,13 +1,13 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useDevice } from "@/hooks/useDevice" import { useDevice } from "@/composables/useDevice"
import { useLayoutMode } from "@/hooks/useLayoutMode" import { useLayoutMode } from "@/composables/useLayoutMode"
import { useWatermark } from "@/hooks/useWatermark" import { useWatermark } from "@/composables/useWatermark"
import { useSettingsStore } from "@/store/modules/settings" import { useSettingsStore } from "@/store/modules/settings"
import { getCssVar, setCssVar } from "@/utils/css" import { getCssVar, setCssVar } from "@/utils/css"
import { storeToRefs } from "pinia" import { storeToRefs } from "pinia"
import { watchEffect } from "vue" import { watchEffect } from "vue"
import { RightPanel, Settings } from "./components" import { RightPanel, Settings } from "./components"
import useResize from "./hooks/useResize" import useResize from "./composables/useResize"
import LeftMode from "./LeftMode.vue" import LeftMode from "./LeftMode.vue"
import LeftTopMode from "./LeftTopMode.vue" import LeftTopMode from "./LeftTopMode.vue"
import TopMode from "./TopMode.vue" import TopMode from "./TopMode.vue"

View File

@ -213,19 +213,19 @@ export const constantRoutes: RouteRecordRaw[] = [
] ]
}, },
{ {
path: "/hook-demo", path: "/composable-demo",
component: Layouts, component: Layouts,
redirect: "/hook-demo/use-fetch-select", redirect: "/composable-demo/use-fetch-select",
name: "HookDemo", name: "ComposableDemo",
meta: { meta: {
title: "Hook", title: "组合式函数",
elIcon: "Menu", elIcon: "Menu",
alwaysShow: true alwaysShow: true
}, },
children: [ children: [
{ {
path: "use-fetch-select", path: "use-fetch-select",
component: () => import("@/views/hook-demo/use-fetch-select.vue"), component: () => import("@/views/composable-demo/use-fetch-select.vue"),
name: "UseFetchSelect", name: "UseFetchSelect",
meta: { meta: {
title: "useFetchSelect" title: "useFetchSelect"
@ -233,7 +233,7 @@ export const constantRoutes: RouteRecordRaw[] = [
}, },
{ {
path: "use-fullscreen-loading", path: "use-fullscreen-loading",
component: () => import("@/views/hook-demo/use-fullscreen-loading.vue"), component: () => import("@/views/composable-demo/use-fullscreen-loading.vue"),
name: "UseFullscreenLoading", name: "UseFullscreenLoading",
meta: { meta: {
title: "useFullscreenLoading" title: "useFullscreenLoading"
@ -241,7 +241,7 @@ export const constantRoutes: RouteRecordRaw[] = [
}, },
{ {
path: "use-watermark", path: "use-watermark",
component: () => import("@/views/hook-demo/use-watermark.vue"), component: () => import("@/views/composable-demo/use-watermark.vue"),
name: "UseWatermark", name: "UseWatermark",
meta: { meta: {
title: "useWatermark" title: "useWatermark"

View File

@ -1,10 +1,10 @@
import { setRouteChange } from "@/composables/useRouteListener"
import { useTitle } from "@/composables/useTitle"
import routeSettings from "@/config/route" import routeSettings from "@/config/route"
import isWhiteList from "@/config/white-list" import isWhiteList from "@/config/white-list"
import { setRouteChange } from "@/hooks/useRouteListener"
import { useTitle } from "@/hooks/useTitle"
import { router } from "@/router" import { router } from "@/router"
import { usePermissionStoreHook } from "@/store/modules/permission" import { usePermissionStoreOutside } from "@/store/modules/permission"
import { useUserStoreHook } from "@/store/modules/user" import { useUserStoreOutside } from "@/store/modules/user"
import { getToken } from "@/utils/cache/cookies" import { getToken } from "@/utils/cache/cookies"
import { ElMessage } from "element-plus" import { ElMessage } from "element-plus"
import NProgress from "nprogress" import NProgress from "nprogress"
@ -12,8 +12,8 @@ import "nprogress/nprogress.css"
NProgress.configure({ showSpinner: false }) NProgress.configure({ showSpinner: false })
const { setTitle } = useTitle() const { setTitle } = useTitle()
const userStore = useUserStoreHook() const userStore = useUserStoreOutside()
const permissionStore = usePermissionStoreHook() const permissionStore = usePermissionStoreOutside()
router.beforeEach(async (to, _from, next) => { router.beforeEach(async (to, _from, next) => {
NProgress.start() NProgress.start()

View File

@ -51,6 +51,6 @@ export const useAppStore = defineStore("app", () => {
* SPA pinia 使 store * SPA pinia 使 store
* SSR setup 使 store * SSR setup 使 store
*/ */
export function useAppStoreHook() { export function useAppStoreOutside() {
return useAppStore(pinia) return useAppStore(pinia)
} }

View File

@ -54,6 +54,6 @@ export const usePermissionStore = defineStore("permission", () => {
* SPA pinia 使 store * SPA pinia 使 store
* SSR setup 使 store * SSR setup 使 store
*/ */
export function usePermissionStoreHook() { export function usePermissionStoreOutside() {
return usePermissionStore(pinia) return usePermissionStore(pinia)
} }

View File

@ -46,6 +46,6 @@ export const useSettingsStore = defineStore("settings", () => {
* SPA pinia 使 store * SPA pinia 使 store
* SSR setup 使 store * SSR setup 使 store
*/ */
export function useSettingsStoreHook() { export function useSettingsStoreOutside() {
return useSettingsStore(pinia) return useSettingsStore(pinia)
} }

View File

@ -99,6 +99,6 @@ export const useTagsViewStore = defineStore("tags-view", () => {
* SPA pinia 使 store * SPA pinia 使 store
* SSR setup 使 store * SSR setup 使 store
*/ */
export function useTagsViewStoreHook() { export function useTagsViewStoreOutside() {
return useTagsViewStore(pinia) return useTagsViewStore(pinia)
} }

View File

@ -67,6 +67,6 @@ export const useUserStore = defineStore("user", () => {
* SPA pinia 使 store * SPA pinia 使 store
* SSR setup 使 store * SSR setup 使 store
*/ */
export function useUserStoreHook() { export function useUserStoreOutside() {
return useUserStore(pinia) return useUserStore(pinia)
} }

View File

@ -1,8 +1,8 @@
// 统一处理 localStorage // 统一处理 localStorage
import type { ThemeName } from "@/composables/useTheme"
import type { LayoutSettings } from "@/config/layouts" import type { LayoutSettings } from "@/config/layouts"
import type { SidebarClosed, SidebarOpened } from "@/constants/app-key" import type { SidebarClosed, SidebarOpened } from "@/constants/app-key"
import type { ThemeName } from "@/hooks/useTheme"
import type { TagView } from "@/store/modules/tags-view" import type { TagView } from "@/store/modules/tags-view"
import CacheKey from "@/constants/cache-key" import CacheKey from "@/constants/cache-key"

View File

@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { getSelectDataApi } from "@/api/hook-demo/use-fetch-select" import { getSelectDataApi } from "@/api/composable-demo/use-fetch-select"
import { useFetchSelect } from "@/hooks/useFetchSelect" import { useFetchSelect } from "@/composables/useFetchSelect"
const { loading, options, value } = useFetchSelect({ const { loading, options, value } = useFetchSelect({
api: getSelectDataApi api: getSelectDataApi
@ -9,7 +9,7 @@ const { loading, options, value } = useFetchSelect({
<template> <template>
<div class="app-container"> <div class="app-container">
<h4>该示例是演示通过 hook 自动调用 api 后拿到 Select 组件需要的数据并传递给 Select 组件</h4> <h4>该示例是演示通过 composable 自动调用 api 后拿到 Select 组件需要的数据并传递给 Select 组件</h4>
<h5>Select 示例</h5> <h5>Select 示例</h5>
<el-select v-model="value" :loading="loading" filterable> <el-select v-model="value" :loading="loading" filterable>
<el-option v-for="(item, index) in options" v-bind="item" :key="index" placeholder="请选择" /> <el-option v-for="(item, index) in options" v-bind="item" :key="index" placeholder="请选择" />

View File

@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { getErrorApi, getSuccessApi } from "@/api/hook-demo/use-fullscreen-loading" import { getErrorApi, getSuccessApi } from "@/api/composable-demo/use-fullscreen-loading"
import { useFullscreenLoading } from "@/hooks/useFullscreenLoading" import { useFullscreenLoading } from "@/composables/useFullscreenLoading"
import { ElMessage } from "element-plus" import { ElMessage } from "element-plus"
const svg = ` const svg = `
@ -40,7 +40,7 @@ async function queryError() {
<template> <template>
<div class="app-container"> <div class="app-container">
<h4>该示例是演示通过将要执行的函数传递给 hook hook 自动开启全屏 loading函数执行结束后自动关闭 loading</h4> <h4>该示例是演示通过将要执行的函数传递给 composable composable 自动开启全屏 loading函数执行结束后自动关闭 loading</h4>
<el-button type="primary" @click="querySuccess"> <el-button type="primary" @click="querySuccess">
查询成功 查询成功
</el-button> </el-button>

View File

@ -1,5 +1,5 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useWatermark } from "@/hooks/useWatermark" import { useWatermark } from "@/composables/useWatermark"
import { ref } from "vue" import { ref } from "vue"
const localRef = ref<HTMLElement | null>(null) const localRef = ref<HTMLElement | null>(null)
@ -10,7 +10,7 @@ const { setWatermark: setGlobalWatermark, clearWatermark: clearGlobalWatermark }
<template> <template>
<div class="app-container"> <div class="app-container">
<h4> <h4>
该示例是演示通过调用 hook开启或关闭水印 该示例是演示通过调用 composable 开启或关闭水印
支持局部全局自定义样式颜色透明度字体大小字体倾斜角度等并自带防御防删防隐藏和自适应功能 支持局部全局自定义样式颜色透明度字体大小字体倾斜角度等并自带防御防删防隐藏和自适应功能
</h4> </h4>
<div ref="localRef" class="local" /> <div ref="localRef" class="local" />

View File

@ -8,7 +8,7 @@ import { Key, Loading, Lock, Picture, User } from "@element-plus/icons-vue"
import { reactive, ref } from "vue" import { reactive, ref } from "vue"
import { useRouter } from "vue-router" import { useRouter } from "vue-router"
import Owl from "./components/Owl.vue" import Owl from "./components/Owl.vue"
import { useFocus } from "./hooks/useFocus" import { useFocus } from "./composables/useFocus"
const router = useRouter() const router = useRouter()
const { isFocus, handleBlur, handleFocus } = useFocus() const { isFocus, handleBlur, handleFocus } = useFocus()

View File

@ -2,7 +2,7 @@
import type { CreateOrUpdateTableRequestData, TableData } from "@/api/table/types/table" import type { CreateOrUpdateTableRequestData, TableData } from "@/api/table/types/table"
import type { FormInstance, FormRules } from "element-plus" import type { FormInstance, FormRules } from "element-plus"
import { createTableDataApi, deleteTableDataApi, getTableDataApi, updateTableDataApi } from "@/api/table" import { createTableDataApi, deleteTableDataApi, getTableDataApi, updateTableDataApi } from "@/api/table"
import { usePagination } from "@/hooks/usePagination" import { usePagination } from "@/composables/usePagination"
import { CirclePlus, Delete, Download, Refresh, RefreshRight, Search } from "@element-plus/icons-vue" import { CirclePlus, Delete, Download, Refresh, RefreshRight, Search } from "@element-plus/icons-vue"
import { ElMessage, ElMessageBox } from "element-plus" import { ElMessage, ElMessageBox } from "element-plus"
import { cloneDeep } from "lodash-es" import { cloneDeep } from "lodash-es"