這次的需求是列表頁可以按照時間進行升降序的排列(直接請求后端)及列篩選,如圖:
在打開頁面時,我們要首先請求接口,獲取缺卡類型的篩選數據,然后把數據拼成正確的格式賦給table的column:
// 獲取缺卡類型和缺卡狀態的篩選菜單數據 getTypeListAll = () => { const { dispatch } = this.props; const param = { dictCode: 'lackStatus' }; const param2 = { dictCode: 'lackType' }; dispatch({ type: 'abnormalRank/fetchTypeList', payload: param, callback: () => { dispatch({ type: 'abnormalRank/fetchLackTypeList', payload: param2, callback: () => { this.setfilters(); } }); } }); }; // 類型/狀態-加入表格的篩選,並將最新的column存入state setfilters = () => { const { abnormalRank: { typeList, lackTypeList } } = this.props; const column = [ { title: '工號', dataIndex: 'userNo', key: 'userNo' }, { title: '姓名', dataIndex: 'userName', key: 'userName' }, { title: '部門', dataIndex: 'departName', key: 'departName' }, { title: '缺卡類型', dataIndex: 'typeNick', key: 'typeNick', filters: [] }, { title: '缺卡時間', dataIndex: 'lackTime', key: 'lackTime', render: (text, record) => { return <span>{record.lackTime}</span>; }, sorter: () => {} }, { title: '狀態', dataIndex: 'status', key: 'status', filters: [] }, { title: '補卡時間', dataIndex: 'reissueTime', key: 'reissueTime', render: (text, record) => { return <span>{record.reissueTime}</span>; }, sorter: () => {} }, { title: '相關流程', dataIndex: 'applicationNo', key: 'applicationNo', render: (text, record) => { return ( <a onClick={() => router.push( `/xxx?abnormalId=${record.userNo}` ) } > {record.applicationNo} </a> ); } }, { title: '操作', dataIndex: 'action', key: 'action', render: (text, record) => { return ( <div> <span> <Link to={{ pathname: '/xxxx', query: { id: record.employeeId, name: record.employeeName, signDate: record.signDate } }} > 打卡記錄 </Link> </span> <a onClick={() => this.seeDetail(record)}>補卡</a> </div> ); } } ]; const lackStatus = []; const lackType = []; for (let index = 0; index < typeList.length; index += 1) { const list = { text: typeList[index].dictName, value: typeList[index].dictKey }; lackStatus.push(list); } for (let index = 0; index < lackTypeList.length; index += 1) { const list = { text: lackTypeList[index].dictName, value: lackTypeList[index].dictKey }; lackType.push(list); } column[3].filters = lackType; column[5].filters = lackStatus; this.setState({ columns: column }); };
可以注意到代碼中的兩個時間的列加了一個空的sorter:
而table的onChange事件里有sorter和filters兩個參數【可以參考文檔】,jsx代碼:
render() { const { loading, dispatch, abnormalRank, form } = this.props; const { missData, pagination } = abnormalRank; const { columns } = this.state; const { locale } = new Locale('stat.overtime'); return ( <Fragment> <Form layout="inline" onSubmit={this.handleSubmit}> <Card bordered={false} title="缺卡記錄" extra={ <Fragment> <Button type="primary" htmlType="submit"> {locale('form.search', false)} </Button> </Fragment> } > <Row type="flex" className="searchTitle"> <Col> <QuickForm form={form} config={getPath(this.props, 'config')} /> </Col> </Row> </Card> </Form> <Card bordered={false} style={{ marginTop: '24px' }}> <Table dataSource={missData} columns={columns} loading={loading} rowKey="id" onChange={this.changeTable} pagination={{ ...pagination, showTotal: total => ( <TablePagination itemsName={Locale.set('items')} total={total} pageSize={pagination.pageSize} onChange={async pageSize => { await dispatch({ type: 'abnormalRank/setPagination', pagination: { ...pagination, pageSize, current: 1 } }); this.fetchList(); }} /> ) }} /> </Card> </Fragment> ); }
在事件中可以進行類型、狀態、以及排序的參數的存儲,再通過調用接口請求數據:
changeTable = async (pagination, filters, sorter) => {
// orderBy用來拼接 ‘排序根據詞+空格+升序/降序’ 的字符串,用來傳給后端,由后端進行數據的整理 let orderBy; let sorterField; if (sorter && sorter.field) { if (sorter.field === 'lackTime') { sorterField = 'lack_time'; } if (sorter.field === 'reissueTime') { sorterField = 'reissue_time'; } const order = sorter.order.trim().split('end')[0]; orderBy = `${sorterField} ${order}`; this.setState({ orderByField: orderBy }); } else { this.setState({ orderByField: '' }); } const { dispatch, abnormalRank: { pagination: curPagination } } = this.props; await dispatch({ type: 'abnormalRank/setPagination', pagination: { ...curPagination, current: pagination.current } }); this.setState( { lackStatus: filters.status, lackType: filters.typeNick }, () => { this.fetchList(); } ); };
請求其他部分代碼:
constructor(props) { super(props); this.state = { lackStatus: [], lackType: [], columns: [], orderByField: '' }; } componentDidMount() { this.getTypeListAll(); this.fetchList(); } // 獲取列表 fetchList = () => { const { dispatch, abnormalRank: { pagination }, form } = this.props; const { getFieldsValue } = form; const { companyDepart, date, userName } = getFieldsValue(); const parame = { companyId: companyDepart.companyId, startTime: date.range[0].format('YYYY-MM-DD'), endTime: date.range[1].format('YYYY-MM-DD'), employeeName: userName || '', pageNo: pagination.current, pageSize: pagination.pageSize, orderByField: getPath(this.state, 'orderByField', ''), lackStatus: getPath(this.state, 'lackStatus', []), lackType: getPath(this.state, 'lackType', []) }; dispatch({ type: 'abnormalRank/fetchMylack', payload: parame }); };
補充:有一個列表頁需要從其他頁面跳轉,需要攜帶查詢參數,包括了類型,因此做一些補充:
setfilters這個方法里添加類型的初始化:這里用到了antd表格篩選的一個屬性:filteredValue

因為加入初始化設置后,在刷新頁面時,column的渲染依舊會走這個初始化設置,會導致頁面選中篩選項進行查詢后,渲染出來的表頭沒有加入篩選的選中狀態與選中項,所以我們在table的changeTable事件里需要補充:
重新處理column的filteredValue屬性即可。