Skip to content

简介

什么是 Element Hooks?

Element Hooks 是一个基于 Element Plus 的 Vue 3 组合式 API 增强库,支持以配置驱动状态接管的方式使用各类组件。

在传统的 Element Plus 使用场景中,通常需要在 <template> 视图模板中编写大量组件标签、属性与插槽声明。Element Hooks 引入了控制器模式,将原本的声明式渲染转变为相对灵活的脚本配置。它通过 Hook 返回 Vue 组件(Component)操作控制器(Controller),让你能以更加集中的逻辑结构来组织页面代码。

核心特性

  • 配置驱动 — 使用 JSON 对象配置生成 Table 列、Form 字段等视图结构,所有的响应式状态管理均由 Hook 内部闭包与控制器接管,彻底告别在 options 中传入并追踪响应式对象的历史负担。
  • 逻辑与视图分离 — 将弹窗状态、表格分页等数据移至控制器内,精简组件模板代码。
  • 友好的 TypeScript 支持 — 利用泛型与函数重载,在编写配置项时提供精准的属性与事件的自动补全。
  • 原生能力 — 保留 Element Plus 组件的 Props、Slots 与 Events,支持在 <template> 按需传入属性,且该属性拥有最高优先级。
  • 轻量封装 — 完全基于 Element Plus 现有能力和 Vue 的原生逻辑组合,不引入任何额外的独立依赖包。

设计理念

逻辑集中管理

useTable 为例,传统写法需要在 <template> 视图模板中逐个声明 <el-table-column>。当涉及权限判断或状态交互时,通常需要嵌套大量的 v-ifv-else 指令,这极大增加了模板代码的阅读负担。使用 Element Hooks 后,你可以仅传入初始的 columns 配置数组,并在代码逻辑中通过控制器暴露的 setColumns 等方法来灵活变更列配置:

vue
<script setup lang="ts">
  import { useTable } from 'element-hooks';

  const [Table] = useTable({
    columns: [
      { prop: 'name', label: '姓名' },
      { prop: 'age', label: '年龄' },
    ],
    data: [
      { name: 'Tom', age: 18 },
      { name: 'Jerry', age: 20 },
    ],
  });
</script>

<template>
  <Table />
</template>

保留原生能力

Element Hooks 的定位是提供一种轻量的上层提效手段。组件 Hook 返回的实例本质上仍是常规的 Element Plus 组件。

在使用时,写在 <template> 视图的组件属性具有等同于原生的行为与更高的优先级。你既可以在 Hook 配置参数中统一设定基础选项,也可以在模板中按需覆盖独立属性与事件:

vue
<script setup lang="ts">
  import { useDialog } from 'element-hooks';

  const [Dialog, { open, close }] = useDialog({
    title: '提示',
    width: 500,
  });
</script>

<template>
  <el-button @click="open">打开对话框</el-button>
  <Dialog draggable @opened="() => console.log('opened')">
    <p>这是一段内容。</p>
    <template #footer>
      <el-button @click="close">关闭</el-button>
    </template>
  </Dialog>
</template>

适用场景

  • 中后台系统:适用于包含大量增删改查(CRUD)列表、搜索表单以及相对标准弹窗交互的常见业务页面。
  • 复杂交互场景:需要跨组件层级传递状态,或希望集中管理多个组件联动逻辑的视图。
  • 配置化开发体验:倾向于使用脚本进行声明与属性设置,消解由于组件层级嵌套累积的模板杂乱感。

更深入的设计分类及 Hooks 列表请阅读 Hooks 介绍