FilterableProductTable
(橙色): 包含整個例子SearchBar
(藍色): 接收全部用戶輸入ProductTable
(綠色): 基於用戶輸入顯示與過濾數據集ProductCategoryRow
(青綠色): 顯示每組數據歸類標題ProductRow
(紅色): 顯示每一行數據層次結構以下:html
FilterableProductTable
SearchBar
ProductTable
ProductCategoryRow
ProductRow
如今你已經有了層次結構,是時候要實現應該了,最簡單的方法就是用你的數據模型來作一個版本而後渲染UI但不須要交互。最好就是把過程解偶開,只須要寫不須要想太多交互的東西。react
建的時候,你將要想用props傳數據的方式來重用別的組件。props是一種數據由父傳子的方式。若是你熟悉state的概念,不要只用state來作靜態版本。由於它只用來作交互,即數據常常改變時用上。git
你能夠由上而下或者由下而上來作,即你能夠從最高層FilterableProductTable或者由最低層ProductRow開始。但一般,簡單項目通常是由上而下;大型項目,則由下而上更好,並要編寫測試。github
最後,你將有一個能夠重用的組件庫來渲染數據模型。組件只有render()方法,由於它只是一個靜態版本。最高層FilterableProductTable將負責接收數據模型做爲prop使用。若是你修改數據模型,再調用ReactDOM.render()就能夠更新到UI。很是簡單就能看到你的UI更新了什麼和哪裏作了修改,由於React是經過單向數據流或者叫單向數據綁定來同步數據與UI而且速度很是快。函數
思考咱們例子中全部數據碎片. 咱們有:測試
那讓咱們看看哪一個是能夠用做state。簡單的對這些數據問3個問題。插件
初始列的全部產品是經過props傳進來的,因此它不是state。搜索輸入框文字內容和勾選框狀態很是似state,由於他們能夠常常改而且不能從其餘組件計算獲得。最後,過濾後的產品列表不是state,由於它是能夠經過搜索輸入框文字內容和勾選框狀態結合初始列的全部產品計算出來的。code
因此最後,咱們的state是:htm
好,如今咱們已經識別出應用的state集。下一步,咱們須要識別哪些組件修改或者擁有這些state事件
記住:React是單向數據流結構。它可能不會立刻清晰是哪一個組件擁有什麼state。 這對新手來講常常是最有挑戰性的部分, 所以要跟着這些步驟來弄清楚:
對於你的應用中的每個state:
讓咱們用這策略來應該到咱們的應用上吧:
ProductTable
須要基於state來過濾產品列表, SearchBar
須要顯示搜索文字和勾選狀態FilterableProductTable
。FilterableProductTable
絕對是能夠的。好,那咱們就這樣作吧。首先,爲FilterableProductTable
增長一個getInitialState()
方法,返回值是{filterText: '', inStockOnly: false}
來反映應用的初始狀態。而後,把filterText
和inStockOnly
做爲props傳給ProductTable
和SearchBar
。最後用這些props來過濾ProductTable
的行和設置ProductTable
中表單的值。
你能夠開始看到你的應該將如何表現:設置filterText
爲"ball"並刷新頁面。你應該能夠看到數據表已經正確更新。
若是你嘗試去在這版本上輸入或者打勾 ,你將看到React會忽略你的輸入。這是有意爲之,由於咱們已經設了輸入框的 prop值老是等於FilterableProductTable
傳過來的state
值。
React使得數據流 準確地容易的明白你的程序如何工做,但比傳統的雙向數據綁定須要寫得更多一點 代碼。React提供一個叫ReactLink
的插件讓這模式使用起來與雙向數據綁定同樣式 方便,但這文章的目的,是要保持全部東西都清晰。
若是你嘗試去在這版本上輸入或者打勾 ,你將看到React會忽略你的輸入。這是有意爲之,由於咱們已經設了輸入框的 prop值老是等於FilterableProductTable
傳過來的state
值。
讓咱們想一想咱們要些什麼。咱們想要確保不管什麼時候用戶改變了表單,咱們 就更新state
值去反映用戶輸入。既然組件應該只更新他們本身的state
,那麼不管 什麼時候state
應該更新時,FilterableProductTable
將傳一個回調函數給SearchBar
並觸發它。咱們能夠用輸入框的onChange
事件去接收它。而後 FilterableProductTable
傳來的回調函數將執行setState()
函數,以後咱們的應 用將被更新。
雖然這樣聽起來比較複雜,但也就那麼幾行代碼。你的數據如何在應用中流轉將會很清晰 。
RunJS源碼:http://runjs.cn/code/cgfurbyq
引用自:http://facebook.github.io/react/docs/thinking-in-react.html