React--送給前端開發(fā)者的一份新年禮物

Vue 筝尾,React 界弧,Angular 三大主流框架凡蜻,各有所長(zhǎng),但是React的社區(qū)相對(duì)于Vue和Angular是最為活躍垢箕,雖然近年來國(guó)內(nèi)大牛開源的Vue框架划栓,一起簡(jiǎn)單上手,發(fā)展比較快条获。

這里從github上的截圖做個(gè)比較

image.png

image.png

React 是什么

React 其實(shí)只是一個(gè) UI 框架忠荞,頻繁進(jìn)行 DOM 操作的代價(jià)是很昂貴的,所以 React 使用了虛擬 DOM 的技術(shù)帅掘,每當(dāng)狀態(tài)發(fā)生改變委煤,就會(huì)生成新的虛擬 DOM 并與原本的進(jìn)行改變,讓變化的地方去渲染修档。并且為了性能的考慮碧绞,只對(duì)狀態(tài)進(jìn)行淺比較(這是一個(gè)很大的優(yōu)化點(diǎn))。

React 已經(jīng)成為當(dāng)今最流行的框架之一吱窝,但是他的學(xué)習(xí)成本并不低并且需要你有一個(gè)良好的 JS 基礎(chǔ)讥邻。由于React 只是一個(gè) UI 框架寓免,所以你想完成一個(gè)項(xiàng)目,你就得使用他的全家桶计维。

React 組件

如何寫好規(guī)劃好一個(gè)組件決定了你的 React 玩的溜不溜袜香。一個(gè)組件你需要考慮他提供幾個(gè)對(duì)外暴露的接口,內(nèi)部狀態(tài)通過局部狀態(tài)改變還是全局狀態(tài)改變好鲫惶。并且你的組件應(yīng)該是利于復(fù)用和維護(hù)的蜈首。

組件的生命周期
image.png
render  函數(shù)會(huì)在 UI 渲染時(shí)調(diào)用,你多次渲染就會(huì)多次調(diào)用欠母,所以控制一個(gè)組件的重復(fù)渲染對(duì)于性能優(yōu)化很重要

componentDidMount  函數(shù)只會(huì)在組件渲染以后調(diào)用一次欢策,通常會(huì)在這個(gè)發(fā)起數(shù)據(jù)請(qǐng)求

shouldComponentUpdate  是一個(gè)很重要的函數(shù),他的返回值決定了是否需要生成一個(gè)新的虛擬 DOM 去和之前的比較赏淌。通常遇到的性能問題你可以在這里得到很好的解決

componentWillMount 函數(shù)會(huì)在組件即將銷毀時(shí)調(diào)用踩寇,項(xiàng)目中在清除聊天未讀消息中用到了這個(gè)函數(shù)
父子組件參數(shù)傳遞

在項(xiàng)目中我使用的方式是單個(gè)模塊頂層父組件通過 connect 與 Redux 通信。子組件通過參數(shù)傳遞的方式獲取需要的參數(shù)六水,對(duì)于參數(shù)類型我們應(yīng)該規(guī)則好俺孙,便于后期 debug。

性能上考慮掷贾,我們?cè)趨?shù)傳遞的過程中盡量只傳遞必須的參數(shù)睛榄。

路由

在 React-router 4.0 版本,官方也選擇了組件的方式去書寫路由想帅。

下面介紹一下項(xiàng)目中使用到的按需加載路由高階組件

import React, { Component } from "react";
// 其實(shí)高階組件就是一個(gè)組件通過參數(shù)傳遞的方式生成新的組件
export default function asyncComponent(importComponent) {
  class AsyncComponent extends Component {
    constructor(props) {
      super(props);
        // 存儲(chǔ)組件
      this.state = {
        component: null
      };
    }
    async componentDidMount() {
    // 引入組件是需要下載文件的场靴,所以是個(gè)異步操作
      const { default: component } = await importComponent();
      this.setState({
        component: component
      });
    }
    // 渲染時(shí)候判斷文件下完沒有,下完了就渲染出來
    render() {
      const C = this.state.component;
      return C ? <C {...this.props} /> : null;}
  }
  return AsyncComponent;
}

Redux

Redux 通常是個(gè)另新手困惑的點(diǎn)港准。首先旨剥,不是每個(gè)項(xiàng)目都需要使用 Redux,組件間通信不多浅缸,邏輯不復(fù)雜轨帜,你也就不需要使用這個(gè)庫,畢竟這個(gè)使用這個(gè)庫的開發(fā)成本很大疗杉。

Redux 是與 React 解耦的阵谚,所以你想和 Redux 通信就需要使用 React-redux蚕礼,你在 action 中使用異步請(qǐng)求就得使用 Redux-thunk烟具,因?yàn)?action 只支持同步操作。

Redux 的組成

Redux 由三部分組成:action奠蹬,store朝聋,reducer。

Action 顧名思義囤躁,就是你發(fā)起一個(gè)操作冀痕,具體使用如下:

export function getOrderSuccess(data) {
// 返回的就是一個(gè) action荔睹,除了第一個(gè)參數(shù)一般這樣寫,其余的參數(shù)名隨意
  return { type: GET_ORDER_SUCCESS, payload: data };
}

Action 發(fā)出去以后言蛇,會(huì)丟給 Reducer僻他。Reducer 是一個(gè)純函數(shù)(不依賴于且不改變它作用域之外的變量狀態(tài)的函數(shù)),他接收一個(gè)之前的 state 和 action 參數(shù)腊尚,然后返回一個(gè)新的 state 給 store吨拗。

   switch (action.type) {
   >     case GET_ALL_ORDERS:
      return state.set("allOrders", action.payload);
    default:
        break; 
}
  return state;
}

Store 很容易和 state 混淆。你可以把 Store 看成一個(gè)容器婿斥,state 存儲(chǔ)在這個(gè)容器中劝篷。Store 提供一些 API 讓你可以對(duì) state 進(jìn)行訪問,改變等等民宿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娇妓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子活鹰,更是在濱河造成了極大的恐慌哈恰,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件志群,死亡現(xiàn)場(chǎng)離奇詭異蕊蝗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赖舟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門蓬戚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宾抓,你說我怎么就攤上這事子漩。” “怎么了石洗?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵幢泼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我讲衫,道長(zhǎng)缕棵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任涉兽,我火速辦了婚禮招驴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘枷畏。我一直安慰自己别厘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布拥诡。 她就那樣靜靜地躺著触趴,像睡著了一般氮发。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冗懦,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天爽冕,我揣著相機(jī)與錄音,去河邊找鬼披蕉。 笑死扇售,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嚣艇。 我是一名探鬼主播承冰,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼食零!你這毒婦竟也來了困乒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤贰谣,失蹤者是張志新(化名)和其女友劉穎娜搂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吱抚,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡百宇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秘豹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片携御。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖既绕,靈堂內(nèi)的尸體忽然破棺而出啄刹,到底是詐尸還是另有隱情,我是刑警寧澤凄贩,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布誓军,位于F島的核電站,受9級(jí)特大地震影響疲扎,放射性物質(zhì)發(fā)生泄漏昵时。R本人自食惡果不足惜椒丧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一壹甥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓜挽,春花似錦盹廷、人聲如沸征绸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淆衷,卻和暖如春缸榄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祝拯。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工甚带, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人佳头。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓鹰贵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親康嘉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碉输,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容