web/console/src/global/readme.md
src/global 文件夹包含了 Vue 应用的全局配置,主要提供全局过滤器(Filters)和全局方法(Global Methods)的设置。这些功能可以在整个应用中使用,无需在每个组件中重复导入。
src/global/
├── index.ts # 入口文件,统一导出和配置
├── filters.ts # 过滤器实现和类型定义
├── methods.ts # 全局方法实现和类型定义
└── readme.md # 使用指南(本文件)
通过 setupFilter 函数设置,提供以下过滤器:
addCommasToNumbernumber: number | string - 要格式化的数字string - 格式化后的字符串<template>
<div>{{ $filters.addCommasToNumber(1234567) }}</div>
<!-- 输出: 1,234,567 -->
</template>
formatTimetime: number - 时间戳string - 格式化后的时间字符串<template>
<div>{{ $filters.formatTime(1640995200000) }}</div>
<!-- 输出: 2022-01-01 00:00:00 -->
</template>
formatDatetime: number - 时间戳format: string - 日期格式(可选,默认为 'YYYY-MM-DD hh:mm')string - 格式化后的日期字符串<template>
<div>{{ $filters.formatDate(1640995200000) }}</div>
<!-- 输出: 2022-01-01 00:00 -->
<div>{{ $filters.formatDate(1640995200000, "YYYY年MM月DD日") }}</div>
<!-- 输出: 2022年01月01日 -->
</template>
通过 setupGlobal 函数设置,提供以下全局方法:
$noopundefined<script setup>
// 在组件中使用
const handleClick = () => {
// 使用全局空操作函数
$noop()
}
</script>
$getRealPath{ url: string } - 包含 URL 的对象string - 完整的资源路径<script setup>
// 在组件中使用
const imagePath = $getRealPath({ url: "/images/logo.png" })
// 返回: base_path + '/images/logo.png'
</script>
$numberInputKeydownHandlere: KeyboardEvent - 键盘事件对象void<template>
<input
type="text"
@keydown="$numberInputKeydownHandler"
placeholder="请输入数字"
/>
</template>
import { createApp } from "vue"
import App from "./App.vue"
import { setupGlobalConfig } from "@/global"
const app = createApp(App)
// 统一设置全局配置
setupGlobalConfig(app)
app.mount("#app")
或者分别设置:
import { createApp } from "vue"
import App from "./App.vue"
import { setupFilter, setupGlobal } from "@/global"
const app = createApp(App)
// 分别设置全局过滤器和全局方法
setupFilter(app)
setupGlobal(app)
app.mount("#app")
<template>
<div>
<!-- 数字格式化 -->
<p>价格: {{ $filters.addCommasToNumber(1234567) }}</p>
<!-- 时间格式化 -->
<p>时间: {{ $filters.formatTime(timestamp) }}</p>
<!-- 日期格式化 -->
<p>日期: {{ $filters.formatDate(timestamp, "YYYY-MM-DD") }}</p>
</div>
</template>
<script setup>
import { ref } from "vue"
const timestamp = ref(1640995200000)
</script>
<template>
<div>
<input
v-model="numberValue"
@keydown="$numberInputKeydownHandler"
placeholder="请输入数字"
/>
</div>
</template>
<script setup>
import { ref } from "vue"
const numberValue = ref("")
</script>
所有全局方法和过滤器都支持 TypeScript 类型检查。在 Vue 3 中,全局方法可以直接调用,过滤器通过 $filters 对象调用,无需使用 this。类型定义与实现逻辑在同一文件中,便于维护:
// 过滤器类型
declare module "@vue/runtime-core" {
interface ComponentCustomProperties {
$filters: {
addCommasToNumber: (number: number | string) => string
formatTime: (time: number) => string
formatDate: (time: number, format?: string) => string
}
}
}
// 全局方法类型 - Vue 3 Composition API
declare global {
interface Window {
$noop: () => void
$getRealPath: (params: { url: string }) => string
$numberInputKeydownHandler: (e: KeyboardEvent) => void
}
}
// 在 Composition API 中使用的类型声明
declare module "vue" {
interface ComponentCustomProperties {
$noop: () => void
$getRealPath: (params: { url: string }) => string
$numberInputKeydownHandler: (e: KeyboardEvent) => void
}
}
$filters.xxx() 的方式调用this// 在 setupFilter 函数中添加
export function setupFilter(app) {
app.config.globalProperties.$filters = {
// 现有过滤器...
// 新增过滤器
formatCurrency(value: number, currency = "CNY") {
return new Intl.NumberFormat("zh-CN", {
style: "currency",
currency,
}).format(value)
},
}
}
// 在 setupGlobal 函数中添加
export function setupGlobal(app) {
const globalMethods = {
// 现有方法...
// 新增方法
$debounce: (func: Function, delay: number) => {
let timeoutId: NodeJS.Timeout
return (...args: any[]) => {
clearTimeout(timeoutId)
timeoutId = setTimeout(() => func.apply(null, args), delay)
}
},
}
Object.assign(app.config.globalProperties, globalMethods)
Object.assign(window, globalMethods)
}
$ 开头,避免与组件属性冲突src/global/filters.ts - 过滤器实现和类型定义src/global/methods.ts - 全局方法实现和类型定义src/utils/config.ts - 基础路径配置src/utils/moment.ts - 时间格式化工具src/main.ts - 应用入口文件