摘要:在實際項目當(dāng)中狀態(tài)提升并不是一個好的解決方案,所以我們后續(xù)會引入這樣的狀態(tài)管理工具來幫助我們來管理這種共享狀態(tài),但是在講解到之前,我們暫時采取狀態(tài)提升的方式來進行管理。
React.js 小書 Lesson17 - 前端應(yīng)用狀態(tài)管理 —— 狀態(tài)提升
本文作者:胡子大哈
本文原文:http://huziketang.com/books/react/lesson17
轉(zhuǎn)載請注明出處,保留原文鏈接以及作者信息
在線閱讀:http://huziketang.com/books/react
上一個評論功能的案例中,可能會有些同學(xué)會對一個地方感到疑惑: CommentList 中顯示的評論列表數(shù)據(jù)為什么要通過父組件 CommentApp 用 props 傳進來?為什么不直接存放在 CommentList 的 state 當(dāng)中?例如這樣做也是可以的:
class CommentList extends Component { constructor () { this.state = { comments: [] } } addComment (comment) { this.state.comments.push(comment) this.setState({ comments: this.state.comments }) } render() { return ({this.state.comments.map((comment, i) =>) } })}
如果把這個 comments 放到 CommentList 當(dāng)中,當(dāng)有別的組件也依賴這個 comments 數(shù)據(jù)或者有別的組件會影響這個數(shù)據(jù),那么就帶來問題了。舉一個數(shù)據(jù)依賴的例子:例如,現(xiàn)在我們有另外一個和 CommentList 同級的 CommentList2 ,也是需要顯示同樣的評論列表數(shù)據(jù)。
CommentList2 和 CommentList 并列為 CommentApp 的子組件,它也需要依賴 comments 顯示評論列表。但是因為 comments 數(shù)據(jù)在 CommentList 中,它沒辦法訪問到。
遇到這種情況,我們將這種組件之間共享的狀態(tài)交給組件最近的公共父節(jié)點保管,然后通過 props 把狀態(tài)傳遞給子組件,這樣就可以在組件之間共享數(shù)據(jù)了。
在我們的例子當(dāng)中,如果把 comments 交給父組件 CommentApp ,那么 CommentList 和 CommentList2 都可以通過 props 獲取到 comments,React.js 把這種行為叫做“狀態(tài)提升”。
但是這個 CommentList2 是我們臨時加上去的,在實際案例當(dāng)中并沒有涉及到這種組件之間依賴 comments 的情況,為什么還需要把 comments 提升到 CommentApp?那是因為有個組件會影響到 comments ,那就是 CommentInput。CommentInput 產(chǎn)生的新的評論數(shù)據(jù)是會插入 comments 當(dāng)中的,所以我們遇到這種情況也會把狀態(tài)提升到父組件。
總結(jié)一下:當(dāng)某個狀態(tài)被多個組件依賴或者影響的時候,就把該狀態(tài)提升到這些組件的最近公共父組件中去管理,用 props 傳遞數(shù)據(jù)或者函數(shù)來管理這種依賴或著影響的行為。
我們來看看狀態(tài)提升更多的例子,假設(shè)現(xiàn)在我們的父組件 CommentApp 只是屬于更大的組件樹 PostApp 的一部分:
而這個更大的組件樹的另外的子樹的 CommentsCount 組件也需要依賴 comments 來顯示評論數(shù),那我們就只能把 comments 繼續(xù)提升到這些依賴組件的最近公共父組件 PostApp 當(dāng)中。
現(xiàn)在繼續(xù)讓我們的例子極端起來。假設(shè)現(xiàn)在 PostApp 只是另外一個更大的父組件 Index 的子樹。而 Index 的某個子樹的有一個按鈕組件可以一鍵清空所有 comments(也就是說,這個按鈕組件可以影響到這個數(shù)據(jù)),我們只能繼續(xù) commenets 提升到 Index 當(dāng)中。
你會發(fā)現(xiàn)這種無限制的提升不是一個好的解決方案。一旦發(fā)生了提升,你就需要修改原來保存這個狀態(tài)的組件的代碼,也要把整個數(shù)據(jù)傳遞路徑經(jīng)過的組件都修改一遍,好讓數(shù)據(jù)能夠一層層地傳遞下去。這樣對代碼的組織管理維護帶來很大的問題。到這里你可以抽象一下問題:
如何更好的管理這種被多個組件所依賴或影響的狀態(tài)?
你可以看到 React.js 并沒有提供好的解決方案來管理這種組件之間的共享狀態(tài)。在實際項目當(dāng)中狀態(tài)提升并不是一個好的解決方案,所以我們后續(xù)會引入 Redux 這樣的狀態(tài)管理工具來幫助我們來管理這種共享狀態(tài),但是在講解到 Redux 之前,我們暫時采取狀態(tài)提升的方式來進行管理。
對于不會被多個組件依賴和影響的狀態(tài)(例如某種下拉菜單的展開和收起狀態(tài)),一般來說只需要保存在組件內(nèi)部即可,不需要做提升或者特殊的管理。
下一節(jié)中我們將介紹《React.js 小書 Lesson18 - 掛載階段的組件生命周期(一)》。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/89686.html
摘要:因為工作中一直在使用,也一直以來想總結(jié)一下自己關(guān)于的一些知識經(jīng)驗。于是把一些想法慢慢整理書寫下來,做成一本開源免費專業(yè)簡單的入門級別的小書,提供給社區(qū)。本書的后續(xù)可能會做成視頻版本,敬請期待。本作品采用署名禁止演繹國際許可協(xié)議進行許可 React.js 小書 本文作者:胡子大哈本文原文:React.js 小書 轉(zhuǎn)載請注明出處,保留原文鏈接以及作者信息 在線閱讀:http://huzi...
摘要:但是給傳遞的評論數(shù)據(jù)并沒有傳遞給,所以現(xiàn)在發(fā)表評論時沒有反應(yīng)的。包括實現(xiàn)功能之前先理解分析需求,劃分組件。到此為止,小書的第一階段已經(jīng)結(jié)束,你可以利用這些知識點來構(gòu)建簡單的功能模塊了。 React.js 小書 Lesson16 - 實戰(zhàn)分析:評論功能(三) 本文作者:胡子大哈本文原文:http://huziketang.com/books/react/lesson16 轉(zhuǎn)載請注明出處...
摘要:的主要作用是用于組件保存控制修改自己的可變狀態(tài)。它們都可以決定組件的行為和顯示形態(tài)。但是它們的職責(zé)其實非常明晰分明是讓組件控制自己的狀態(tài),是讓外部對組件自己進行配置。下一節(jié)中我們將介紹小書渲染列表數(shù)據(jù)。 React.js 小書 Lesson12 - state vs props 本文作者:胡子大哈本文原文:http://huziketang.com/books/react/lesso...
摘要:一個組件的顯示形態(tài)由多個狀態(tài)決定的情況非常常見。我們順利地消除了手動的操作。非一般的暴力,因為每次都重新構(gòu)造新增刪除元素,會導(dǎo)致瀏覽器進行大量的重排,嚴重影響性能。下一節(jié)小書前端組件化三抽象出公共組件類我們把這個通用模式抽離到一個類當(dāng)中。 React.js 小書 Lesson3 - 前端組件化(二):優(yōu)化 DOM 操作 本文作者:胡子大哈本文原文:http://huziketang....
摘要:工具地址在安裝之前要確認你的機器上安裝了環(huán)境包括。安裝好環(huán)境以后,只需要按照官網(wǎng)的指引安裝即可。所以可以把的源改成國內(nèi)的的源,這樣會加速下載過程。接下來我們會探討的組件的基本寫法小書使用描述信息。 React.js 小書 Lesson5 - React.js 基本環(huán)境安裝 本文作者:胡子大哈本文原文:http://huziketang.com/books/react/lesson5 ...
閱讀 1292·2023-04-26 01:03
閱讀 1907·2021-11-23 09:51
閱讀 3299·2021-11-22 15:24
閱讀 2662·2021-09-22 15:18
閱讀 1010·2019-08-30 15:55
閱讀 3458·2019-08-30 15:54
閱讀 2233·2019-08-30 15:53
閱讀 2387·2019-08-30 15:44