前言
React核心的單向數(shù)據(jù)流、一切皆數(shù)據(jù)的state、不會(huì)改變的props,以及狀態(tài)提升等等經(jīng)常使用便不多總結(jié),需要的看官方文檔。
JSX
JSX 本質(zhì)只是為 React.createElement(component, props, ...children)提供的語(yǔ)法糖!
以下兩段代碼等價(jià)(許多react的界面設(shè)計(jì)器通過這個(gè)原理,達(dá)到元數(shù)據(jù)轉(zhuǎn)化React元素,實(shí)現(xiàn)界面化編程!)
嵌套就是多個(gè)create方法的嵌套。
function hello() { return <div className="red">Hello,<span>world!</span></div>; } "use strict"; function hello() { return React.createElement( "div", { className: "red" }, "Hello,", React.createElement( "span", null, "world!" ) ); }
需要循環(huán)和條件渲染可以使用map、三目,或者使用if/for在jsx代碼之外!
//錯(cuò)誤的! class A extends React.Component { render() { return <div>{if(){}else{}}</div>;//原來還蒙蔽的不知道為什么錯(cuò)了0.0 } }
React.Component (組件)
創(chuàng)建組件的四種方式:
React.Component 方式
class Greeting extends React.Component { render() { return <h1>Hello, {this.props.name}</h1>; } }
ES5
var createReactClass = require('create-react-class'); var Greeting = createReactClass({ render: function() { return <h1>Hello, {this.props.name}</h1>; } }); //或者使用react var Greeting = React.create({ render: function() { return <h1>Hello, {this.props.name}</h1>; } });
函數(shù)式
const Button = ({ day, increment }) => { return ( <div> <button onClick={increment}>Today is {day}</button> </div> ) }
PureComponet
大多數(shù)情況下, 我們使用PureComponent能夠簡(jiǎn)化我們的代碼,并且提高性能,但是PureComponent的自動(dòng)為我們添加的shouldComponentUpate函數(shù),只是對(duì)props和state進(jìn)行淺比較(shadow comparison),當(dāng)props或者state本身是嵌套對(duì)象或數(shù)組等時(shí),淺比較并不能得到預(yù)期的結(jié)果,這會(huì)導(dǎo)致實(shí)際的props和state發(fā)生了變化,但組件卻沒有更新的問題。當(dāng)然還是有解決的方法的,所以建議還是少用。
事件處理
事件綁定的四種方法:推薦使用第一第二種。
class Toggle extends React.Component { constructor(props) { {...} //方法一必須在這里綁定 this.handleClick1 = this.handleClick.bind(this); } handleClick1() { this... } //方法二使用【屬性初始化器語(yǔ)法】【需要開啟babel stage-0以上】 handleClick2=()=> { this... } render() { return ( <div> <button onClick={this.handleClick1}></button> <button onClick={this.handleClick2}></button> //方法三在使用時(shí)綁定 <button onClick={this.handleClick1.bind(this)}></button> //方法四在回調(diào)函數(shù)中使用 箭頭函數(shù) /** 渲染的時(shí)候都會(huì)創(chuàng)建一個(gè)不同的回調(diào)函數(shù)。在大多數(shù)情況下,這沒有問題。然而如果這個(gè)回調(diào)函數(shù)作為一個(gè)屬性值傳入低階組件,這些組件可能會(huì)進(jìn)行額外的重新渲染。我們通常建議在構(gòu)造函數(shù)中綁定或使用屬性初始化器語(yǔ)法來避免這類性能問題。 **/ <button onClick={(e) => this.handleClick1(e)}></button> </div> ); } }
組合 vs 繼承
在React中不推薦使用繼承,不推薦繼承自定義Component。
//不推薦使用 class Parent extends React.Component { render() { return <div>...</div>; } } class A extends Parent { render() { return <div>...</div>; } } //推薦使用 class A extends React.Component { render() { return <Parent>...</Parent>; } }
不使用 ES6
class Greeting extends React.Component { constructor(props) { super(props); this.state = {count: props.initialCount}; this.handleClick = this.handleClick.bind(this); } handleClick() { alert(this.state.message); } render() { return <h1 onClick={this.handleClick}>Hello, {this.props.name}</h1>; } } Greeting.defaultProps = { name: 'Mary' }; var createReactClass = require('create-react-class'); var Greeting = createReactClass({ getInitialState: function() { return {count: this.props.initialCount}; }, getDefaultProps: function() { return { name: 'Mary' }; }, handleClick: function() { alert(this.state.message); }, render: function() { //組件中的方法會(huì)自動(dòng)綁定至實(shí)例,不需要像上面那樣加 .bind(this) return <h1 onClick={this.handleClick}>Hello, {this.props.name}</h1>; } });
Refs
1.如果可以通過聲明式實(shí)現(xiàn),則盡量避免使用 refs。
2.不能在函數(shù)式組件上使用 ref 屬性,因?yàn)樗鼈儧]有實(shí)例
3.舊版 API:String 類型的 Refs,存在問題,可能會(huì)在未來移除,不推薦使用。
4.對(duì)父組件暴露refs,在父元素拿子元素
function CustomTextInput(props) { return ( <div> <input ref={props.inputRef} /> </div> ); } class Parent extends React.Component { //this.inputElement 就是CustomTextInput中的input render() { return ( <CustomTextInput inputRef={el => this.inputElement = el} /> ); } }
ReactDOM
獲取一個(gè)DOM除了refs還有更加簡(jiǎn)單粗暴的方法findDOMNode。
findDOMNode 是用于操作底層DOM節(jié)點(diǎn)的備用方案。使用它的優(yōu)先級(jí)比refs更低!!
findDOMNode 只對(duì)掛載過的組件有效。
findDOMNode 不能用于函數(shù)式的組件中。
import ReactDOM from 'react-dom'; ReactDOM.render( element, container, [callback]//不為人知的第三個(gè)參數(shù)!! ) ReactDOM.unmountComponentAtNode(container) ReactDOM.findDOMNode(component)
不常用的新發(fā)現(xiàn)
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com