1. 程式人生 > 其它 >React-Antd Pro增刪改查

React-Antd Pro增刪改查

基礎功能無非是增刪改查,用於熟悉路由,元件,傳值等Antd Pro的常用功能 上文介紹了Antd Pro的基礎搭建,再此基礎上進行實踐 Antd Pro預設版本V5 一.選單 首先配置左側選單列表,資料夾config》config.ts中找到routes: 新增如下內容:
{
      path:'/myapp',
      name:'我的應用',
      icon:'AppstoreFilled', 
      routes:[
        {
          name:'應用列表',
          path:'./user/manage', 
          component:'./user/manage'
        }  
      ],
 }

結果下圖所示:

二.模組 找到資料夾pages
,建立資料夾user,再建立資料夾manage。 然後配置頁面,請求,資料模型等。 最後結構如下圖所示: components:用於放置頁面常用的元件 data.d.ts:用到的資料模型 index.tsx:模組的主頁面 service.ts:封裝了用到的Api請求函式 這種結構的細分對後期專案維護非常友好,缺點是前期開發速度受影響 (1)準備工作 1.1 封裝資料模型data.d.ts
 1 export type TableListItem = {
 2     id: string;
 3     rolename: string;
 4     account: string
; 5 username: string; 6 }; 7 export type TableListPagination = { 8 total: number; 9 pageSize: number; 10 current: number; 11 };
1.2 封裝用到的API請求 在Antd Pro中是通過Mock實現,本篇用.net core Api進行替換,後端程式碼在下文附件中下載
 1 // @ts-ignore
 2 /* eslint-disable */
 3 import { request } from 'umi';
4 import { TableListItem } from './data'; 5 6 /** 獲取列表 */ 7 export async function rule( 8 params: { 9 // query 10 /** 當前的頁碼 */ 11 current?: number; 12 /** 頁面的容量 */ 13 pageSize?: number; 14 }, 15 options?: { [key: string]: any }, 16 ) { 17 return request<{ 18 data: TableListItem[]; 19 /** 列表的內容總數 */ 20 total?: number; 21 success?: boolean; 22 }>('http://localhost:4089/User', { 23 method: 'GET', 24 params: { 25 ...params, 26 }, 27 ...(options || {}), 28 }); 29 } 30 31 /** 更新 */ 32 export async function updateRule(data: { [key: string]: any }, options?: { [key: string]: any }) { 33 return request<TableListItem>('http://localhost:4089/User/Update', { 34 data, 35 method: 'PUT', 36 ...(options || {}), 37 }); 38 } 39 40 /** 新建 */ 41 export async function addRule(data: { [key: string]: any }, options?: { [key: string]: any }) { 42 return request<TableListItem>('http://localhost:4089/User/Add', { 43 data, 44 method: 'POST', 45 ...(options || {}), 46 }); 47 } 48 49 /** 刪除 */ 50 export async function removeRule(data: { key: string[] }, options?: { key: string[] }) { 51 return request<Record<string,string[]>>('http://localhost:4089/User', { 52 data, 53 method: 'DELETE', 54 ...(options || {}), 55 }); 56 }

(2)列表 index.tsx

實現效果如下:

程式碼如下:

  1 import { PlusOutlined } from '@ant-design/icons';
  2 import { Button, message  } from 'antd';
  3 import React, { useState } from 'react';
  4 import { PageContainer, FooterToolbar } from '@ant-design/pro-layout';
  5 import type { ProColumns } from '@ant-design/pro-table';
  6 import ProTable from '@ant-design/pro-table'; 
  7 import { rule, addRule,updateRule,removeRule } from './service';
  8 import type { TableListItem, TableListPagination } from './data';import  CreateForm   from './components/CreateForm';
  9 import  UpdateForm   from './components/UpdateForm';
 10  
 11 
 12 const handleRemove = async (selectedRows: TableListItem[]) => {
 13   const hide = message.loading('正在刪除');
 14   if (!selectedRows) return true;
 15   console.log( selectedRows);
 16   console.log( selectedRows.map((row) => row.id));
 17   try {
 18     await removeRule({
 19       key: selectedRows.map((row) => row.id),
 20     });
 21     hide();
 22     message.success('刪除成功,即將重新整理');
 23     return true;
 24   } catch (error) {
 25     hide();
 26     message.error('刪除失敗,請重試');
 27     return false;
 28   }
 29 };
 30 
 31 const TableList: React.FC = () => { 
 32   const [visible, setVisible] = useState<boolean>(false);
 33   const [current, setCurrent] = useState<Partial<TableListItem> | undefined>(undefined); 
 34   const [updvisible, setUpdvisible] = useState<boolean>(false);
 35   const handleSubmit = (values: TableListItem) => 
 36   {
 37     addRule({ ...values });    
 38     message.success('新增成功'); 
 39     setVisible(false);
 40   };
 41   const handleUpdSubmit = (values: TableListItem) => 
 42   {
 43     updateRule({ ...values });    
 44     message.success('修改成功'); 
 45     setUpdvisible(false);
 46   }; 
 47    
 48   const [selectedRowsState, setSelectedRows] = useState<TableListItem[]>([]);
 49   
 50   const columns: ProColumns<TableListItem>[] = [
 51     {
 52       title: 'id',
 53       dataIndex: 'id', 
 54       valueType: 'textarea',
 55       hideInForm: true,
 56       hideInTable: true
 57     },
 58     {
 59       title: '角色名稱',
 60       dataIndex: 'rolename', 
 61       valueType: 'textarea',
 62     },
 63     {
 64       title: '使用者名稱',
 65       dataIndex: 'username',
 66       valueType: 'textarea',
 67     },
 68     {
 69       title: '賬號',
 70       dataIndex: 'account',
 71       valueType: 'textarea',
 72     },
 73     {
 74       title: '操作',
 75       dataIndex: 'option',
 76       valueType: 'option',
 77       render: (_, record) => [
 78         <a
 79           key="Id"
 80           onClick={(e) => {
 81             e.preventDefault();
 82             setUpdvisible(true); 
 83             setCurrent(record); 
 84           }}
 85         >
 86           修改
 87         </a> 
 88       ],
 89     },
 90   ];
 91 
 92   return (
 93     <PageContainer>
 94       <ProTable<TableListItem, TableListPagination>
 95         headerTitle="查詢表格" 
 96         rowKey="id"
 97         search={{
 98           labelWidth: 120,
 99         }}
100         toolBarRender={( ) => [
101           <Button
102             type="primary"
103             key="primary"
104             onClick={() => {
105               setVisible(true); 
106             }}
107           >
108             <PlusOutlined /> 
109             新建
110           </Button> 
111       ]}
112         request={rule}
113         columns={columns}
114         rowSelection={{
115           onChange: (_, selectedRows) => {
116             console.log("選擇開始:"+selectedRows.length);
117             setSelectedRows(selectedRows);
118           },
119         }}
120       />
121       {selectedRowsState?.length > 0 && (
122         <FooterToolbar
123           extra={
124             <div>
125               已選擇{' '}
126               <a
127                 style={{
128                   fontWeight: 600,
129                 }}
130               >
131                 {selectedRowsState.length}
132               </a>{' '}
133               項 &nbsp;&nbsp;
134             
135             </div>
136           }
137         >
138           <Button
139             onClick={async () => {
140                
141               await handleRemove(selectedRowsState);
142               setSelectedRows([]);
143           
144             }}
145           >
146             批量刪除
147           </Button>
148         
149         </FooterToolbar>
150       )} 
151       <CreateForm
152         done={true}
153         visible={visible}
154         current={current} 
155         onSubmit={handleSubmit}
156         onVisibleChange={setVisible}
157       />
158       <UpdateForm
159         done={true}
160         updvisible={updvisible}
161         current={current} 
162         onSubmit={handleUpdSubmit}
163         onVisibleChange={setUpdvisible}
164       />
165        
166     </PageContainer>
167   );
168 };
169 
170 export default TableList;
View Code

ProTable:表格元件,具體使用參考:https://procomponents.ant.design/components/table/

ProColumns:表格列,注意dataIndex屬性對應的大小寫問題

request={rule}: rule對應到data.d.ts中的列表Api 後端模擬了一些資料用於顯示: 其中的CreateForm和UpdateForm在下一步會介紹 (3)新增和修改 新增和修改用彈窗的形式顯示,彈窗元件ModalForm,可以參考https://procomponents.ant.design/components/modal-form 在Antd Pro中彈窗的關閉和顯示 通過其屬性visible控制。需要注意的是,要配置引數屬性onVisibleChange,否則可能會有彈窗無法關閉的問題 3.1 新增頁面 實現效果:

程式碼如下:

 1 import type {FC} from 'react';
 2 import {
 3     ModalForm, 
 4     ProFormText 
 5   } from '@ant-design/pro-form';
 6 import type {TableListItem} from '../data.d' 
 7 type CreateFormProps={
 8     done: boolean;
 9     visible: boolean;
10     current: Partial<TableListItem>| undefined; 
11     onSubmit: (values: TableListItem) => void;
12     onVisibleChange?: (b: boolean) => void;
13 }
14 
15 const CreateForm: FC<CreateFormProps>=(props)=>{
16     const{done,visible,current,onSubmit,onVisibleChange}=props;
17     if(!visible){
18         return null;
19     }
20     return (
21         <ModalForm<TableListItem>
22             visible={visible}
23             title={'新增'} 
24             width={640}
25             onFinish={async (values)=>{
26                 onSubmit(values)
27             }}
28             onVisibleChange={onVisibleChange}
29             initialValues={current}
30             modalProps={{
31                 onCancel: () => {return true;},
32             destroyOnClose:true,
33             bodyStyle:done?{padding:'72px o'}:{}
34             }}
35             >
36              { 
37                 <>
38                 <ProFormText 
39                   name="rolename"
40                   label="角色名稱"
41                   placeholder="請輸入"
42                   />
43                   <ProFormText 
44                   name="account"
45                   label="賬號名稱"
46                   placeholder="請輸入"/> 
47                     <ProFormText 
48                     name="username"
49                     label="使用者名稱稱"
50                     placeholder="請輸入"/>
51                     </>
52               }
53                
54              
55             </ModalForm>
56     );
57 };
58 export default CreateForm;
View Code

點選"確定",觸發”onFinish“,呼叫父元件傳來的方法handleSubmit提交資料,引數values拿到需要提交的能對映到data.d.ts中的TableListItem模型資料

3.2 修改頁面 實現效果: 程式碼如下:
 1 import type {FC} from 'react';
 2 import {
 3     ModalForm, 
 4     ProFormText 
 5   } from '@ant-design/pro-form';
 6 import type {TableListItem} from '../data.d' 
 7 type UpdateFormProps={
 8     done: boolean;
 9     updvisible: boolean;
10     current: Partial<TableListItem>| undefined; 
11     onSubmit: (values: TableListItem) => void;
12     onVisibleChange?: (b: boolean) => void;
13 
14 }
15 
16 const UpdateForm: FC<UpdateFormProps>=(props)=>{
17     const{done,updvisible,current,onSubmit,onVisibleChange}=props;
18     if(!updvisible){
19         return null;
20     }
21     return (
22         <ModalForm<TableListItem>
23             visible={updvisible}
24             title={'修改'} 
25             width={640}
26             onFinish={async (values)=>{
27                 onSubmit(values)
28             }}
29             onVisibleChange={onVisibleChange}
30             initialValues={current}
31             modalProps={{
32             destroyOnClose:true,
33             bodyStyle:done?{padding:'72px o'}:{}
34             }}
35             >
36              { 
37                 <>
38                 <ProFormText 
39                   name="rolename"
40                   label="角色名稱"
41                   placeholder="請輸入"
42                   />
43                   <ProFormText 
44                   name="account"
45                   label="賬號名稱"
46                   placeholder="請輸入"/> 
47                     <ProFormText 
48                     name="username"
49                     label="使用者名稱稱"
50                     placeholder="請輸入"/>
51                     </>
52               }
53                
54              
55             </ModalForm>
56     );
57 };
58 export default UpdateForm;
View Code

修改和新增功能類似,多了資料顯示的功能,選擇後的資料通過current儲存

最後提交至updateform元件的current屬性

(4)刪除

主要是針對批量刪除,在表格中配置rowSelection,監聽和記錄選中的項 刪除介面的傳參是Request Payload,後端接收引數的是字典型別,後面還需優化

Dictionary<string,string[]>接收待刪除項

三.總結 以上簡單記錄了下基於Antd Pro的增刪改查功能,涉及到React一些基礎知識,比如建立元件,Hook的一些使用, 涉及到了ES6的一些常用函式map,set,async,Promise等, 最主要是Pro中6個基於Antd開發的模板元件,ProLayout,ProTable,ProForm,ProCard,ProDescriptions,ProSkeleton 以上僅用於學習和總結!