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. ConcurrentHashMap(1.7版本和1.8版本)

     为什么要使用ConcurrentHashMap? ConcurrentHashMap是Java5中新增加的一个线程安全的Map集合,可以用来替代hashMap和HashTable.因为在并发编程中使 ...

  2. 面试刷题29:mysql事务隔离实现原理?

    mysql的事务是innodb存储引擎独有的,myisam存储引擎不支持事务. 事务最经典的例子就是转账了,事务要保证的是一组数据库的操作要么全部成功,要么全部失败.是为了保证高并发场景下数据的正确性 ...

  3. WePY框架 input,checkbox-group,radio-group等change 一般处理方法

    布局搞定了,接下来就是数据处理方面了 form表单中常用标签,绑定change方法: 方法的具体实现 根据打印出来e的结果可以看到,e指代当前标签对象,包含属性方法等 从detail中可以获取多选框选 ...

  4. 添加windows开机自启动项

    windows系统下我们最常用的是禁用启动项,但如果程序不在自启动列表里面,如何添加程序启动呢. 其实也很简单,首先找到windows启动路径C:\Users\NL\AppData\Roaming\M ...

  5. python—json

    一.json数据类型:是字符串 # json通用数据类型,所有语言都可以用 # {k-v}形式存在,里面只能用双引号"" # 定义json字符串,要用'''{}'''格式 #htt ...

  6. Codeforces 1332F - Independent Set(树dp)

    题目链接 题意 给出一棵 n 个点的树, 求它的所有非空诱导子图的独立集种类数之和, 对 998244353 取模. n ≤ 3e5. 题解 不妨假设在独立集中的点被染色成 1, 其余不染色; 由于不 ...

  7. SpringBoot常见注解的解释

    @Component 这个注解类似SSM中的Controller和Service注解 ,将加了这个注解的类装配到Sping容器内,这样就可以在其他类用@Autowired注解实现依赖注入. @Conf ...

  8. CVE-2020-7961 Liferay Portal 复现分析

    漏洞说明: Liferay是一个开源的Portal(认证)产品,提供对多个独立系统的内容集成,为企业信息.流程等的整合提供了一套完整的解决方案,和其他商业产品相比,Liferay有着很多优良的特性,而 ...

  9. 教你用Cobra开发类似docker的命令行

    目录 前言 一.安装 二.初始化应用 gomod初始化 创建入口文件cmd/root.go 创建主程序main.go 三.生成Command 创建hello子命令 创建version子命令 四.如何设 ...

  10. 错误:Attempt to resolve method: [XXX方法] on undefined variable or class name: [XXX类]的解决(IDEA打包jar问题)

    问题: 使用JMeter调用jar包的时候,报错误信息Typed variable declaration : Attempt to resolve method:[XXX方法] on undefin ...