前端|Code Review心得分享

最近 Code Review 代碼迎变,發(fā)現(xiàn)幾個項目中可能遇到的問題贯城,可以進(jìn)行的優(yōu)化玩敏。

以下部分借鑒同事的總結(jié)(PS:問題代碼是我的例子)
先從一個需求說起沿侈,某個頁面中有個 Switch 開關(guān)闯第,開關(guān)的狀態(tài)是從后端接口獲取的并保存在 Redux 中,如果點擊這個開關(guān)缀拭,需要切換其狀態(tài)并向后端發(fā)送一個請求咳短。

現(xiàn)有邏輯為:

頁面初始化時從后端接口獲取狀態(tài)并保存在 Redux 中(假設(shè)為 checked 字段),然后通過 props 將傳到 Switch 組件所在的頁面
該頁面接收到 props 時蛛淋,將 checked 這個 props 保存在頁面的 state 中咙好,然后 Switch 組件使用頁面的 state 中的值
點擊 Switch 開關(guān)時修改頁面 state 中的 checked 值,然后再觸發(fā) Redux 中的一個 action (已使用 redux-thunk 處理異步邏輯)去請求后端接口
這樣就會出現(xiàn)一個問題褐荷,如果接口請求失敗勾效,但是頁面顯示的開關(guān)狀態(tài)已經(jīng)切換,導(dǎo)致 UI 顯示與實際狀態(tài)不一致,并且如果其他頁面用到這個狀態(tài)层宫,可能會導(dǎo)致一些意料之外的問題绘迁。

錯誤代碼示范:

  <Switch
     onChange={(checked)=>  (
        this.setState({ salesStatus = !checked}),
        this.switchSales )}
     checked={salesStatus}
     style={{ marginLeft: 16 }}
     disabled={!quickpay.edit}
  />

正確的操作應(yīng)該為:

  <Switch
     onChange={this.switchSales}
     checked={salesStatus}
     loading={XXXXX}
     style={{ marginLeft: 16 }}
     disabled={!quickpay.edit}
  />

頁面初始化時從后端接口獲取狀態(tài)并保存在 Redux 中(假設(shè)為 checked),并將狀態(tài)通過 props 傳遞到 Switch 開關(guān)組件中卒密,中間不做任何處理
點擊 Switch 開關(guān)時缀台,給其一個 loading 狀態(tài),同時觸發(fā) Redux 中的一個 action 去請求后端接口哮奇,請求完成后根據(jù)請求結(jié)果決定是否修改 Redux 中的 checked 值膛腐,并取消 loading 狀態(tài)
一個很簡單的需求涉及到兩個 React 架構(gòu)中的理念:單一數(shù)據(jù)源和單項數(shù)據(jù)流。

單一數(shù)據(jù)源
單一數(shù)據(jù)源即任何一個狀態(tài)只保存一份鼎俘,例如上述需求中的 checked 狀態(tài)僅保存在 Redux 中即可哲身,不要在某個頁面或組件中重新保存一份這個狀態(tài)值。

注意贸伐,根據(jù)需求偶爾也會有特殊情況勘天,例如 Ant Design Form 中通過 getFieldDecorator 包裝的組件可能需要對傳入 value 進(jìn)行處理后再使用。

單向數(shù)據(jù)流
React 中的數(shù)據(jù)流均為單向的捉邢,父組件通過 props 向子組件傳遞數(shù)據(jù)脯丝,props 發(fā)生改變后,組件會自動重新渲染伏伐。并且一個組件不能修改他的 props 值宠进。

如上述需求中的 checked 狀態(tài),通過 props 從頂層一層一層向下傳遞藐翎,而要修改他的時候材蹬,必須顯式地觸發(fā)一個 action 去修改他。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吝镣,一起剝皮案震驚了整個濱河市堤器,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌末贾,老刑警劉巖闸溃,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異未舟,居然都是意外死亡圈暗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門裕膀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來员串,“玉大人,你說我怎么就攤上這事昼扛〈缙耄” “怎么了欲诺?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長渺鹦。 經(jīng)常有香客問我扰法,道長,這世上最難降的妖魔是什么毅厚? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任塞颁,我火速辦了婚禮,結(jié)果婚禮上吸耿,老公的妹妹穿的比我還像新娘祠锣。我一直安慰自己,他們只是感情好咽安,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布伴网。 她就那樣靜靜地躺著,像睡著了一般妆棒。 火紅的嫁衣襯著肌膚如雪澡腾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天糕珊,我揣著相機(jī)與錄音动分,去河邊找鬼。 笑死放接,一個胖子當(dāng)著我的面吹牛刺啦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纠脾,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜕青!你這毒婦竟也來了苟蹈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤右核,失蹤者是張志新(化名)和其女友劉穎慧脱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贺喝,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡菱鸥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了躏鱼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氮采。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖染苛,靈堂內(nèi)的尸體忽然破棺而出鹊漠,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布躯概,位于F島的核電站登钥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏娶靡。R本人自食惡果不足惜牧牢,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姿锭。 院中可真熱鬧塔鳍,春花似錦、人聲如沸艾凯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趾诗。三九已至蜡感,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恃泪,已是汗流浹背郑兴。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留贝乎,地道東北人情连。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像览效,于是被迫代替她去往敵國和親却舀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355