-
Notifications
You must be signed in to change notification settings - Fork 2.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in 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: