react 表格​​怎麼增加

藏色散人
發布: 2023-01-05 10:25:17
原創
1810 人瀏覽過

react表格增加的實作方法:1、在一個Table.jsx檔案中建立兩個class元件;2、在兩個元件外面定義變數;3、建立點擊新增的事件方法程式碼為「 handleAdd = () => { const { data, editingKey } = this.state;let newData = data;...」即可。

react 表格​​怎麼增加

本教學操作環境:Windows10系統、react18.0.0版、Dell G3電腦。

react 表格​​怎麼增加?

React antd動態增加Table可編輯行

根據antd官網的可編輯表格範例來實現,新增的可編輯的儲存格為子元件,由Table引入。對於原理理解有限,歡迎探討。

以專案中的活動日程元件的新增日程資訊為例

由於先前編輯文章的時候經驗不足,易讀性太低了,重新編輯一下

實作過程

首先,在一個Table.jsx檔中建立了兩個class元件(這裡使用hook寫法直接用const也可),一個子元件EditableCell,父元件Schedule,子元件主要是來設定可編輯的form元素的。

1、在兩個元件外面先定義變量,功能實作使用的是React.createContext()方法。
const EditableContext = React.createContext();


2、先上可編輯單元格子元件程式碼react 表格​​怎麼增加

//子组件class EditableCell extends React.Component {
    getInput = () => {
        const { inputType } = this.props;
        let i = 1
        if (inputType === 'rq') { //可根据不同的inputType来显示不同Form元素,inputType来源于父组件
            return <datepicker></datepicker>;
        }else {
            return <input>
        }
    };
    renderCell = ({ getFieldDecorator }) => {
        const {
            editing,
            dataIndex,
            title,
            record,
            children,
            ...restProps        } = this.props;
        // console.log(record)
        return (
            <td>
                {editing ? ( //editing使用父组件传过来的值,判断是否为编辑状态
                    <formitem>
                        {getFieldDecorator(dataIndex, {
                            rules: [{
                                required: dataIndex === 'bz' || dataIndex === 'id' ? false : true,
                                message: `请输入!`,
                            },
                            ],
                            // initialValue: dataIndex  &&  record[dataIndex] ,
                            initialValue: dataIndex && dataIndex === 'rq' ? (record[dataIndex] ? moment(record[dataIndex]) : null) : record[dataIndex]
                        })(this.getInput())}
                    </formitem>
                ) : (
                        children                    )}
            </td>
        );
    };
    render() {
        return <editablecontext.consumer>{this.renderCell}</editablecontext.consumer>;
    }}
登入後複製
3、父元件Schedule部分的程式碼
class Schedule extends Component {
	state = {
       data: [],
       editingKey: '',
       dataSource: {}, 
    }//Table渲染的columns,这里只写出三列举例子,在render方法内会重组该数组
	columns = [
	    {
	        className: "columnHead",
	        title: '序号',
	        dataIndex: 'id',
	        key: 'id',
	        width: 60,
	        align: 'center',
	        render: (text, row, index) => <span>{index + 1}</span>
	    },
	    {
	        className: "columnHead",
	        title: '日期',
	        dataIndex: 'rq',
	        key: 'rq',
	        align: 'center',
	        width:100,
	        editable: true,//editable: true是必须加的,哪一列需要编辑就加在哪列
	    },
	    {
	        className: "columnHead",
	        title: '从何地至何地',
	        dataIndex: 'hdzhd',
	        key: 'hdzhd',
	        align: 'center',
	        width:120,
	        editable: true,
	    },
	    {   //该列为操作列,包含编辑、删除、取消、保存按钮,下面代码中的每个方法都在此处定义
			className: "columnHead",
			title: '操作',
			align: 'center',
			render: (text, record) => {
				const { editingKey } = this.state;
				const editable = this.isEditing(record);
				return editable ? (
					<span>
						<popconfirm> this.cancel(record.id)}> //添加了二次确实提醒
							<a>取消</a>
						</popconfirm>
						<divider></divider>
						<editablecontext.consumer>  //保存按钮要用EditableContext包起来
							{(form) => (
								 <a> this.save(form, record.id, record)} style={{ marginRight: 8 }} >保存</a>
							 )}
						 </editablecontext.consumer>
		
					 </span>
				 ) : (
					 <span>
						 <a> this.edit(record.id)}>编辑</a>
						 <divider></divider>
						 <popconfirm> this.delete(record.id)}>
							 <a>删除</a>
						 </popconfirm>
					 </span>
					 );
			}
		}
	]
	render(){
		const components = { //在此处引入可编辑的单元格子组件
			body: {
				cell: EditableCell,
			},
		};
		//重新处理了一下Table的columns
		const columns = this.columns.map((col) => {
			if (!col.editable) {
				return col;
			}
			return {
				...col,
				//此处的数据会传给子组件
				onCell: (record) => ({
					record,
					inputType: col.dataIndex,
					dataIndex: col.dataIndex,
					title: col.title,
					editing: this.isEditing(record),
				}),
			};
		});
		return(
			<editablecontext.provider>
				<table> record.id}
				   dataSource={data}
				   columns={columns}
				   scroll={{ x: "calc(620px + 10%)", y: WinHeight - 580 }}
				   pagination={false}
				   footer={() => <button>+ 新增</button>}
				/>
			
		)
	}}<a id="5_172">以上的程式碼就是頁面內最開始簡單展示的程式碼了</a><p><br>4、開始預設資料為空,點選新增按鈕會增加一行可編輯行<br><img src="https://img.php.cn/upload/article/000/000/020/d39f7cf75669cd333d492e46f4315d12-1.png" alt="react 表格​​怎麼增加">圖1</p>
<p></p>
<p></p>
<p>5、點選新增的事件方法代碼<br></p>
<pre class="brush:php;toolbar:false">handleAdd = () => { //该方法在Table标签内的footer内定义
	const { data, editingKey } = this.state;
	let newData = data;
	const id = new Date().toString();
	if (newData.length === 0) {
		newData.push({
			id,
			rq: '',
			hdzhd: '',
			gzdd: '',
			nfwdwfdw: '',
			gznr: '',
			bz: ''
		})
	} else {
		if (editingKey !== '') {  //如果上一条还处于编辑状态,不可新增
			message.error('请先保存');
			return;
		}
		const row = {
			id,
			rq: '',
			hdzhd: '',
			gzdd: '',
			nfwdwfdw: '',
			gznr: '',
			bz: ''
		};
		newData.splice(data.length, 1, row);
	}
	this.setState({ data: newData, editingKey: id });};
登入後複製

點選新增後的效果react 表格​​怎麼增加圖2
此時操作列的兩個操作為「取消」、「儲存」

圖2中所展示的可編輯的一整行單元格為開頭提到的單元格子元件

如果必填項目沒有輸入內容,點選儲存會觸發Form表單必填項目的提示訊息。

圖3



react 表格​​怎麼增加

如果上一條的資訊沒有編輯完,再點選新增時,會提示要求先儲存上一條

#儲存作業的程式碼

save(form, key, record) {
	const { wsCgtzPjxx, data } = this.state;
	form.validateFields((error, row) => {
		if (error) {
			return;
		}
		const { data } = this.state;
		const newData = [...data];
		row.rq = moment(row.rq).format('YYYY-MM-DD') //如果有日期选择框,要用format转一下
		let dataobj = { //接口请求参数,只写了几个
			rq: row.rq,
			hdzhd: row.hdzhd,
			gzdd: row.gzdd,
		}
		const index = newData.findIndex((item) => key === item.id);
		if (index > -1) {
			const item = newData[index];
			newData.splice(index, 1, {
				...item,
				...row,
			});
			http.post('单条数据保存接口调用').then(res => {
				if (res.code === 200) {
					this.initData();//保存后重新获取了一下表格数据
				}
			})
			this.setState({ data: newData, editingKey: '' });
		} else {
			newData.push(row);
			http.post(调用接口, dataobj).then(res => {
				if (res.code === 200) {
					this.initData()
				}
			})
			this.setState({ data: newData, editingKey: '' });
		}
	});}
登入後複製
圖3狀態下的取消事件程式碼

cancel = (key) => {
	if (this.state.isedit) {
		this.setState({ editingKey: '' });
	} else {
		if (key.length > 6) {
			const { data } = this.state;
			const newData = data;
			newData.splice(data.length - 1, 1);
			this.setState({ data: newData, editingKey: key });
		}
		this.setState({ editingKey: '' });
	}};
登入後複製
資料儲存之後Table表格展示為圖4 圖4 此時操作列的兩個操作為「編輯」、「刪除」編輯操作的程式碼
edit = (key) => {
	this.setState({ editingKey: key, isedit: true });//让单元格变为编辑状态};
登入後複製

刪除操作的程式碼

delete = (key) => {
	const { data } = this.state;
	const newData = data;
	const index = newData.findIndex((item) => key === item.id);
	http.get('调用删除接口', { id: key }).then(res => {
		this.initData()
	})
	newData.splice(index, 1);
	this.setState({ data: newData, editingKey: '' });};
登入後複製

有不足,待補充。

##################根據antd官網的可編輯表格範例來實現,新增的可編輯的儲存格為子元件,由Table引入。對於原理理解有限,歡迎探討。 ######推薦學習:《###react影片教學###》###

以上是react 表格​​怎麼增加的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板