基于React實(shí)現(xiàn)表單數(shù)據(jù)的添加和刪除詳解
前言
最近在學(xué)習(xí)React,做了一個(gè)簡(jiǎn)單的Demo,用以自勉及和有需要的朋友們參考學(xué)習(xí)。
實(shí)現(xiàn)功能
在輸入框中輸入數(shù)據(jù)后,點(diǎn)擊保存按鈕,數(shù)據(jù)將會(huì)逐一顯示在輸入框下方,點(diǎn)擊保存后顯示的任何一條數(shù)據(jù),該數(shù)據(jù)即可被刪除。
實(shí)現(xiàn)思路
在開(kāi)始實(shí)現(xiàn)之前,我們需要理清我們的思路,這樣才能更好地去完成預(yù)定功能。
- 點(diǎn)擊保存按鈕時(shí),輸入框中的數(shù)據(jù)讀取,可通過(guò)onChange綁定事件,獲得輸入框數(shù)據(jù):
e.target.value
- 自定義一個(gè)事件,輸入數(shù)據(jù)后,點(diǎn)擊保存按鈕時(shí),數(shù)據(jù)的存儲(chǔ)操作交由該事件完成
- 當(dāng)不斷點(diǎn)擊保存按鈕時(shí),數(shù)據(jù)應(yīng)該是多個(gè)的,可選用數(shù)組來(lái)存儲(chǔ)數(shù)據(jù)
- 數(shù)組中,數(shù)組的索引是唯一表示一個(gè)數(shù)據(jù)的方式,數(shù)據(jù)的操作可通過(guò)索引進(jìn)行
實(shí)現(xiàn)過(guò)程
class ReactDemo extends React.Component{ render(){ return( <div> <input /> <button>點(diǎn)擊保存</button> </div> ) } } ReactDOM.render(<ReactDemo />,document.getElementById('app'))
這是本次Demo的雛形,接下來(lái)我們將會(huì)在這上面一點(diǎn)一點(diǎn)地做修改,進(jìn)行功能的完善。
此時(shí),表單為非受控組件,也就是普通的組件,在輸入框中輸入任何數(shù)據(jù),在輸入框內(nèi)均會(huì)顯示。
React組件提供了this.state
以及this.setState
,利用它們,我們可以十分方便地管理、更新組件的狀態(tài)。
constructor() { super() this.state = { val: '', arr: [] } }
this.state
通常在構(gòu)造函數(shù)內(nèi)部進(jìn)行初始化,其值為對(duì)象,本例中,val用于保存輸入框中的值,初始值為空字符串;arr是個(gè)數(shù)據(jù),用于存儲(chǔ)多個(gè)數(shù)據(jù)。
handleData(e) { this.setState({ val: e.target.value }) }
這里,this.setState
會(huì)將val的值更新為e.target.value
,當(dāng)組件狀態(tài)值(這里為val)發(fā)生改變,組件就會(huì)自動(dòng)調(diào)用render()
重新渲染UI 。
onButtonClick(e) { var val = this.state.val this.setState({ arr: [val, ...this.state.arr] }) }
展開(kāi)運(yùn)算符(…)是ES6的語(yǔ)法,它允許一個(gè)表達(dá)式在某處展開(kāi),利用這一特性,可將數(shù)組元素逐一展開(kāi):...this.state.arr
,讓val總是成作為數(shù)組的第一個(gè)元素,組成新數(shù)組[val, ...this.state.arr]
后,賦給arr。
onDelete(index, e) { this.setState({ arr: this.state.arr.filter((elem, i) => index !== i) }) }
通過(guò)數(shù)組的索引對(duì)數(shù)據(jù)進(jìn)行刪除操作, [].filter()
接受一個(gè)方法作為它的參數(shù),并返回匹配條件(index !== i
)的元素組成的新數(shù)組。
{arr1.map((i,index) =>( <div onClick={this.onDelete.bind(this,index)}>{i}</div> ))}
這種JSX的語(yǔ)法是由facebook官方提出的一種十分簡(jiǎn)明的寫(xiě)法,個(gè)人覺(jué)得好用到爆。[].map()
對(duì)數(shù)組元素依次進(jìn)行函數(shù)的調(diào)用,并返回函數(shù)調(diào)用結(jié)果組成的新數(shù)組。bind(this,index)
的第二個(gè)參數(shù)index為原函數(shù)onDelete(index,e)
省略掉的第一個(gè)參數(shù)。
好了,大功告成,讓我們一起來(lái)看下效果吧…
添加效果
刪除后效果
總結(jié)
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
react實(shí)現(xiàn)每隔60s刷新一次接口的示例代碼
本文主要介紹了react實(shí)現(xiàn)每隔60s刷新一次接口的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06React自定義hooks同步獲取useState的最新?tīng)顟B(tài)值方式
這篇文章主要介紹了React自定義hooks同步獲取useState的最新?tīng)顟B(tài)值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03React實(shí)現(xiàn)虛擬滾動(dòng)的三種思路詳解
在??web??開(kāi)發(fā)的過(guò)程中,或多或少都會(huì)遇到大列表渲染的場(chǎng)景,為了解決大列表造成的渲染壓力,便出現(xiàn)了虛擬滾動(dòng)技術(shù),本文主要介紹虛擬滾動(dòng)的三種思路,希望對(duì)大家有所幫助2024-04-04React創(chuàng)建對(duì)話(huà)框組件的方法實(shí)例
在項(xiàng)目開(kāi)發(fā)過(guò)程中,對(duì)于復(fù)雜的業(yè)務(wù)選擇功能很常見(jiàn),下面這篇文章主要給大家介紹了關(guān)于React創(chuàng)建對(duì)話(huà)框組件的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05React注冊(cè)倒計(jì)時(shí)功能的實(shí)現(xiàn)
這篇文章主要介紹了React注冊(cè)倒計(jì)時(shí)功能的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09React配置Redux并結(jié)合本地存儲(chǔ)設(shè)置token方式
這篇文章主要介紹了React配置Redux并結(jié)合本地存儲(chǔ)設(shè)置token方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01React如何實(shí)現(xiàn)視頻旋轉(zhuǎn)縮放
這篇文章主要為大家詳細(xì)介紹了React如何實(shí)現(xiàn)視頻旋轉(zhuǎn)縮放功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11