Table 表格 官方Table api
先來看一下本次要實作的頁面其中包含:
1、面包屑
2、搜尋元件的封裝(對象生成UI)
3、Table 表格的使用
4、Pagination 分頁的使用
本文隻講UI開發,接口開發後續更新
image
table 的使用有很多形式和方法,可以直接看api。
這塊兒講的是對整個搜尋、table還有分頁的整體封裝,因為上圖的形式應用場景還是很多的,我們将整體封裝成一個元件,一個元件代表一個清單頁,這樣我們就不需要到處引用Antd元件,減少開發過程中重複的工作。
在元件中把搜尋的方法、翻頁的方法都抛出去,做到子元件專心顯示,不關系業務,父元件專心處理業務。
不多廢話直接貼代碼。(因為是公用元件,我們把它放在components檔案夾下)
import React, {Component, Fragment} from 'react';
import {
Card,
Table,
Row,
Pagination,
} from 'antd';
import Search from '../Search/index';
import JumpLink from '../Button/JumpLink';
import styles from './index.less';
/**
* 每個頁面都引用一堆antd元件
* 封裝以後不需要同樣類型的頁面引用同樣的子產品,隻需要在這一個地方引用即可
* 子元件專注顯示,不關心業務,父元件專心處理業務
*
* loading | boolean | 加載loading
* dataSource | array | antd元件Table的 dataSource 資料格式(必傳)
* link | string | 建立按鈕的跳轉連結,不傳不顯示建立
* items | array | 數組對象,搜尋生成頁面的對象 具體參考Search元件說明
* current | int | 分頁顯示第幾頁(必傳)
* total | int | 分頁總共有多少條資料(必傳)
* columns | array | antd元件Table的 columns 資料格式(必傳)
* onSubmit | function| 處理搜尋送出的方法,不傳不顯示搜尋
* pagination | function| 處理翻頁的方法
* bordered | boolean | Card 是否顯示邊框 false表示不顯示邊框,不傳或者傳true 顯示邊框
* linkName | string | 按鈕名字 可不傳,不傳就是"+ 建立"
* scroll | int | 滾動
* rowSelection | object | 選擇清單資料
* onClick | function| 如果按鈕不是跳轉,則自定義方法
* */
export default class ListQuery extends Component {
constructor(props) {
super(props);
}
componentDidMount() {
}
componentWillUnmount() {
}
render() {
const {
loading,
dataSource,
link,
items,
current,
total,
columns,
onSubmit,
pagination,
bordered,
linkName,
scroll,
onClick,
onReset,
rowSelection
} = this.props;
return (
<Card bordered={bordered}>
{
onSubmit && items ? <Search items={items} loading={loading} onSubmit={onSubmit} onReset={onReset}/> :
<Fragment/>
}
{
link || onClick ? <JumpLink style={onSubmit ? styles.newBtn : ''}
type="primary"
onClick={onClick}
name={linkName ? linkName : "+ 建立"}
link={link}/> : <div className={styles.empty}/>
}
<Table loading={loading}
columns={columns}
dataSource={dataSource}
size="middle"
className={styles.businessTable}
rowSelection={rowSelection ? rowSelection : null}
scroll={{x: scroll ? scroll : 800}}
pagination={false}/>
{
current ? <Row type="flex" justify="end" className={styles.paginationBox}>
<Pagination showQuickJumper onChange={pagination} current={current} total={total}/>
</Row> : <Fragment/>
}
</Card>
)
}
}
單獨講一下Table
<Table loading={loading}
columns={columns}
dataSource={dataSource}
pagination={false}/>
loading:一個頁面友好互動的參數,請求資料時顯示loading直到資料加載完成
dataSource:是清單的資料數組
pagination:分頁器,清單元件預設有分頁,一般情況下我們不使用它自帶的
columns:array 類型。通俗的說就是定義表頭,但是其中有好多列的配置項,如下邊的代碼簡單說明常用的項。
{
title:列頭顯示文字
key:react需要的key
dataIndex:列資料在資料項中對應的key,就是我們有一個對象顯示這一行資料
的時候,要顯示哪個參數
width:列寬
render:複雜資料的渲染函數
}
在使用頁面import後
//重置請求清單資料
onReset = () => {
}
//送出查詢方法
onSubmit = (err, value) => {
if (err) {
return;
}
};
//翻頁
pagination = (pageNumber) => {
console.log(pageNumber);
}
render(){
const searchs = [{
type: 'Input',
label: 'ID查詢',
required: false,
placeholder: '請輸入id',
parameter: 'id',
}, {
type: 'Select',
label: '科目查詢',
required: false,
placeholder: '請選擇',
parameter: 'subject',
options: subjectOptions
}];
return (
<PageHeaderLayout
/*title="題庫查詢"
content="PageHeaderLayout"*/
>
<ListQuery items={searchs}
columns={this.columns}
dataSource={dataSource}
current={page_no}
total={total}
loading={loading}
link="/question/create-question"
onSubmit={this.onSubmit}
onReset={this.onReset}
pagination={this.pagination}/>
</PageHeaderLayout>
)
}
裡邊的搜尋元件後續總結(數組生成UI)
PageHeaderLayout是antd pro封裝的元件,他根據我們上章中提到的menu.js 中的menuData自動生成如圖1的面包屑,
我們說一下this.columns,這個是跟antd table元件的要求的固定格式
為了頁面整潔,我們把它單獨放在一個檔案中,
import React from 'react';
import TooltipItem from 'components/TooltipItem';
/***
* 題庫清單
* */
export const questionListColumns = [{
title: "ID",
dataIndex: "question_id",
key: "question_id",
}, {
title: "題幹",
dataIndex: "question_title",
key: "question_title",
render: (text) => <TooltipItem value={text} maxLength={18}/>
}, {
title: "類型",
dataIndex: "question_type",
key: "question_type"
}, {
title: "狀态",
dataIndex: "question_status",
key: "question_status"
}];
接下來我們講一下如果清單有操作怎麼辦,如圖1中我們想檢視這條資料的詳情,或者編輯這條資料,首先我們在構造函數中初始化this.columns,render可以在表格資料中添加react元件,我們來看action方法,
有兩次參數,text是清單這個單元格要顯示的文字,record是操作這條資料的對象,
一般我們需要從record中拿到操作這條資料的id,這樣就可以去請求詳情資料
constructor(props) {
super(props);
this.columns = [
...questionListColumns,
{
title: '操作',
render: this.action
}
];
}
action = (text,record)=>{
return <Fragment>
<a>修改</a>
<Divider type="vertical"/>
<a>詳情</a>
<Divider type="vertical"/>
<a>上架</a>
</Fragment>
}
接下來我們需要說一下分頁這件事兒,先來看代碼
pagination=(pageNumber)=>{
}
<Pagination showQuickJumper onChange={pagination} current={current} total={total}/>
一般情況中上圖的分頁元件就能夠滿足我們的需求,使用非常簡單,頁面引入antd元件,我們這裡隻是說一下基本的四個參數、
current:表示目前顯示第幾頁,這個是一個非常重要的參數
total:表示一共有多少條資料(會根據pageSize自動分頁)
pageSize:每頁顯示的條數(預設是10條)
onChange:是我們點選翻頁時的方法,我們可以在方法中具體實作翻頁操作,它有一個參數,就是要跳到的頁碼
這樣我們好像就能寫一個清單頁喽