1. 程式人生 > >你必須知道的React的知識點:單向資料流,高效能虛擬DOM,元件間的資料互動,事件與資料的雙向繫結,生命週期鉤子,fetch:資料請求等

你必須知道的React的知識點:單向資料流,高效能虛擬DOM,元件間的資料互動,事件與資料的雙向繫結,生命週期鉤子,fetch:資料請求等

1、React除錯工具:React Developer Tools

2、React開發工具:Atom

3、React UI庫:Material-UI / Ant Deaign

4、React適用場景:資料不斷變化的大型應用程式

5、前端UI構建方式:資料模型、UI介面

6、單向資料流:資料模型驅動UI介面(從資料到檢視的資料流動)

7、高效能虛擬DOM:

  • 虛擬DOM是在瀏覽器端用JS實現了一套DOM API

  • 每當資料變化時,React會重新構建整個DOM樹,並將當前的樹和上一次的DOM樹進行對比,得到DOM結構的區別。然後僅僅將需要變化的部分進行實際的瀏覽器DOM更新

  • 而且,React能夠批處理虛擬DOM的重新整理,在上一個事件迴圈內兩次資料變化會被合併

  • 雖然每次都要構造完整的虛擬DOM樹,但因為它是記憶體資料,效能極高,對實際DOM的操作,僅僅是Diff部分

8、元件:將UI拆成不同的元件,每個元件獨立封裝,每個元件只關心自己的邏輯,彼此獨立。元件應具備特徵:可組合、可複用、可維護、可測試

9、元件間的資料互動:

  • state:自身屬性的初始化賦值

    • 作用域:只會管理當前的這個Class作用域,不會汙染其他模組

    • this.state.xxx更改了state裡的資料,但是不會改變檢視

    • this.setState({xxx: changeXxx})會立即引起頁面的重繪,Diff運算後只更改資料變化的地方。

  • props:外來屬性的管理

    • 建構函式construtor裡的super:呼叫基類所有的初始化方法

    • 用於初始化子元件資料

    • React 認為,props屬性應該是隻讀的,一旦賦值過去就不要再變化了

    • 在開始和結束標籤之間放入一個字串,則props.children就是那個字串。(傳遞給自定義元件的子代可以是任何元素,只要該元件在React渲染前將其轉換成React能夠理解的東西)

  • construtor定義的屬性:this.xxx

    • 該屬性改變不會引發檢視的改變,並且屬於當前類Class的作用域

    • 可定義的值:只在本元件內使用且不需要改變檢視的值

  • 在當前元件裡,但是在類Class外面定義的變數:const xxx = ''

    • 該屬性改變不會引發檢視改變,並且屬於當前元件的作用域

10、事件與資料的雙向繫結:子元件向父元件傳遞資料

  • 普通函式需要手動繫結this,不然函式裡的this指向會有問題:onClick={this.changeEvent.bind(this)}(或者使用箭頭函式)

  • 子元件呼叫父元件的函式:實現子元件向父元件傳遞引數

在子頁面中通過 呼叫父頁面傳遞過來的事件 props 進行元件間的引數傳遞

子元件:ChildComponent

<input onChange={this.props.handleChildChange} />

父元件:

handleChildChange (event) {

    this.setState({

        age: event.target.value

    })

}

<ChildComponent {…this.props} handleChildChange={this.handleChildChange.bind(this)}/>

 

11、component 對外來屬性進行驗證和約束:

  • defaultProps:設定屬性的預設值,避免prop未傳值時報錯

  • propType:對屬性進行驗證和約束

    • 當為prop提供無效值時,控制檯將顯示警告。

    • 出於效能原因,僅在開發模式下檢查propTypes。

    • propType型別檢查發生在defaultProps解析之後,因此檢查型別也將應用於defaultProps

    • 注意:React.PropTypes自React v15.5起已棄用,請使用prop-types庫代替

import React, { Component } from ‘react'

import PropTypes from 'prop-types’



class ChildClass extends Component {

    static propTypes = {

        data: PropTypes.object.isRequired // data為物件且必傳

    }

    static defaultProps = {

        data: {}

    }

}

12、生命週期鉤子

  • getDefaultProps()

  • getInitialState()

  • componentWillMount()

  • render():first time

  • componentDidMount()

  • componentWillReceiveProps(nextProps)

  • shouldComponentUpdate(nextProps, nexrState)

  • componentWillUpdate(nextProps, nexrState)

  • render():after first time,會執行componentDidUpdate、componentWillUnmount

  • componentDidUpdate()

  • componentWillUnmount()

  • 栗子(生命週期執行順序):父元件componentWillMount() => 子元件componentWillMount() => 子元件componentDidMount() => 父元件componentDidMount()

13、fetch:資料請求【詳情看ES6:node-fetch筆記】

  • get 請求:( method: ‘GET’ )

    • 引數傳遞:把引數拼接在URL上

  • post 請求:( method: ‘POST’ ) 

    • POST 請求的引數一定不能放URL中,為防止資訊洩漏

    • 引數傳遞:body:JSON.stringify(obj)

    • ‘Content-Type’: ‘application/json'

    • 返回的 Promise 物件 res.text() // 返回字串

sedGet = async (url = '', params) => { // GET 請求

    let urlParams = ‘'

    if (params) {

        let paramsArray = []

        Object.keys(params).forEach(key => params[key] && paramsArray.push(key + ‘=‘ + params[key]));

        if (urlParams.search(/\?/) === -1) {

            urlParams += ‘?’ + paramsArray.json(‘’&);

        } else {

            urlParams += ‘&’ + parsmsArray.join(‘&’);

        }

    }

    let res = await fetch(`${HTTP + url + urlParams}`,

        {

            credentials: ‘include'

        });

    let response = await res.json();

    return response

}
handleSubmit = async () => { // 或者用不用async語法糖,用this.sedGet.then()也可以,因為返回的是一個 promise 物件。若兩者都不用,直接呼叫報錯。

    // 呼叫 sedGet 函式並傳參

    let response = await this.sedGet(url, params)

    // 對 response 資料進行邏輯處理

}

 

14、Router

15、Mixins:獨立元件間共享Mixins

16、ref:操作節點

17、Css模組化:PostCss

18、JSX內建表示式

 

React 文件:https://doc.react-china.org/docs