define basic data:

const SET_QUERY = "SET_QUERY";
const TOGGLE_LOADING = "TOGGLE_LOADING";
const SET_PAGINATION = "SET_PAGINATION";
const SET_TABLE_DATA = "SET_TABLE_DATA";
const SET_DATA_SOURCE = "SET_DATA_SOURCE";
const initialPagination = {page: 0, size: 10};

declare reducer:

const tableReducer = (state: any, action: any) => {
const {payload} = action;
switch(state.type) {
case TOGGLE_LOADING:
return {...state, loading: !state.loading};
case SET_QUERY:
return {...state, params: payload.params, pagination: initialPagination};
case SET_PAGINATION:
return {...state, pagination: payload.pagination};
case SET_DATA_SOURCE:
return {...state, dataSource: payload.dataSource};
case SET_TABLE_DATA:
return {...state, pagination: payload.pagination, dataSource: payload.dataSource};
default:
return state
}
}

define useAsyncTable

传入相应的参数,通过userReducer执行不一样的action更新state数据,使用useEffect监听数据发生变化重新渲染页面

function useAsyncTable (columns: [], searchParams: any =null, queryAction: any, listName: string){
const queryParams:any = null;
const dataSource any[] = [];
const initialState = {
loading: false,
queryParams: queryParams,
dataSource: dataSource
}
const [state, dispatch] = useReducer(tableReducer, initialState);
const handlePageChange = (pageNum: number) => {
dispatch(type: SET_PAGINATION, payload: {...state.pagination, page: pageNum - 1});
}
const onQuery = () => {
dispatch({type: TOOGLE_LOADING});
queryAction({...state.params, ...pagination})
.then((res: any) => {
const {totalElements} = res.data;
dispatch({type: TOOGLE_LOADING});
dispatch({type: SET_TABLE_DATA, payload: {
pagination: {...state.pagination, total: totalElements}
dataSource: res.data[listName]
}})
})
.catch(() => {
dispatch({type: TOOGLE_LOADING});
})
}
}

useEffect 监听请求

useEffect(()=>{
if (searchParams && JSON.Stringfy(searchParams) !== JSON.Stringfy(state.queryParams) ) {
dispatch({type: SET_QUERY, payload: {
params: searchParams
}})
} else {
onQuery()
}
},[searchParams, state.pagination.page, state.query])

return renderer:

return (
<>
<Table
rowKey={(record: any, index: any) => index}
className= " table-list"
columns={columns}
loading={state.loading}
dataSource={state.dataSource}
pagination={false}
/>
<AppPagination
total={state.pagination.total}
pageSize={state.pagination.page + 1}
total={state.pagination.
handleChangePage={handleChangePage)}
/>
  </>
)

简单调用:

const queryAction = (params: ISearchParams) => {
return Promise method
}
const tableList = useAsyncTable(columns, searchParams, queryAction); return (<>{tableList}</>)

react: typescript custom hooks useAsyncTable的更多相关文章

  1. 10分钟了解 react 引入的 Hooks

    "大家好,我是谷阿莫,今天要将的是一个...",哈哈哈,看到这个题我就想到这个开头.最近react 官方在 2018 ReactConf 大会上宣布 React v16.7.0-a ...

  2. how to create react custom hooks with arguments

    how to create react custom hooks with arguments React Hooks & Custom Hooks // reusable custom ho ...

  3. react + typescript 学习

    react,前端三大框架之一,也是非常受开发者追捧的一门技术.而 typescript 是 javascript 的超集,主要特点是对 类型 的检查.二者的结合必然是趋势,不,已经是趋势了.react ...

  4. React + Typescript领域初学者的常见问题和技巧

    React + Typescript领域初学者的常见问题和技巧 创建一个联合类型的常量 Key const NAME = { HOGE: "hoge", FUGA: "f ...

  5. React 16.x & Hooks

    React 16.x & Hooks Hooks https://reactjs.org/docs/hooks-intro.html https://reactjs.org/docs/hook ...

  6. react typescript jest config (一)

    1. initialize project create a folder project Now we'll turn this folder into an npm package. npm in ...

  7. 【每天学一点-04】使用脚手架搭建 React+TypeScript+umi.js+Antd 项目

    一.使用脚手架搭建项目框架 1.首先使用脚手架搭建React项目(React+TypeScript+Umi.js) 在控制台输入命令:yarn create @umijs/umi-app 2.引入An ...

  8. 使用react搭建组件库:react+typescript+storybook

    前期准备 1. 初始化项目 npx create-react-app react-components --template typescript 2. 安装依赖 使用哪种打包方案:webpack/r ...

  9. React + TypeScript + Taro前端开发小结

    前言 项目到一段落,先来记录一下,本文以前端新手的角度记录React.TypeScript.Taro相关技术的开发体验以及遇到的问题和解决方法. 之前总说要学React(这篇博客:代码使我头疼之Rea ...

随机推荐

  1. Centos7部署k8s[v1.16]高可用[keepalived]集群

    实验目的 一般情况下,k8s集群中只有一台master和多台node,当master故障时,引发的事故后果可想而知. 故本文目的在于体现集群的高可用,即当集群中的一台master宕机后,k8s集群通过 ...

  2. 【Pytest03】全网最全最新的Pytest框架fixture应用篇(1)

    fixtrue修饰器标记的方法通常用于在其他函数.模块.类或者整个工程调用时会优先执行,通常会被用于完成预置处理和重复操作.例如:登录,执行SQL等操作. 完整方法如下:fixture(scope=' ...

  3. Ubuntu在Anaconda中安装TensorFlow GPU,Keras,Pytorch

    安装TensorFlow GPU pip install --ignore-installed --upgrade tensorflow-gpu 安装测试: $ source activate tf ...

  4. tkinter gui控件回调和grid布局优化

    0.引子 Tkinter 是 Python 的标准 GUI 库.Python 使用 Tkinter 可以快速的创建 GUI 应用程序.由于 Tkinter 是内置到 python 的安装包中.只要安装 ...

  5. 悟懂MapReduce,不纠结!

    在<谷歌 MapReduce 初探>中,我们通过统计词频的 WordCount 经典案例,对 Google 推出的 MapReduce 编程模型有了一个认识,但是那种认识,还只是停留在知道 ...

  6. 一文教会你如何在 Spring 中进行集成测试,太赞了

    不得不说,测试真的是太重要了!但并不是所有的开发者都这样认为,这种感觉在我回到洛阳后尤其强烈.竟然有团队成员不经测试就把代码提交到代码库,并且是会报错的那种,我天呐,遇到这种队友我也是醉了. 我之前是 ...

  7. Nginx知多少系列之(三)配置文件详解

    目录 1.前言 2.安装 3.配置文件详解 4.Linux下托管.NET Core项目 5.Linux下.NET Core项目负载均衡 6.Linux下.NET Core项目Nginx+Keepali ...

  8. 配置一个mariadb数据库《二》

                                                             mariadb 配置一个数据库 案例4:配置一个数据库 4.1 问题 本例要求在虚拟机 ...

  9. Epicor support overview支持服务

    提供以下服务项目: •Support services 支持服务•Implementations 实施•Epicor software upgrades 软件升级•Database support & ...

  10. layui经典模块化前端UI框架初识

    layui产生背景 layui相对于vue来说确实稍有逊色,但是官网提供的入门文档以及完善的框架结构,使的很多人开始用layui来开发前端页面,那么什么人会去使用layui呢? 针对后端开发人员,在对 ...