react中useState使用:如何實現(xiàn)在當(dāng)前表格直接更改數(shù)據(jù)
如何實現(xiàn)在當(dāng)前表格直接更改數(shù)據(jù)
需求
用戶點擊修改按鈕時直接在彈出框的當(dāng)前頁面內(nèi)直接再次修改點擊行相關(guān)信息:
效果如下
點擊修改當(dāng)事人信息時,直接將當(dāng)前改為輸入框,并將信息展示,同時操作欄內(nèi)的內(nèi)容變?yōu)楸4婧腿∠?
具體做法
我這里是使用的antd組件內(nèi)的可編輯表格;當(dāng)然原生的也可以做,以前也做過;
這里的關(guān)鍵是點擊修改按鈕時,令當(dāng)前行的表格變?yōu)檩斎肟?,并展示?shù)據(jù);
給數(shù)據(jù)每一項加上 editable: true屬性,并通過該屬性控制 渲染的是數(shù)據(jù)還是可修改的輸入框
這里是使用的useState()方法來進行狀態(tài)控制的;
- 關(guān)于 useState 的用法是,需要傳入一個參數(shù)作為狀態(tài)的初始值,當(dāng)函數(shù)執(zhí)行后會返回兩個值,一個是當(dāng)前狀態(tài)的屬性,一個是修改狀態(tài)的方法。
- 使用方法更新數(shù)據(jù)后會觸發(fā)render()重新渲染數(shù)據(jù)
const [editingKey, setEditingKey] = useState(''); // 是否正在修改 const isEditing = (record: Item) => record.key === editingKey; // 修改按鈕 const edit = (record: Item) => { form.setFieldsValue({ ...record }); setEditingKey(record.key); }; // 取消 const cancel = () => { setEditingKey(''); }; // 保存 const save = async (id: React.Key) => { try { const row = (await form.validateFields()) console.log('row', row) row.id = id onSave(row) setEditingKey(''); } catch (err) { console.log(err) } };
我這里給useState一個初始值為空,點擊修改后使用setEditingKey()方法(useState返回的方法)將useState數(shù)據(jù)的值賦值為當(dāng)前行的唯一key值,這樣二者相等,就可以區(qū)別點擊的是哪一條數(shù)據(jù)的按鈕了;點擊取消setEditingKey(’’)重新置空;
判斷邏輯:
// 是否正在修改 const isEditing = (record: Item) => record.key === editingKey;
渲染數(shù)據(jù)前進行判斷:
const mergedColumns = columns.map(col => { if (!col.editable) { return col; } return { ...col, onCell: (record: Item) => ({ record, dataIndex: col.dataIndex, title: col.title, editing: isEditing(record), }), }; });
根據(jù)數(shù)據(jù)狀態(tài)判斷渲染的是表格合適輸入框:
const EditableCell: React.FC<EditableCellProps> = ({ editing, dataIndex, title, record, index, children, ...restProps }) => { return ( <td {...restProps}> {editing ? ( <Form.Item name={dataIndex} style={{ margin: 0 }} rules={[ { required: true, message: `請?zhí)顚?{title}!`, }, ]} > <Input /> </Form.Item> ) : ( children )} </td> ); };
導(dǎo)出:
return ( <Form form={form} component={false}> <Table components={{ body: { cell: EditableCell, }, }} bordered pagination={false} dataSource={dataSource} {...otherProps} columns={mergedColumns} rowClassName="editable-row" /> </Form> );
其中dataSource為數(shù)據(jù)源,
功能實現(xiàn)。
useState修改對象的字段
首先定義一個空對象
const [dataSelect, setDataSelect] = React.useState({})
給這個對象附上不同值,但不會把原來的覆蓋的掉
const select = (e, item, type) => { const data = { ...dataSelect } if (type == 'price') { setSelectNO(e) data.min_price = item.min_price data.max_price = item.max_price setDataSelect(data) console.log(data) return } if (type == 'optionsCity') { setCity(e) data.city = item.text setDataSelect(data) console.log(data) return } }
原理用一個第三方的值,作為中間變量。每次都是附上最新的data。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
React如何使用create-react-app創(chuàng)建react項目
這篇文章主要介紹了React如何使用create-react-app創(chuàng)建react項目問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03全棧輕量級搭配之Remix Prisma Sqlite使用分析
這篇文章主要為大家介紹了全棧輕量級搭配之Remix Prisma Sqlite使用示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05React為什么需要Scheduler調(diào)度器原理詳解
這篇文章主要為大家介紹了React為什么需要Scheduler調(diào)度器原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10在react-router4中進行代碼拆分的方法(基于webpack)
這篇文章主要介紹了在react-router4中進行代碼拆分的方法(基于webpack),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03React組件實例三大屬性state props refs使用詳解
這篇文章主要為大家介紹了React組件實例三大屬性state props refs使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09