版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、react中跨組件分發(fā)狀態(tài)的三種方法介紹當我問自己第一百次時,我正在討論一個典型的crud屏幕:我應當將狀態(tài)保留在這個組件中還是將其移動到父組件?。假如需要對子組件的狀態(tài)舉行輕微控制。您可能也碰到了同樣的問題。讓我們通過一個容易的例子和三種修復辦法往返顧它。前兩種辦法是頻繁的做法,第三種辦法不太常規(guī)。問題;為了向您展示我的意思,我將用法一個容易的書籍crud(譯者注:增強(create)、讀取查詢(retrieve)、更新(update)和刪除(delete))屏幕(如此容易,它沒有創(chuàng)建和刪除操作)。381280250-5b6ae9839a548_articlex.png我們有三個組成部分。是
2、一個組件,顯示了用于編輯它們的書籍和按鈕列表。有兩個輸入和一個按鈕,用于保存對書籍的更改。以及包含其他兩個組件的。那么,我們的狀態(tài)是什么?好吧,應當跟蹤書籍清單以及識別當前正在編輯的書籍的內容。沒有任何狀態(tài)。并且應當保持輸入的當前狀態(tài),直到單擊保存按鈕。importreact,componentfrom"react"importrenderfrom"react-dom"constbooks=title:"theendofeternity",author:"isaacas
3、imov",/.;constbooklist=(books,onedit)=>(booktitleactionsbooks.map(book,index)=>(book.title<buttononclick=()=>onedit(index)>edit</button>);classbookformextendscomponentstate=.ps.book;render()if(!ps.b
4、ook)returnnull;return(<form>book<label>title:<inputvalue=this.state.titleonchange=e=>this.setstate(title:e.target.value)/></label><label>author:<inputvalue=this.state.a
5、uthoronchange=e=>this.setstate(author:e.target.value)/></label><buttononclick=()=>ps.onsave(.this.state)>save</button></form>);classbookappextendscomponentstate=books:book
6、s,activeindex:-1;render()constbooks,activeindex=this.state;constactivebook=booksactiveindex;return(<booklistbooks=booksonedit=index=>this.setstate(activeindex:index)/><bookformbook=activebookonsave=book=>this.setstate(books:object.assign(.books,
7、activeindex:book),activeindex:-1)/>);render(<bookapp/>,document.getelementbyid("root");在codesandbox嘗試一下看起來不錯,但是他不起作用。我們正在創(chuàng)建組件實例時初始化狀態(tài),因此,當從列表中挑選另一本書時,父級無法讓它知道它需要更改它。我們改如何修復它?辦法1:受控組件一種頻繁的辦法是將狀態(tài)提升,將轉換為受控組件。我們刪除狀態(tài),將activebook添加到狀態(tài),并向添加一個onchange道具,我們在
8、每次輸入時都會調用它。/.classbookformextendscomponentrender()if(!ps.book)returnnull;return(<form>book<label>title:<inputvalue=ps.book.titleonchange=e=>ps.onchange(.ps.book,title:e.target.value)/>&am
9、p;lt;/label><label>author:<inputvalue=ps.book.authoronchange=e=>ps.onchange(.ps.book,author:e.target.value)/></label><buttononclick=()=>ps.onsave()&gt
10、;save</button></form>);classbookappextendscomponentstate=books:books,activebook:null,activeindex:-1;render()constbooks,activebook,activeindex=this.state;return(<booklistbooks=booksonedit=index=>this.setstate(activebook:.booksindex,act
11、iveindex:index)/><bookformbook=activebookonchange=book=>this.setstate(activebook:book)onsave=()=>this.setstate(books:object.assign(.books,activeindex:activebook),activebook:null,activeindex:-1)/>);/.辦法2:同步state現(xiàn)在它可以工作,但對我來說,提升的狀態(tài)感覺不對。在用戶單擊保存之前,不
12、關懷對書的任何更改,那么為什么需要將其保持在自己的狀態(tài)?在codesandbox嘗試一下現(xiàn)在它可以工作,但對我來說,提升的狀態(tài)感覺不對。在用戶單擊保存之前,不關懷對書的任何更改,那么為什么需要將其保持在自己的狀態(tài)?/.classbookformextendscomponentstate=.ps.book;componentwillreceiveprops(nextprops)constnextbook=nextprops.book;if(ps.book!=nextbook)this.setstate(.nextbook);render()if(!
13、ps.book)returnnull;return(<form>book<label>title:<inputvalue=this.state.titleonchange=e=>this.setstate(title:e.target.value)/></label><label>author:<inputvalue=this.sta
14、te.authoronchange=e=>this.setstate(author:e.target.value)/></label><buttononclick=()=>ps.onsave(.this.state)>save</button></form>);/.在codesandbox嘗試一下這種辦法通常被認為是一種不好的做法,由于它違
15、反了react關于擁有單一事實來源的主意。我不確定是這種狀況,然而,同步狀態(tài)并不總是那么簡單。此外,我盡量避開用法生命周期辦法。辦法3:由key控制的組件但為什么我們要回收舊的狀態(tài)呢?每次用戶挑選一本書時,擁有一個全新狀態(tài)的新實例是不是故意義?為此,我們需要告知react停止用法舊實例并創(chuàng)建一個新實例。這就是keyprop的用途。/.classbookappextendscomponentstate=books:books,activeindex:-1;render()constbooks,activeindex=this.state;constactivebook=booksactiveindex;return(<booklistbooks=booksonedit=index=>this.setstate(activeindex:index)/><bookformkey=activeinde
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 買房佛山合同模板
- pos押金合同模板
- 商鋪櫥窗施工合同模板
- 商鋪樓宇租賃合同模板
- 合同模板字體要求
- 啟東農田流轉合同模板
- 中原地產合同模板
- 企業(yè)管理學習合同模板
- 農村訂婚合同模板
- 豐臺區(qū)家電運輸合同模板
- 初中英語語法歸納大全
- 主播合作合同解約函
- 2024年秋10月《合同法》全國自考考題含解析
- 預防校園欺凌事件班主任培訓
- HCIA H13-111鯤鵬應用開發(fā)考試復習題庫(含答案)
- 七上歷史時間軸
- 學校衛(wèi)生保健室使用情況登記表
- (正式版)SHT 3225-2024 石油化工安全儀表系統(tǒng)安全完整性等級設計規(guī)范
- 2024版醫(yī)療廢物分類目錄
- 中職學生安全教育課件
- 屈原【六幕話劇】郭沫若
評論
0/150
提交評論