1. 程式人生 > >react學習總結1--基礎(一)

react學習總結1--基礎(一)

react 學習總結–基礎(一)

說明

React 版本 :”15.4.1”

react-tap-event-plugin 版本: “^2.0.1”

1.react 是什麼

React 是 Facebook 內部的一個JavaScript類庫,可用於建立Web使用者互動介面。他引入了一種新的方式來處理瀏覽器DOM,只需要宣告式的定義各個時間點的使用者介面,無需關心資料變化時需要更新那一部分DOM。在任何時間點,React都能以最小的DOM修改來更新整個應用程式。

react 的特點

react 將原本的DOM操作接管,提出了 Virtual DOM(虛擬DOM)、單項資料流、用很少的介面覆蓋在元件開發的生命週期上,採取宣告式的語法等,實現了一個純粹的元件“引擎”。

react 鼓勵你為每一個關注點創造一個獨立的元件,並把所有的邏輯和標籤封裝在其中

一個完整的例子
    import React,{Component} from 'react';
    import ReactDOM from 'react-dom';

    export default class Child extends Component{
        constructor(props){
            super(props);
        }
        render(){
            return (
                <div
>this is component</div> ) } } ReactDOM.render(( <Child /> ),document.getElementById('app'));

2.JSX

JSX 即 JavaScript XML 一種在React元件內部構建標籤的類XML語法。React在不使用JSX的情況下一樣可以工作,然而使用JSX可以提高元件的可讀性

JSX 以乾淨整潔的方式保證了元件中的標籤與所有業務邏輯的相互分離,他不僅提供了一個清晰、直觀的方式來描述元件樹,同時還讓你的應用程式更加符合邏輯

JSX 與 HTML 有何不同

JSX 以與 HTML 同樣的方式給每個節點設定屬性,同時還提供了將屬性設定為動態的JavaScript變數的便利

HTML:
<div id="div-id" class="div-class"></div>

JSX:
<div id={divId} className={divClass}></div>

屬性值{}可以設定為一個函式呼叫的返回結果,但是不能直接加入if/else邏輯,解決的辦法就是使用以下運算子

  • 使用三目運算子 flag ? true : false;
  • 設定一個變數並在屬性中引用他
  • 講邏輯轉化到函式中
  • 使用 && 運算子

非DOM屬性 key(鍵) / ref(引用)

事件,react的事件名已經被規範化並統一用駝峰形式表示,例如click變為onClick

註釋,jsx本質就是JavaScript,註釋有兩種形式

  • 當做一個元素的子節點 <div> {/* 子節點 */} <p>內容</p></div>
  • 內聯在元素的屬性中 <div /* 屬性中 */ class="div-class">內容</div>

特殊屬性 for => htmlFor , class => className

樣式,內聯樣式,只需要把駝峰形式的命名和期望的css值拼接成物件即可

3.元件的生命週期

例項化階段

一個例項初次被呼叫時的生命週期方法,首次使用一個元件類時,下面這些方法依次被呼叫:

  • getDefaultProps
  • getInitialState
  • componentWillMount
  • render
  • componentDidMount

再次呼叫元件類建立新的例項時,除 getDefaultProps 外都會被重新呼叫

getDefaultProps

在元件類建立的時候呼叫一次,這個方法返回的物件用於為例項設定預設的props值,會合併到 this.props

該方法返回的任何複雜的值,例如物件和陣列,都會在所有例項中共享,而不是拷貝或者克隆

    getDefaultProps(){
        return {
            title : '' 
        };
    }
getInitialState

對元件的類的每個例項來說,只調用一次,返回值作為this.state的初始值,在這個方法裡,已經可以訪問到 this.props

    getInitialState(){
        return {
            list : []
        }
    }
componentWillMount

該方法會在完成首次渲染之前被呼叫,且只調用一次,此方法中可以感知到state,是render之前修改 state的最後一次機會,修改state之後不會再次呼叫

    constructor(props) {
        super(props);
        this.state = {
          num : 0
        };
    }
    componentWillMount() {
      console.log(this.state.num); //0,只會列印一次
      this.setState({num:2});
    }
render

render 是組建唯一一個必須的方法,在這裡會建立一個虛擬的DOM,來表示元件的輸出

render 中需要遵守特定的規則

  • 只能通過 this.props 和 this.state 訪問資料
  • 可以返回任何 React 元件 或者 null,false 來表明不需要渲染任何東西,React 渲染一個
    <noscript></noscript> 標籤來處理當前的差異檢查邏輯
  • 只能出現一個頂級元件(不能返回一組元素)
  • 必須純淨,此方法內不要修改元件的 state ,不讀寫DOM資訊,也不要和瀏覽器互動

render 方法返回的結果不是真正的DOM,而是一個虛擬的表現,React隨後會把它和真實的DOM做對比,來判斷是都有必要做修改

    render() {
        return (
        <div className="container">
            <div style={{display : this.state.close ? 'none' : 'block'}} className="header">
                {this.props.headerText}
            </div>
            <div className="content">
                {this.props.content}
            </div>
        </div>
    }
componentDidMount

render 方法成功呼叫 初始化渲染執行之後立刻呼叫一次,僅客戶端有效(伺服器端不會呼叫),在此階段中,可以訪問真實的DOM元素,如果想與其他框架整合,可以在此方法中進行

    componentDidMount(){
        console.log(ReactDOM.findDOMNode(this.refs.a)); //輸出真實的DOM節點
    }

存在期

此時元件已經渲染好,並且使用者可以與它進行互動,
隨著應用狀態的改變,下列方法依次被呼叫

  • componentWillReceiveProps
  • shouldComponentUpdate
  • componentWillUpdate
  • render
  • componentDidUpdate
componentWillReceiveProps

在任意時刻,元件的props都可以通過父輩元件來更改,在組建接收到新的props的時候就會呼叫此方法,在初始化渲染的時候此方法不會被呼叫,在函式中呼叫this.setState()將不會引起第二次渲染

    componentWillReceiveProps(nextProps) {
        if (nextProps.checked !== undefined) {
          this.setState({
            checked : nextProps.checked
          })
        }
    }
shouldComponentUpdate

在接收到新的props或者state,將要渲染之前呼叫,通過返回的true/false決定元件是否更新
如果返回 false ,那麼render 將不會被執行,componentWillUpdate 和 componentDidUpdate 也不會被執行

  shouldComponentUpdate(nextProps, nextState) {
    if (nextProps.num === this.props.num && nextState.num === this.state.num) {
      return false;
    }
  }
componentWillUpdate

元件在接收到新的props或者state之前立刻呼叫,做一些更新前的準備,不能在此方法中呼叫this.setState(),需要更新state或者props可以再 componentWillReceiveProps中更新

  componentWillUpdate(nextProps, nextState) {
    console.log(nextProps);
    console.log(nextState);
  }
componentDidUpdate

與 componentDidMount 類似的方法,給了我們更新已經渲染好的DOM的機會,可以操作真實DOM

  componentDidUpdate(prevProps, prevState) {
    console.log(prevProps);
    console.log(prevState);
  }

銷燬期

元件被使用完成後

  • componentWillUnmount
componentWillUnmount

元件被移除前呼叫,執行必要的清理任務,例如無效的定時器,在componentDidMount中建立的DOM元素等

  componentWillUnmount() {
    clearInterval(this.timer);
  }

4.下一篇內容傳送門

  • react 資料流
  • 事件處理
  • 複合元件
  • DOM操作
  • 表單