React元件
React的元件大概分為倆部分,無狀態元件和有狀態元件
- 無狀態元件。下面React官網中定義的一個無狀態元件,值得注意的是無狀態元件無this屬性,只是負責展示一個button。
- 最輕量級的元件,可以簡單的用來剪下字串,轉換大小寫等簡單的小功能。
- 就是一個render函式,所以沒有this
- 據說有針對性的效能優化
- 沒有生命週期方法,只有在props發生變化時才可以更新UI
- 無法使用this.xxx
function Square(props) {
return (
<button className="square" onClick={props.onClick}>
{props.value}
</button>
);
}
複製程式碼
- 有狀態元件。我們們會從幾個點了解有狀態元件,分別是state,setState,props,children以及lifecycle(生命週期函式)。
- state是一組與渲染有關的變數的集合
- setState(updater[, callback]).
- updater 可以是一個json,對應著state的變化,也可以是一個函式,提供準確的上下文物件。
// 當前handelClick每次點選只會加一,因為setState的更新使用了批量更新機制,倆次setState會一起執行,所以解決這個問題需要給setState傳遞函式物件 export class Demo extends React.Component { constructor(){ super(); this.state = { count: 0 } } handelClick = () => { this.setState({ count: this.state.count + 1 }); this.setState({ count: this.state.count + 1 }) } render() { return ( <div> <button onClick={this.handelClick}>{this.state.count}</button> </div> ) } } 複製程式碼
- state的最佳實踐
- 只渲染需要的狀態,保持state的簡潔
- 可以從props推導的不寫
- 其他狀態可以作為函式或者class的屬性
- 理由: 保持程式碼的簡潔,避免不必要的渲染
- 有狀態元件
- 宣告方式
- 函式式
- React.createClass
- ES2015-class
export class Demo extends React.Component { static propTypes = { name: PropTypes.string } static defaultProps = { name: "Hello Props" } constructor(props){ super(props); this.state = { count: 0 } } handelClick = () => { this.setState({ count: this.state.count + 1 }); this.setState({ count: this.state.count + 1 }) } render() { return ( <div> <h1>{this.props.name}</h1> <button onClick={this.handelClick}>{this.state.count}</button> </div> ) } } 複製程式碼
- props
- 最好定義propTypes以及defaultProps
- props最佳實踐
- 簡潔的引數提高可測性,可讀性,props只用基礎資料結構
- 用props的複雜程度判斷是否拆分元件
- props只讀,不允許更改
- 事件使用統一命名,使用箭頭函式宣告
- CHILDREN children可以是任何東西
- children的幾個語法糖
- React.Children.map 無論children是什麼型別都會執行
- React.Children.count 返回children的length
- React.Children.toArray 變成陣列
- children的幾個語法糖
- 宣告方式