-
Notifications
You must be signed in to change notification settings - Fork 2.8k
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
【RFC】useTable Hook 插件 #465
Comments
|
十!分!期!待!~~ ✿✿ヽ(°▽°)ノ✿ |
interface IPaginationProps {
total: number; // 总共
pageSize: number; // 每页条数
current: number; // 当前页
onChange: (pageIndex: number) => void; // 页跳转事件
onPageSizeChange: (pageSize: number) => void; // 页大小切换事件
}
|
|
|
第二层不是建议吧,如果不放到 deps 里面,会造成闭包问题。并且如果使用了 react 提供的 vscode 插件,不写还会报警告。 我举个例子来对比下 useEffect 的 deps 和 useRequest 的 refreshDeps
const [state, setState] = useState('hello');
const [id, setState] = useState(1);
useEffect(()=>{
const timer = setTimeout(()=>{
console.log(id, state);
}, 1000);
return ()=> clearTimeout(timer);
}, [id]); 上面的例子是不对的,每次打印的
const [state, setState] = useState('hello');
const [id, setState] = useState(1);
const persistFn = usePersistFn(()=>{
setTimeout(()=>{
console.log(id, state);
}, 1000);
});
useEffect(()=>{
persistFn();
}, []); 通过 usePersistFn 包装,避免了闭包问题。也就不需要把依赖放在 deps 中了。 不知道你能看懂我说的么~好像有点绕。。哈哈 |
这个只要统一就没问题。但是不能有些地方是 current,有些地方是 pageIndex |
@brickspert 那就最后的 API 应该是 interface Options {
current?: number; // 默认从第几页请求
pageSize?: number; // 默认页码大小
autoFirstQuery?: boolean; // 是否第一次发送
plugins?: PluginReturnValue[]; // 插件集合
refreshDeps?: any[]; // 里面的值一变就会重新发请求
}
function useTable(
service: (params?: Obj) => Promise<any>,
options?: Options,
): ReturnValue; |
+1 |
fixed by https://usetable-ahooks.js.org/ |
简介
为 useTable 能力集成插件扩展能力,方便用户扩展 Filter、排序、多选等能力,同时也方便上层建设对应的解决方案,比如配置化、数据驱动。
基础案例
下面演示一个简单的例子,以伪代码的方式。
useTable 具备插件的扩展能力,每一个插件其实也是一个 Hook,可以定义为高级 Hook,它可以
具体为什么需要这些能力可以往下看。
动机
在中后台业务上表单查询场景很多,基本上占了 60% 左右,如何梳理一个通用解决方案来提效是我们现在面临的问题。另外一个问题就是虽然场景类似但是中后台业务场景变化不可预测,我们需要提供一个灵活的可扩展机制来让更多人沉淀能力。
并且每一个功能点都涉及到几个维度的能力,既要可以管理状态又要可以在请求链路做一些个性处理。插件核心的理念是“Write One Do Everything”也就是只写一个地方就可以处理一个功能。下面举两个例子来分析:
1. 异步默认值
我们要实现的功能是“发一个请求取下拉数据 --> 取第一个值设置默认值 --> 请求参数加上对应的默认值 --> 表格的请求才能发送”,并且在重置的时候要保留默认值。
2. 多选
如果你要实现一个多选的功能的话,你需要做几件事情
也就是我们要去做很多事情才能实现这个功能,如果只做一次还好,但是如果你每次开发都涉及多个页面,你如何把这些能力沉淀起来,并且可以组合使用呢?
下面会具体介绍 useTable 整体方案的设计。
设计细节
主要分三个主题来讲解:
内置协议设计
请求 Response 规范
每一次请求的 Response 规范,useTable 会获取对应的值填充对应组件的 Props。
Props 协议
useTable 会返回一些组件的 Props,方便用户直接设置到对应组件。
Table
Pagination
form
底层使用的是 formily
插件扩展能力设计
上面“动机”举了两个例子,我们可以推导为了实现一个功能需要具备的能力:
Interface
插件的 Interface
伪代码
下面用伪代码演示下简单的插件写法
想要自定义插件,需要了解下 middlewares 和 props 两个属性的意义和具体用法。
Middlewares
这个是 Koa 的洋葱模型,可以方便你设置参数,也可以方便你在请求前做一些处理,请求后做一些处理。写法跟你在写 Koa Middleware 一样,只是 ctx 内容不一样而已。具体 ctx 内容后面会介绍:
Props
props 有两个功能,一个是自动合并 table、 form、pagination 的 props,另外一个是为了暴露功能到外界,可以让外界使用,比如一些获取的数据。
props 可以两种表现形式,一个是对象的方式,另外一个是函数的方式。
如果你要获取 ctx 的话,可以通过函数的方式
tableProps、formProps、paginationProps 这三个是特殊的属性,useTable 会检测并且合并到对应的 props 上。比如
formProps、paginationProps 以此类推。
Ctx
这个是 middleware 还有 props 为函数的时候注入的 ctx 的 interface 定义
外部 API 设计
这个是外界用户最为感知的 API 设计
缺点
Hooks 通病也会出现,比如经常遇到的问题
FAQ
The text was updated successfully, but these errors were encountered: