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. Samba centos7文件共享服务器搭建教程,可以更改任意需求操作配置详解。

    先安装软件   yum -y install samba-client 请看如下配置文件说明 [gongxiang]       comment = This is my shared folder  ...

  2. python之字符编码与转码

    说起python编码,真是句句心酸,今天终于是,终于梳理清楚了,下面我们就来一起揭开py编码的真相吧! 一,什么是编码? 其实基本概念很简单.我们都知道消息,那么消息就是人类所能理解的,简单易懂的存在 ...

  3. 零基础从实践出发学java编程【总结篇】

    1.背景 很多人学习java的第一步就是系统的学习java基础语法,有的java基础语法还没学完就崩溃了,确实java基础语法太多太细,而且都是理论,学着让人很懵: 好不容易学完基础语法,又要学框架. ...

  4. iOS 项目优化

    前言 iOS性能优化系列篇之"优化总体原则" 不要提前过度优化 要找到性能瓶颈 要在不同性能指标间权衡 要理解优化任务的底层运行机制 要有技术保障体系 一.启动速度优化 1.1 学 ...

  5. Python math库和random库

    1.math库 >>> from math import * >>> 2*pi 6.283185307179586 >>> e 2.7182818 ...

  6. 面试中常问的五种IO模型和BIO,NIO,AIO

    一,五种IO模型: 一个IO操作可以分为两个步骤:发起IO请求和实际的IO操作例如:1.操作系统的一次写操作分为两步:第一步,将数据从用户空间拷贝到系统空间:第二步,从系统空间往网卡写.2.一次读操作 ...

  7. 一天学一个Linux命令:第二天 cd pwd

    文章更新于:2020-03-08 注:本文参照 man pwd 手册,并给出使用样例. 文章目录 一.命令之 `cd` 和 `pwd` 1.命令介绍 2.语法格式 3.使用样例 4.pwd 参数 5. ...

  8. Java第三十二天,IO操作(续集),读写缓冲区的使用

    缓冲区出现原因: Java对IO的读写都是经过中间途经--JVM虚拟机进行管理的,JVM调用OS操作系统继续完成IO操作.如此一来,整个过程耗费了不小的资源,为了尽量减少这样重复的周期性操作,出现了缓 ...

  9. Struts2-学习笔记系列(15)-ajax支持和JSON

    7.1stream类型的result 使用stream就无需jsp页面,直接在action想浏览者生成指定的响应 @Override public java.lang.String execute() ...

  10. alg-链表中有环

    typedef struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(nullptr) {} }ListN ...