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 ...
随机推荐
- PyTorch专栏(二)
专栏目录: 第一章:PyTorch之简介与下载 PyTorch简介 PyTorch环境搭建 第二章:PyTorch之60min入门 PyTorch 入门 PyTorch 自动微分 PyTorch 神经 ...
- ios 13 陀螺仪DeviceOrientationEvent需要申请用户权限
有些代码跑着跑着就报错了,有些陀螺仪用着用着就不能用了. 目前时间是2020.4.4,发现 ios 13系统调用陀螺仪 需要申请用户权限(这应该是个趋势,后面安卓应该陆续跟进).具体实现来看下: 1 ...
- ES6全面讲解
写在之前.讲解了比较常用的ES6知识点,可以快速的入门.有两个比较复杂的知识点(promise,generator)则是留在了其他文章中,在里面详细讲解. 介绍 1.历史 1.ECMAScript ...
- 用c#求一元二次方程
题目:编一个程序,输入a .b.c 的值,求出一元二次方程a*x*x+b*x+c=0的二个实数根. 我的思路: 我们都知道数学中求一元二次方程有很多方法:直接开方法.配方法.公式法.分解因式法等等,在 ...
- 51单片机内存条(64K)
51单片机内存条扩展(64K) 设计时间:2015年 实现功能:51单片机SRAM扩展 51单片机64K内存条
- 本地Vue项目跨域请求本地Node.js服务器的配置方法
前言:跨域请求是在本地开发时经常遇到的需求,也很简单,只是几句代码配置一下的问题.我初次配置跨域请求时由于官方的说明太简洁,找到的教程又落伍,调试了一番并没有解决问题,到最后解决问题,已花费了很多时间 ...
- 曹工说Redis源码(3)-- redis server 启动过程完整解析(中)
文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读.由于 ...
- 一起了解 .Net Foundation 项目 No.23
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. WorldWide Tel ...
- 混合app禁止切换输入法英文键盘方案
前言 在此介绍的是h5的部分,非原生,原生可以直接属性禁止. 需求 禁止中文出现在input中.(如果你认为不显示出来中文,那么请往下看) 效果:只显示英文键盘. 遇到的问题 1.在三星低版本上会出现 ...
- readthedocs网托管持多语言文档
希望在readthedocs上创建支持多语言的文档,效果类似: 通过语言选项,可以切到到不同的语言版本:实现这个目标包含两个主要步骤: 在本地对文档进行翻译 在readthedocs.org上配置翻译 ...