Skip to content

CURD 进阶

CURD 的高阶用法:usePage 核心 API 与自定义扩展。

usePage API

usePage 是 CURD 的核心组合式函数,返回组件 ref 和事件处理方法。

返回值说明
searchRefPageSearch 实例引用
contentRefPageContent 实例引用
addModalRef新增弹窗实例引用
editModalRef编辑弹窗实例引用
handleQueryClick查询:获取筛选条件并刷新列表
handleResetClick重置:清空条件并刷新列表
handleAddClick打开新增弹窗
handleEditClick(row, fetchFn?)打开编辑弹窗并加载数据
handleViewClick(row, fetchFn?)打开查看弹窗(只读模式)
handleSubmitClick提交后刷新列表
handleExportClick根据查询条件导出数据
handleSearchClick切换搜索区域显隐
handleFilterChange列筛选变化时刷新列表
typescript
const {
  searchRef,
  contentRef,
  addModalRef,
  editModalRef,
  handleQueryClick,
  handleResetClick,
  handleAddClick,
  handleEditClick,
  handleViewClick,
  handleSubmitClick,
  handleExportClick,
  handleSearchClick,
  handleFilterChange,
} = usePage();

导入导出

后端导入导出

typescript
const contentConfig: IContentConfig = reactive({
  toolbar: ["import", "export"],
  exportAction: UserAPI.export,
  importAction: (file: File) => UserAPI.import("1", file),
  importTemplate: UserAPI.downloadTemplate,
});

前端导入导出

不依赖后端接口,前端直接处理数据:

typescript
const contentConfig: IContentConfig = reactive({
  defaultToolbar: ["imports", "exports"],
  importsAction: (data: any[]) => {
    console.log("导入的数据", data);
    return Promise.resolve();
  },
  exportsAction: async (params: any) => {
    const res = await UserAPI.getPage(params);
    return res.list;
  },
});

动态表单

通过 hidden 函数根据表单数据动态显隐表单项:

typescript
{
  label: "指定用户",
  prop: "targetUserIds",
  type: "select",
  hidden: (formData) => formData.targetType !== 2,
  attrs: { multiple: true },
}

联动效果

通过 events.onChange 监听变化并联动加载选项:

typescript
{
  label: "省份",
  prop: "province",
  type: "select",
  options: provinceArr,
  events: {
    change: (value: any) => {
      formData.city = "";
      loadCities(value);
    },
  },
}

响应式布局

表单项通过 col 属性适配不同屏幕:

typescript
{
  label: "用户名",
  prop: "username",
  type: "input",
  col: {
    xs: 24,  // 手机端占满整行
    sm: 12,  // 平板占半行
    md: 8,   // 桌面占三分之一
    lg: 6,   // 大屏占四分之一
  },
}

操作列按钮

条件显示

typescript
operat: [
  {
    name: "reset_pwd",
    text: "重置密码",
    attrs: { icon: "refresh-left" },
    show: (row) => row.status === 1,
  },
  "edit",
  "delete",
]

查看/编辑切换

typescript
const handleOperateClick = (data: IOperateData) => {
  if (data.name === "detail") {
    editModalConfig.drawer = { ...editModalConfig.drawer, title: "查看" };
    handleViewClick(data.row, () => UserAPI.getFormData(data.row.id));
  } else if (data.name === "edit") {
    editModalConfig.drawer = { ...editModalConfig.drawer, title: "修改" };
    handleEditClick(data.row, () => UserAPI.getFormData(data.row.id));
  }
};

共享选项数据

多个配置共用同一份选项数据:

typescript
const deptArr = ref<OptionType[]>([]);
const roleArr = ref<OptionType[]>([]);

onMounted(async () => {
  const [dept, roles] = await Promise.all([
    DeptAPI.getOptions(),
    RoleAPI.getOptions(),
  ]);
  deptArr.value = dept;
  roleArr.value = roles;
});

配置要点

pk 字段用于删除和编辑,必须正确配置;配置对象用 reactive 包裹;按钮权限基于 permPrefix:操作名 格式(如 sys:user:create)。

基于 MIT 许可发布 · 如需部署协助或二开定制,请查看 支持与合作