react: typescript custom hooks useAsyncTable
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的更多相关文章
- 10分钟了解 react 引入的 Hooks
"大家好,我是谷阿莫,今天要将的是一个...",哈哈哈,看到这个题我就想到这个开头.最近react 官方在 2018 ReactConf 大会上宣布 React v16.7.0-a ...
- how to create react custom hooks with arguments
how to create react custom hooks with arguments React Hooks & Custom Hooks // reusable custom ho ...
- react + typescript 学习
react,前端三大框架之一,也是非常受开发者追捧的一门技术.而 typescript 是 javascript 的超集,主要特点是对 类型 的检查.二者的结合必然是趋势,不,已经是趋势了.react ...
- React + Typescript领域初学者的常见问题和技巧
React + Typescript领域初学者的常见问题和技巧 创建一个联合类型的常量 Key const NAME = { HOGE: "hoge", FUGA: "f ...
- React 16.x & Hooks
React 16.x & Hooks Hooks https://reactjs.org/docs/hooks-intro.html https://reactjs.org/docs/hook ...
- react typescript jest config (一)
1. initialize project create a folder project Now we'll turn this folder into an npm package. npm in ...
- 【每天学一点-04】使用脚手架搭建 React+TypeScript+umi.js+Antd 项目
一.使用脚手架搭建项目框架 1.首先使用脚手架搭建React项目(React+TypeScript+Umi.js) 在控制台输入命令:yarn create @umijs/umi-app 2.引入An ...
- 使用react搭建组件库:react+typescript+storybook
前期准备 1. 初始化项目 npx create-react-app react-components --template typescript 2. 安装依赖 使用哪种打包方案:webpack/r ...
- React + TypeScript + Taro前端开发小结
前言 项目到一段落,先来记录一下,本文以前端新手的角度记录React.TypeScript.Taro相关技术的开发体验以及遇到的问题和解决方法. 之前总说要学React(这篇博客:代码使我头疼之Rea ...
随机推荐
- Secret Milking Machine POJ - 2455 网络流(Dinic算法---广搜判断+深搜增广)+时间优化+二分
题意: 第一行输入N M C ,表示从1到N有M条无向边,现在要从1走到N 走C次完全不同的路径,求最长边的最小值.下面M行是从a点到b点的距离. 建图: 题上说从两点之间可以有多条边,问的是从1~N ...
- 命令行中运行Java字节码文件提示找不到或无法加载主类的问题
测试类在命令行操作,编译通过,运行时,提示 错误: 找不到或无法加载主类 java类 package com.company.schoolExercise; public class test7_3_ ...
- Ribbon负载均衡实现
1,在之前的博文中,我通过eureka,consul,zookeeper 实现了注册中心,在实现的服务发现过程中,都是通过RstTemplate 来实现RPC 远程调用 RestTemplate 封装 ...
- 基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (番外篇)
前言 回顾之前的两篇Swagger做Api接口文档,我们大体上学会了如何在net core3.1的项目基础上,搭建一套自动生产API接口说明文档的框架. 本来在Swagger的基础上,前后端开发人员在 ...
- MetaQNN : 与Google同场竞技,MIT提出基于Q-Learning的神经网络搜索 | ICLR 2017
论文提出MetaQNN,基于Q-Learning的神经网络架构搜索,将优化视觉缩小到单层上,相对于Google Brain的NAS方法着眼与整个网络进行优化,虽然准确率差了2-3%,但搜索过程要简单地 ...
- Light of future-冲刺Day 5
目录 1.SCRUM部分: 每个成员进度 SCRUM 会议的照片 签入记录 代码运行截图 用户浏览界面 订单详情界面 管理员浏览界面 新增后台界面 2.PM 报告: 时间表 燃尽图 任务总量变化曲线 ...
- 使用gulp自动构建项目
网址:https://segmentfault.com/a/1190000011514257
- Centos装机预备技能
装机预备技能 1.1问题 本例要求安装一台可用的KVM服务器: RHEL与Cent ...
- ASP.NET Core中的Controller
ASP.NET CORE出现之前我们实现的Controller,MVC都继承自Controller基类,WebApi的话继承自ApiController.现在ASP.NET CORE把MVC跟WebA ...
- 怎样用scratch2.0谱写音乐
打开scratch2.0将语言切换为简体中文: 如果需要播放特殊的声音,可以用播放声音,找到一些特有的音乐,或者通过录制,将自己的配音或者唱歌录制下来: 可以用弹奏鼓声命令弹奏各种击鼓音乐: 通过控制 ...