# useTable
**Repository Path**: kevin95271/use-table
## Basic Information
- **Project Name**: useTable
- **Description**: react+antd 自定义useTable:轻松处理【搜索、排序、表格、分页】
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2024-05-02
- **Last Updated**: 2024-05-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# useTable:轻松处理【搜索、排序、表格、分页】
## 介绍
1. 本插件基于[React](https://react.docschina.org/)和[Ant Design](https://ant.design/index-cn),只能用于React + Antd的列表页
2. 本插件支持多项自定义配置
3. 本插件主要用于列表页中的搜索、排序、表格、分页等功能,能处理典型的列表页

## 使用方式
### 安装
```js
npm i react-use-table
```
### 引入
#### 全局配置
```js
// src/hooks/use-table.js
import useTable from 'react-use-table'
import { axios } from '@/common'
export default (params = {}) => {
return useTable({
axios: axios, // 自己的axios实例
url: params.url, // 接口
queryParams: {// 查询参数
...params.queryParams // 实际调用时可以修改全局配置
},
customConfig: {// 自定义全局配置
qsStringify: true,
showSizeChanger: true,
totalRowsName: 'total',
responseCurPageName: 'currentPage',
...params.customConfig
}
})
}
```
***配置会以一个优先顺序进行合并***。这个顺序是:在 `lib/bundle.js` 找到的库的默认值,然后是实例的 `全局` 配置,最后是`局部`配置 。***后者将优先于前者***。
#### 局部调用
```js
import useTable from '@hooks/use-table'
const { dataList, loading, pagination, searchData, setSearchData } = useTable({
url: '/customer/balance/list.json',
customConfig: {
showSizeChanger: true // 这里的showSizeChanger会覆盖全局的showSizeChanger
}
})
```
### 基本使用示例
```jsx
// index.jsx
import React from 'react'
import { observer } from 'mobx-react-lite'
import SearchForm from './module/SearchForm'
import List from './module/List'
import useTable from '@hooks/use-table.js'
export default observer(() => {
const { dataList, loading, pagination, searchData, setSearchData } = useTable({
url: '/customer/balance/list.json',
queryParams: {
status: 1 // 配置初始默认查询参数
},
customConfig: {
pageSize: 5
}
})
return (
<>
>
)
})
```
#### 搜索区域
```js
// SearchForm
// 搜索
const handleSearch = (data) => {
// data为接口入参
setSearchData(data, { current: 1 })
}
// 重置
const handleClear = () => {
form.resetFields()
// 重置的时候不要忘记初始默认查询参数
setSearchData({ status: 1 }, { current: 1 })
}
```
#### 列表区域
```jsx
// List
// useTable内部处理了`loading、dataList、pagination`
#### 多字段排序
```js
const columns = [
{
title: '手机号',
dataIndex: 'tel',
sorter: {
multiple: 1 // 值即为当前排序字段权重
}
},
{
title: '待提现',
dataIndex: 'availableBalance',
sorter: {
multiple: 2 // 值即为当前排序字段权重
}
}
]
```
***排序入参***

### 切换Tab示例
```js
// 切换tabconst changeTabs = (tabKey) => { // tab变化只影响入参的一个字段,将searchData作为原参数传入,然后修改该参数值 setSearchData({ ...searchData, status: tabKey }, { current: 1 })}
```
#### 切换Tab时调用不同接口
```js
// 切换tab,并且处理接口const changeTabs = (tabkey) => { let url if (key === 'grabHistory') { url = '/agent/schedule/grabhistory.json' } else { url = '/agent/schedule/joblist.json' } setSearchData({ ...searchData, status: tabKey }, { current: 1 }, { url }) // 这里来动态配置当前调用的接口
```
### 获取接口返回data数据示例
```js
// responseData即为接口返回的data数据
const { dataList, loading, pagination, searchData, setSearchData, responseData } = useTable({
url: '/customer/balance/list.json'
})
```
### 自定义接口返回数据字段、结构
组件默认的接口返回去数据结构和字段如下
```json
{
data: {
curPage: 0,
dataList: [],
pageSize: 15,
totalRows: 56
},
flag: 1
}
```
但是你的接口返回的数据结构和字段比不是这样,组件提供两种方式解决
#### 结构相同,字段不一致
比如你的接口返回数据结构是:
```json
{
dataObj: {
currentPage: 0,
list: [],
pageSize: 15,
totalNumber: 56
},
code: 200
}
```
这些字段要改为插件需要的字段,可以通过以下方法配置:
```jsx
useTable({
customConfig: {// 自定义全局配置,
flagKeyName: 'code',
flagValue: 200,
responseDataKeyName: 'dataObj',
responseCurrentPageName: 'currentPage',
totalRowsKeyName: 'totalNumber',
listKeyName: 'list'
}
})
```
#### 结构不同
比如你的接口返回数据结构如下,要转换为组件需要的数据结构和字段
```json
{
code: 200,
message: 'OK',
list: [],
totalNumber: 100,
current: 1
}
```
通过`responseDataFormat`修改
```jsx
useTable({
customConfig: {
responseDataFormat: (resData) => {
return {
flag: res.code === 200 ? 1 : 0,
data: {
totalRows: res.totalNumber,
dataList: res.list,
curPage: res.current
}
}
}
}
})
```
### 同时调用多个useTable示例
```js
const { dataList, loading, pagination, searchData, setSearchData, onChange, responseData } = useTable({
url: 'userc/getlist.json'
})
// 返回值使用别名就好了😘
const { dataList: dataList2, loading: loading2, pagination: pagination2, pagination: pagination2, setSearchData: setSearchData2, onChange: onChange2, responseData: responseData2 } = useTable({
url: 'userc/getdetail.json'
})
```
### 完整示例
```jsx
// index.jsx
// ------------------外部资源
import React, { useEffect, useContext } from 'react'
import { observer } from 'mobx-react-lite'
import { Alert } from 'antd'
import useTable from '@hooks/use-table'
import Store from './store'
import SearchForm from './module/SearchForm'
import List from './module/List'
export default observer(() => {
const store = useContext(Store)
useEffect(() => {
return () => {
store.setStore({
tabKey: '1'
})
}
}, [])
const { dataList, loading, pagination, searchData, setSearchData, onChange, responseData } = useTable({
url: '/userc/assetlist.json',
queryParams: { tabKey: store.tabKey, status: 1 },
customConfig: {
pageSize: 5
}
})
return (
<>