react antd如何防止一份數(shù)據(jù)多次提交
如何防止一份數(shù)據(jù)多次提交呢?
方案
利用antd 的button loading 方式實(shí)現(xiàn),在點(diǎn)擊提交按鈕后,先讓按鈕 loading,等待接口返回結(jié)果了,再做相應(yīng)的處理,最終把loading 去除。
(當(dāng)然 disabed 也可實(shí)現(xiàn)同樣的效果,個(gè)人建議是使用loading,交互會(huì)好一些)
import { Form, Input, Button, Select } from 'antd'; const { Option } = Select; const layout = { labelCol: { span: 8, }, wrapperCol: { span: 16, }, }; const tailLayout = { wrapperCol: { offset: 8, span: 16, }, }; class Demo extends React.Component { formRef = React.createRef(); // create a flag state = { submitLoading = false; }; onGenderChange = value => { this.formRef.current.setFieldsValue({ note: `Hi, ${value === 'male' ? 'man' : 'lady'}!`, }); }; onFinish = values => { // set the flag is true this.setState({submitLoading: true}, () => { console.log(values); //after request api, set the flag is false this.setState({submitLoading: false}); }) }; onReset = () => { this.formRef.current.resetFields(); }; onFill = () => { this.formRef.current.setFieldsValue({ note: 'Hello world!', gender: 'male', }); }; render() { let { submitLoading } = this.state; return ( <Form {...layout} ref={this.formRef} name="control-ref" onFinish={this.onFinish}> <Form.Item name="note" label="Note" rules={[ { required: true, }, ]} > <Input /> </Form.Item> <Form.Item name="gender" label="Gender" rules={[ { required: true, }, ]} > <Select placeholder="Select a option and change input text above" onChange={this.onGenderChange} allowClear > <Option value="male">male</Option> <Option value="female">female</Option> <Option value="other">other</Option> </Select> </Form.Item> <Form.Item noStyle shouldUpdate={(prevValues, currentValues) => prevValues.gender !== currentValues.gender} > {({ getFieldValue }) => getFieldValue('gender') === 'other' ? ( <Form.Item name="customizeGender" label="Customize Gender" rules={[ { required: true, }, ]} > <Input /> </Form.Item> ) : null } </Form.Item> <Form.Item {...tailLayout}> <Button type="primary" htmlType="submit" loading={submitLoading}> Submit </Button> <Button htmlType="button" onClick={this.onReset} loading={submitLoading}> Reset </Button> <Button type="link" htmlType="button" onClick={this.onFill} loading={submitLoading}> Fill form </Button> </Form.Item> </Form> ); } } ReactDOM.render(<Demo />, mountNode);
react防重復(fù)點(diǎn)擊方法、原理
原理
在請(qǐng)求數(shù)據(jù)一旦開始,直到本次請(qǐng)求結(jié)束之前,不能進(jìn)行下一次點(diǎn)擊,否則給與相應(yīng)的提示
state中的初始設(shè)置:
state={ bool:true, }
點(diǎn)擊事件設(shè)置:
btn_click = async () => { this.setState({ bool: false, }) . . . if(this.state.bool){ const value = await fetch.bbb({}) if (value.code == 1) { } else { } this.setState({ bool: true, }) } }
解析
- 滿足bool為true的情況,我們執(zhí)行請(qǐng)求,如果發(fā)生多次點(diǎn)擊的情況,方法開頭設(shè)置的bool:false就會(huì)生效,防止在請(qǐng)求還沒有完成的情況下進(jìn)行下一次請(qǐng)求;
- 然后在請(qǐng)求完成之后,我們把Bool的狀態(tài)變更多來,以便此次請(qǐng)求完成還可以進(jìn)行下一次請(qǐng)求。
- 至于方法開頭設(shè)置為false,請(qǐng)求還執(zhí)行,是源于一個(gè)異步機(jī)制,在同一個(gè)方法中設(shè)置state又重新調(diào)用,state是來不及更新的,但是會(huì)在下一次調(diào)用該方法的時(shí)候執(zhí)行。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解React??App.js?文件的結(jié)構(gòu)和作用
在React應(yīng)用中,App.js文件通常是項(xiàng)目的根組件文件,它負(fù)責(zé)組織和渲染其他組件,是應(yīng)用的核心部分,本文將詳細(xì)介紹App.js文件的結(jié)構(gòu)、作用和最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧2024-08-08React+Typescript創(chuàng)建項(xiàng)目的實(shí)現(xiàn)步驟
通過React組件庫和TypeScript的強(qiáng)類型特性,開發(fā)者可以創(chuàng)建出具有優(yōu)秀用戶體驗(yàn)和穩(wěn)定性的Web應(yīng)用程序,本文主要介紹了React+Typescript創(chuàng)建項(xiàng)目的實(shí)現(xiàn)步驟,感興趣的可以了解一下2023-08-08React項(xiàng)目中應(yīng)用TypeScript的實(shí)現(xiàn)
TypeScript通常都會(huì)依賴于框架,例如和vue、react 這些框架結(jié)合,本文就主要介紹了React項(xiàng)目中應(yīng)用TypeScript的實(shí)現(xiàn),分享給大家,具體如下:2021-09-09React報(bào)錯(cuò)之Parameter event implicitly has a
這篇文章主要為大家介紹了React報(bào)錯(cuò)之Parameter event implicitly has an any type,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08React18的useEffect執(zhí)行兩次如何應(yīng)對(duì)
這篇文章主要給大家介紹了關(guān)于React18的useEffect執(zhí)行兩次如何應(yīng)對(duì)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用React具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07