子组件导出
除了 PageTemplate 和 Table 主组件外,vue-admin-kit 还导出以下子组件,可以单独使用。
组件列表
布局组件
| 组件 | 说明 |
|---|---|
PageTemplate | 主 CRUD 页面模板组件 |
Table | 基于 VXE-Table 封装的表格组件 |
Descriptions | 数据展示组件,支持字典、文件、富文本等展示类型 |
弹窗组件
| 组件 | 说明 |
|---|---|
FormDialog | 表单弹窗,用于新增/编辑 |
DetailDialog | 详情弹窗,用于查看数据详情 |
Drawer | 抽屉组件,侧边滑出的面板 |
FileListDialog | 文件列表弹窗 |
搜索组件
| 组件 | 说明 |
|---|---|
SearchForm | 搜索表单,配置化生成搜索栏 |
表单控件
| 组件 | 说明 |
|---|---|
Input | 输入框,支持后缀单位 |
Textarea | 多行文本输入 |
Number | 数字输入框,支持精度、范围 |
Select | 下拉选择器,支持字典、远程搜索 |
SelectChange | 搜索选择组件,支持搜索并选择关联数据 |
Radio | 单选框,支持字典 |
Date | 日期选择器,支持日期、日期时间、范围 |
Time | 时间选择器 |
Upload | 文件上传组件 |
UploadCard | 卡片式文件上传,支持多类型文件分组上传 |
WangeEitor | 富文本编辑器(基于 WangEditor) |
Line | 分割线,可带标题和按钮 |
InputGroup | 输入框组,多个输入框的组合 |
AddableInputGroup | 可添加输入组,支持动态添加/删除 |
辅助组件
| 组件 | 说明 |
|---|---|
DictHelper | 字典转换组件,将字典值转换为标签显示 |
DictTag | 字典标签组件,纯粹的字典标签显示 |
SafeHtml | 安全 HTML 渲染(使用 DOMPurify) |
导入方式
typescript
import {
// 布局组件
PageTemplate,
Table,
Descriptions,
// 弹窗组件
FormDialog,
DetailDialog,
Drawer,
FileListDialog,
// 搜索组件
SearchForm,
// 表单控件
Input,
Textarea,
Number,
Select,
SelectChange,
Radio,
Date,
Time,
Upload,
UploadCard,
WangeEitor,
Line,
InputGroup,
AddableInputGroup,
// 辅助组件
DictHelper,
DictTag,
SafeHtml,
// 工具函数
downloadFile,
useTableHeightEmitter,
} from "vue-admin-kit";表单控件详解
Input 输入框
vue
<script setup>
import { Input } from "vue-admin-kit";
</script>
<template>
<Input
v-model="formData.name"
placeholder="请输入名称"
suffix="元"
suffix-type="text"
/>
</template>Number 数字输入
vue
<script setup>
import { Number } from "vue-admin-kit";
</script>
<template>
<Number
v-model="formData.price"
:min="0"
:max="99999"
:precision="2"
:step="0.1"
suffix="元"
/>
</template>Select 下拉选择
vue
<script setup>
import { Select } from "vue-admin-kit";
</script>
<template>
<!-- 使用字典 -->
<Select
v-model="formData.status"
dict-type="sys_status"
placeholder="请选择状态"
/>
<!-- 使用静态选项 -->
<Select
v-model="formData.type"
:options="[
{ label: '类型A', value: 'a' },
{ label: '类型B', value: 'b' },
]"
/>
<!-- 远程搜索 -->
<Select
v-model="formData.userId"
dict-type="user_list"
filterable
remote
remote-param="name"
/>
</template>Date 日期选择
vue
<script setup>
import { Date } from "vue-admin-kit";
</script>
<template>
<!-- 单日期 -->
<Date v-model="formData.birthday" date-type="date" />
<!-- 日期时间 -->
<Date v-model="formData.createTime" date-type="datetime" />
<!-- 日期范围 -->
<Date v-model="formData.dateRange" date-type="daterange" />
</template>Radio 单选
vue
<script setup>
import { Radio } from "vue-admin-kit";
</script>
<template>
<Radio v-model="formData.sex" dict-type="sys_user_sex" />
</template>Upload 文件上传
vue
<script setup>
import { Upload } from "vue-admin-kit";
</script>
<template>
<Upload
v-model="formData.files"
:limit="5"
accept=".pdf,.doc,.docx"
biz-type="attachment"
/>
</template>UploadCard 卡片上传
vue
<script setup>
import { UploadCard } from "vue-admin-kit";
</script>
<template>
<UploadCard
v-model="formData.images"
:upload-config-list="[
{ prop: 'cover', label: '封面图', limit: 1, accept: 'image/*' },
{ prop: 'gallery', label: '图片集', limit: 9, accept: 'image/*' },
]"
/>
</template>Line 分割线
vue
<script setup>
import { Line } from "vue-admin-kit";
</script>
<template>
<!-- 简单分割线 -->
<Line label="基本信息" />
<!-- 带按钮的分割线 -->
<Line label="联系人信息" btn-title="添加" :btn-click="handleAddContact" />
</template>DictTag 字典标签
vue
<script setup>
import { DictTag, useDictOptions } from "vue-admin-kit";
const statusOptions = useDictOptions("sys_status");
</script>
<template>
<DictTag :options="statusOptions" :value="row.status" />
</template>SafeHtml 安全渲染
vue
<script setup>
import { SafeHtml } from "vue-admin-kit";
</script>
<template>
<SafeHtml :content="htmlContent" />
</template>弹窗组件详解
FormDialog 表单弹窗
vue
<script setup>
import { ref } from "vue";
import { FormDialog } from "vue-admin-kit";
const visible = ref(false);
const formData = ref({});
const formConfig = [
{ type: "input", prop: "name", label: "名称", required: true },
{ type: "select", prop: "status", label: "状态", dictType: "sys_status" },
];
const handleSubmit = async () => {
// 提交逻辑
};
</script>
<template>
<FormDialog
v-model="visible"
v-model:form-data="formData"
title="新增用户"
:form-config="formConfig"
@submit="handleSubmit"
/>
</template>DetailDialog 详情弹窗
vue
<script setup>
import { ref } from "vue";
import { DetailDialog } from "vue-admin-kit";
const visible = ref(false);
const detailData = ref({});
const formConfig = [
{ type: "input", prop: "name", label: "名称" },
{ type: "select", prop: "status", label: "状态", dictType: "sys_status" },
];
</script>
<template>
<DetailDialog
v-model="visible"
:detail-data="detailData"
:form-config="formConfig"
/>
</template>Drawer 抽屉
vue
<script setup>
import { ref } from "vue";
import { Drawer } from "vue-admin-kit";
const visible = ref(false);
</script>
<template>
<Drawer v-model="visible" title="详情" size="50%">
<template #default>
<!-- 抽屉内容 -->
</template>
</Drawer>
</template>FileListDialog 文件列表弹窗
vue
<script setup>
import { ref } from "vue";
import { FileListDialog } from "vue-admin-kit";
const visible = ref(false);
const fileList = ref([
{ url: "https://example.com/file.pdf", originalName: "文件.pdf" },
]);
</script>
<template>
<FileListDialog v-model="visible" :file-list="fileList" />
</template>工具函数
downloadFile
文件下载工具函数:
typescript
import { downloadFile } from "vue-admin-kit";
// 下载文件
await downloadFile(api.downloadTemplate, "导入模板");
// 指定文件类型
await downloadFile(api.exportData, "数据导出", "xlsx");useTableHeightEmitter
表格高度事件发射器:
typescript
import { useTableHeightEmitter } from "vue-admin-kit";
const emit = defineEmits(["setTableHeight"]);
const { emitSetTableHeight } = useTableHeightEmitter(emit);
// 触发高度更新
emitSetTableHeight();