React注意點總結(jié)

最初使用React時艘儒,沒有太注意細(xì)節(jié)聋伦,只是會使用,實現(xiàn)功能界睁,當(dāng)使用一段時間再回過頭來看官方文檔時發(fā)現(xiàn)有些東西原來是這樣的觉增,下面就把再次看文檔時覺得柳暗花明的地方總結(jié)一下,也算是對React基礎(chǔ)學(xué)習(xí)告一段落翻斟,開啟下一篇章逾礁。

key應(yīng)該是穩(wěn)定的,且唯一的访惜,盡量不要用索引作為key

都知道React組件渲染列表時需要為每個列表元素分配一個在列表中獨一無二的key嘹履,key可以在DOM中的某些元素被增加或刪除視乎幫助React識別哪些發(fā)生了變化,通常列表數(shù)據(jù)都會有id字段债热,習(xí)慣用id值作為key砾嫉,當(dāng)沒有id或其他唯一標(biāo)識時,也會用序列號索引index作為key窒篱,之前并沒有覺得用index有什么不好之處焕刮,再次看文檔發(fā)現(xiàn)序列號索引作為key有一些弊端。
如果列表可以重新排序墙杯,不建議使用索引作為key配并,因為會導(dǎo)致渲染變得很慢,如果不重排霍转,沒問題荐绝。

為什么變得很慢避消?

React通過對比算法來更新組件低滩,使用key來匹配原本樹的子節(jié)點和新樹的子節(jié)點召夹,比如以下列表,在開始插入元素:

<ul>
  <li key='6'>6</li>
  <li key='7'>7</li>
</ul>

<ul>
  <li key='5'>5</li>
  <li key='6'>6</li>
  <li key='7'>7</li>
</ul>

沒有使用index作為key恕沫,React知道key為'5'的元素是新的监憎,僅移動key為'6'、'7'的元素就可以了婶溯。
如果使用index作為key鲸阔,上述列表的變化會導(dǎo)致key值的變化,列表元素不能復(fù)用迄委,造成不必要的重建褐筛,也可能會以意想不到的方式更新,所以會變慢叙身。
注意:不要使用不穩(wěn)定的key(類似Math.random()生成的)

React中布爾值渔扎、Null和Undefined被忽略,數(shù)字0不會被忽略

React使用條件渲染時信轿,通常用JavaScript的邏輯與&&晃痴,當(dāng)showHeader為true時渲染<Header />,如下:

 <div>
  {showHeader && <Header />}
</div>

但數(shù)字0不會像預(yù)期的哪樣運行财忽,如下:

  <div>
  {props.messages.length &&
    <MessageList messages={props.messages} />
  }
</div>

props.messages為空數(shù)組時倘核,仍然會渲染<MessageList />,要解決這個問題即彪,確保 && 前面的表達(dá)式始終為布爾值:

  <div>
  {props.messages.length  > 0 &&
    <MessageList messages={props.messages} />
  }
</div>

使用PropTypes進(jìn)行類型檢查是很必要的

最開始寫React的時候從來都不加PropTypes紧唱,覺得沒什么必要,現(xiàn)在發(fā)現(xiàn)PropTypes進(jìn)行類型檢查是很必要的祖凫,如果父組件傳給子組件的參數(shù)不符合PropTypes配置琼蚯,控制臺就會報錯,給出錯誤信息惠况,這樣可以快速定位問題遭庶。
另外通過defaultProps為props定義默認(rèn)值時,類型檢查也會應(yīng)用在 defaultProps 上面稠屠,因為類型檢查發(fā)生在 defaultProps 賦值之后峦睡。
使用說明請查看官方文檔:https://doc.react-china.org/docs/typechecking-with-proptypes.html

React中獲取真實DOM節(jié)點或 React 元素時使用Refs

獲取在 render 方法中創(chuàng)建的 DOM 節(jié)點或 React 元素時,最好使用“回調(diào) ref”的方式权埠,不要用DOM操作也不要用舊版 API:String 類型的 Refs

 render() {
    return (
        //回調(diào)ref
        <input ref={input => this.inputRef = input}/>
        //string類型的ref
        <input ref=“inputRef”/>
    );
  }

不要在函數(shù)式組件中使用ref屬性來進(jìn)行回調(diào)函數(shù)的綁定榨了,因為函數(shù)式組件是沒有實例的,準(zhǔn)確的說函數(shù)式組件不是一個真正的類

React.Fragment組件的使用

在React中組件返回多個元素時要被一個元素包裹攘蔽,不然會報錯龙屉,我們通常用div元素,這個div元素沒有什么實際的意義,并且會在DOM中增加額外節(jié)點转捕,建議用React.Fragment組件作岖,不會增加額外的節(jié)點,目前key 是唯一可以傳遞給 Fragment 的屬性五芝。

  render() {
    return (
      <React.Fragment>
        <h1>React 文檔</h1>
        <div>React內(nèi)容</div>
      </React.Fragment>
    );
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痘儡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子枢步,更是在濱河造成了極大的恐慌沉删,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件醉途,死亡現(xiàn)場離奇詭異矾瑰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)结蟋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門脯倚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嵌屎,你說我怎么就攤上這事』型浚” “怎么了宝惰?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長再沧。 經(jīng)常有香客問我尼夺,道長,這世上最難降的妖魔是什么炒瘸? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任淤堵,我火速辦了婚禮,結(jié)果婚禮上顷扩,老公的妹妹穿的比我還像新娘拐邪。我一直安慰自己,他們只是感情好隘截,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布扎阶。 她就那樣靜靜地躺著,像睡著了一般婶芭。 火紅的嫁衣襯著肌膚如雪东臀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天犀农,我揣著相機(jī)與錄音惰赋,去河邊找鬼。 笑死呵哨,一個胖子當(dāng)著我的面吹牛赁濒,可吹牛的內(nèi)容都是我干的轨奄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼流部,長吁一口氣:“原來是場噩夢啊……” “哼戚绕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起枝冀,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤舞丛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后果漾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體球切,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年绒障,在試婚紗的時候發(fā)現(xiàn)自己被綠了吨凑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡户辱,死狀恐怖鸵钝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庐镐,我是刑警寧澤恩商,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站必逆,受9級特大地震影響怠堪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜名眉,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一粟矿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧损拢,春花似錦陌粹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至隧膏,卻和暖如春哗讥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胞枕。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工杆煞, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓决乎,卻偏偏與公主長得像队询,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子构诚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

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

  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南装盯,這只是我在學(xué)習(xí)過程中的一些閱讀筆記拆挥,個人覺得該教程講解深入淺出掏颊,比目前大...
    leonaxiong閱讀 2,834評論 1 18
  • 3. JSX JSX是對JavaScript語言的一個擴(kuò)展語法普碎, 用于生產(chǎn)React“元素”,建議在描述UI的時候...
    pixels閱讀 2,824評論 0 24
  • 1丑蛤、什么是react React.js 是一個幫助你構(gòu)建頁面 UI 的庫叠聋。React.js 將幫助我們將界面分成了...
    谷子多閱讀 2,557評論 1 13
  • #好好吃# 昨晚煮的,買的帶皮玉米受裹,樓下老板就算我1.8一斤了碌补,算下來一個才1.2,折騰玉米皮折騰了蠻久棉饶,想買了速...
    zifei01閱讀 169評論 0 0
  • 還沒八點厦章,抓了個包子坐上老爸的電動車邊解決早餐。 靈堂里已經(jīng)擠滿了穿孝服的男男女女照藻。我的任務(wù)是捧著一盆花和另一個一...
    毛豆姑娘閱讀 213評論 0 2