-
用小括號包裹代碼防止分號自動插入的bug,用大括號包裹裏面的表達式html
-
切記你使用了大括號包裹的 JavaScript 表達式時就不要再到外面套引號了。JSX 會將引號當中的內容識別爲字符串而不是表達式
-
使用小駝峯定義屬性,例如,class變成className,tabIndex對應tabindexnode
-
渲染以前會轉換爲字符串,防止XSS(跨站腳本)攻擊react
-
本質上是爲react.createElement(component, props, ...children)方法提供的語法糖數組
-
data-*,aria-*是例外的,不遵照小駝峯命名規則性能優化
-
沒有子代可使用自閉和標籤,babel
<div className="sidebar" />
-
-
可使用點語法來從模塊中導出組件
const MyComponents = { DatePicker: function DatePicker(props) { return <div>Imagine a {props.color} datepicker here.</div>; } } function BlueDatePicker() { return <MyComponents.DatePicker color="blue" />; }
-
react將小寫的標籤名認爲是HTML的原生標籤
-
大寫的標籤名認爲是react組件
-
不能用表達式表示標籤
-
標籤名能夠爲大寫開頭的變量
-
若是沒有給屬性傳值,默認爲true不建議使用
-
可使用擴展運算符...
去傳遞屬性
-
組件能夠用數組形式返回多個元素
-
false,null,undefined,true都是有效的子代,但不會被渲染
-
數字0仍然會被渲染
-
immutable不可變的,建立後沒法改變其內容與屬性
-
更新頁面的惟一方法是建立一個新的元素傳入reactDOM.render()
-
渲染過程只會更新改變的部分
-
組件像是函數,接受的參數爲(props),輸出頁面上的元素
-
當React遇到的元素是用戶自定義的組件,它會將JSX屬性做爲單個對象傳遞給該組件,這個對象稱之爲「props」
-
組件名稱必須爲大寫字母開頭,例如<Welcome />
-
組件必須先定義或引用纔可以使用
-
組件的返回值只能有一個根元素
-
建議從組件自身的角度來命名props,而不是根據使用組件的上下文命名
-
概念:純函數在函數內不改變傳入參數的值
-
全部的React組件必須像純函數那樣使用它們的props
-
狀態是私有的,徹底受控於當前組件
-
使用類就容許咱們使用其它特性,例如局部狀態、生命週期鉤子,抽象組件的區別
-
類組件應該始終使用props調用基礎構造函數
-
constructor(props){ super(props); this.state ={date:newDate()}; }
-
雖然this.props
由React自己設置以及this.state
具備特殊的含義,但若是須要存儲不用於視覺輸出的東西,則能夠手動向類中添加其餘字段
-
若是你不在render()
中使用某些東西,它就不該該在狀態中
-
使用setState()更新組件的局部狀態,狀態改變觸發render()渲染應該更新的元素
-
不能直接更新狀態,構造函數是惟一初始化this.state的方法
-
狀態更新是異步的,不能以此爲根據去計算下一個值
-
若是須要使用前一個state或者props做爲依據,可使用setState()接受一個函數,該函數接收先前的狀態做爲第一個參數,將這次更新被應用時的props作爲第二個參數:
-
this.setState((prevState, props) => ({ counter: prevState.counter + props.increment }));
-
setState()是淺合併只合並對應的屬性,沒對應的無論
-
組件的內部狀態其餘組件不可訪問,可是能夠將狀態作爲屬性傳遞給其子組件
-
狀態向子組件傳遞是單向的,自頂向下的,任何狀態始終由某些特定組件全部,而且從該狀態導出的任何數據或UI只能影響樹中下方的組件
-
組件是有狀態的仍是無狀態的是可能隨時間變化的
-
綁定事件的命名爲駝峯式寫法
-
JSX須要用大括號包起處理函數,DOM寫成字符串
-
<button onclick="activateLasers()"> Activate Lasers </button> <button onClick={activateLasers}> Activate Lasers </button>
-
使用preventDefault阻止默認行爲不能用return false
-
經過bind
方式向監聽函數傳參事件對象e要排在所傳參數的後面
-
在JSX中使用邏輯運算符&&或三目運算符,用花括號包裹
-
render()返回null阻止渲染
-
a key should be provided for list items
-
keys能夠給DOM中的某些元素被增長或刪除的時候幫助識別哪些元素髮生變化,因此數組中應給不一樣的key
-
JSX的大括號能夠包含任意的表達式
-
key不會傳遞給組件
-
map()嵌套太多考慮提取出組件
-
表單只接受一個惟一的name
-
使用受控組件表現表單這種自己具備狀態的元素,react負責渲染表單的組件控制用戶後續操做產生的變化
-
若是幾個組件須要公用狀態數據,最好將這部分提高至他們最近的父組件當中去管理
-
任何可變數據理應只有一個單一的數據源
-
建議使用組合而不是繼承
-
劃分你的組件(遵循單一功能原則)
-
建立一個靜態版本
-
定義UI狀態的最小表示,不要重複了
-
明確組件的狀態
-
處理反向數據流
-
state只在交互時使用,props是一種父級向子級傳遞數據的方式
-
自頂向下構建組件適於小型應用,自底向上適用於大型應用
-
底層組件的更新須要更高層級的組件狀態更新
-
區分props與state
-
思考你的應用
-
array
-
bool
-
func
-
number
-
object
-
string
-
symbol
-
node
(任何可被渲染的元素(包括數字、字符串、子元素或數組)
-
element
-
PropTypes.
instanceOf
(Message)
某個類的實例
-
PropTypes.
oneOf
(['News', 'Photos'])
限制爲某個特定值之一
-
PropTypes.
oneOfType
([PropTypes.string,PropTypes.number,PropTypes.instanceOf(Message)])
限制爲列舉的類型
-
PropTypes.
arrayOf
(PropTypes.number)
一個指定元素類型的數組
-
PropTypes.
objectOf
(PropTypes.number)
一個指定類型的對象
-
PropTypes.
shape
({color: PropTypes.string,fontSize: PropTypes.number})
一個指定屬性及其類型的對象
-
PropTypes.func.
isRequired
這樣若是這個屬性父組件沒有提供時,會打印警告信息
-
PropTypes.any.isRequired任意類型的數據
-
自定義驗證器,在'oneOfType'中不起做用
-
在arrayOf與objectOf中能夠提供自定義的驗證器
-
可使用defaultProps爲props定義默認值
-
對於大型的代碼庫建議使用Flow與TypeScript來代替PropTypes
-
Flow
-
TypeScript
-
Reason
-
Kotlin
-
F#/Fable
-
幾個適用的狀況,處理焦點、文本選擇或媒體控制、觸發強制動畫、集成第三方DOM庫
-
不要過分適用refs,組件state更爲清晰
-
ref接受一個回調函數,在組件被加載或卸載時會當即執行
-
回調會在componentDidMount或componentDidUpdate這些生命週期回調以前執行
-
加載時將DOM元素傳入ref的回調函數,卸載時傳入null
-
當ref屬性用於適用class聲明的自定義組件時,回調接受加載的React實例,僅對class聲明的組件有效
-
不能在函數式組件上使用(function component() {}),由於他們沒有實例
-
可是隻要ref指向一個DOM元素或者class組件,他就能在組件內部使用
-
只提供初始值和獲取結果,其他表單數據由DOM處理
-
<input />
type爲text,<select></select>
,<textarea>
支持defaultValue,type是radio和checkbox支持defaultChecked
-
虛擬DOM,當組件的props或者state改變時,React比較新返回的元素個以前渲染的元素來決定是否有必要更新實際的DOM,不相等時會更新DOM
-
利用shouldComponentUpdate返回true時React執行更新
-
返回fasle跳過整個渲染進程,包括組件和以後的內容調用render()
-
React.PureComponent沒必要寫本身的shouldComponentUpdate,它只作一個淺比較。可是淺比較會忽略屬性或狀態突變的狀況,此時不能使用它
-
使用不可突變的數據結構能夠更輕鬆的追蹤對象變化
小知識點
-
組件的命名的首字母要大寫,這是類命名的規範
-
setSate()是異步的
setState()會調用render方法,可是不會當即改變state的值,state是在render方法中賦值的。因此在執行setState()後當即獲取state的值是不變的。一樣的直接賦值state並不會觸發更新,由於沒有調用render函數。
-
reducer必須返回一個新的對象才能出發組件的更新
由於在connect函數中會對新舊兩個state進行淺對比,若是state只是值改變可是引用地址沒有改變,connect會認爲它們相同而不觸發更新。
-
不管reducer返回的state是否改變,subscribe中註冊的全部回調函數都會被觸發
-
組件卸載以前,手動加載的監聽事件和定時器要手動清除,由於這些不是react的控制範圍內,必須手動清除。
-
class變爲className,for變成htmlFor,由於class和for變成了關鍵字
-
不得使用setState的事件
-
shouldComponentUpdate(nextProps, nextState)
-
componentWillUpdate(nextProps, nextState)
-
render()
-
存取DOM的適當時機