1. 程式人生 > >React核心內容歸納總結

React核心內容歸納總結

狀態、屬性、元件API、元件的生命週期

當react的狀態改變時,自動執行this.render()方法更新元件
ES6寫React的時候,事件裡不會自動繫結this,需要自己繫結,或者直接在constructor裡寫方法

constructor(props) {
    super(props);
    this.state = {
        liked: false
    };
    this.handleClick = (e) => {
        this.setState({liked: !this.state.liked});
    };
}

狀態

import React from 'react';

class LikeButton extends React.Component {
    
// es6用constructor代替getInitialState constructor(props) { super(props); this.state = { liked: false } } handleClick (e) { this.setState({liked: !this.state.liked}) } render () { let text = this.state.liked ? '喜歡': '不喜歡'; return
( <div> <p onClick={this.handleClick.bind(this)}> 你喜歡紅茶嗎?{text} </p> </div> ) } } export default LikeButton;

props
HelloMessage.jsx

import React from 'react';

class HelloMessage extends React.Component {
    render () {
        
return ( <div> Hello, {this.props.name} </div> ) } } export default HelloMessage;

main.js

import React from 'react';
import ReactDOM from 'react-dom';

import HelloMessage from './component/HelloMessage';

const app = document.getElementById('app');

ReactDOM.render(<HelloMessage name="Runoob"/>, app);

props驗證
可以保證應用元件被正確使用
React.PropTypes提供很多驗證器(validator)來驗證傳入資料是否有效。當props傳入無效資料時,JavaScript控制檯會丟擲錯誤。

import React from 'react';

class HelloMessage extends React.Component {
    render () {
        return (
            <div>
                Hello, {this.props.name}
            </div>
        )
    }
}

// getDefaultProps要寫在外部
HelloMessage.defaultProps = {
    name: 'this is default name'
};

HelloMessage.propTypes = {
    name: React.PropTypes.string.isRequired
};

export default HelloMessage;

更多驗證器

React.createClass({
  propTypes: {
    // 可以宣告 prop 為指定的 JS 基本資料型別,預設情況,這些資料是可選的
   optionalArray: React.PropTypes.array,
    optionalBool: React.PropTypes.bool,
    optionalFunc: React.PropTypes.func,
    optionalNumber: React.PropTypes.number,
    optionalObject: React.PropTypes.object,
    optionalString: React.PropTypes.string,

    // 可以被渲染的物件 numbers, strings, elements 或 array
    optionalNode: React.PropTypes.node,

    //  React 元素
    optionalElement: React.PropTypes.element,

    // 用 JS 的 instanceof 操作符宣告 prop 為類的例項。
    optionalMessage: React.PropTypes.instanceOf(Message),

    // 用 enum 來限制 prop 只接受指定的值。
    optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),

    // 可以是多個物件型別中的一個
    optionalUnion: React.PropTypes.oneOfType([
      React.PropTypes.string,
      React.PropTypes.number,
      React.PropTypes.instanceOf(Message)
    ]),

    // 指定型別組成的陣列
    optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),

    // 指定型別的屬性構成的物件
    optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),

    // 特定 shape 引數的物件
    optionalObjectWithShape: React.PropTypes.shape({
      color: React.PropTypes.string,
      fontSize: React.PropTypes.number
    }),

    // 任意型別加上 `isRequired` 來使 prop 不可空。
    requiredFunc: React.PropTypes.func.isRequired,

    // 不可空的任意型別
    requiredAny: React.PropTypes.any.isRequired,

    // 自定義驗證器。如果驗證失敗需要返回一個 Error 物件。不要直接使用 `console.warn` 或拋異常,因為這樣 `oneOfType` 會失效。
    customProp: function(props, propName, componentName) {
      if (!/matchme/.test(props[propName])) {
        return new Error('Validation failed!');
      }
    }
  },
  /* ... */
});

React元件API
setState 設定狀態
replaceState 替換狀態
setProps 設定屬性
replaceProps 替換屬性
forceUpdate 強制更新
findDOMNode 獲取DOM節點,查詢真實DOM

React.findDOMNode()只在mounted元件中呼叫,如果在元件的render()方法中呼叫React.findDOMNode()就會丟擲異常。


React元件的生命週期
元件生命週期的三個狀態
Mounting: 已插入真實DOM
Updating: 正在被重新渲染
Unmounting: 已移除真實DOM

生命週期方法
componentWillMount 在渲染前呼叫,在客戶端也在服務端
componentDidMount 在第一次渲染後呼叫,只在客戶端。
之後元件已經生成了對應的DOM結構,可以通過this.getDOMNode()來進行訪問。
如果你想和其他JavaScript框架一起使用,可以在這個方法中呼叫setTimeout, setInterval或者傳送AJAX請求等操作(防止異部操作阻塞UI)。
componentWillReceiveProps 在初始化render時不會被呼叫,當元件接收到一個新的prop時被呼叫
shouldComponentUpdate 返回一個布林值。當確認不需要更新元件時使用。在元件接收到新的state或新的props時被呼叫。在初始化時或使用forceUpdate時不被呼叫
componentWillUpdate 初始化不會呼叫。元件接收到新的state或者props但還沒有render時被呼叫
componentDidUpdate 初始化不會呼叫。元件完成更新後立即呼叫。
componentWillUnmount 元件從DOM中移除的時候立刻被呼叫。

用state判斷是否已經插入真實DOM

componentWillMount() {
    this.mounted = false;
}
componentDidMount() {
    this.mounted = true;
}

需求:寫一個例項,在元件載入以後,通過componentDidMount設定一個定時器,改變元件的透明度並重新渲染
HelloMessage.jsx

import React from 'react';

class HelloMessage extends React.Component {
    constructor (props) {
        super(props);
        this.state = {
            opacity: 1.0
        };
    }
    componentDidMount () {
        this.timer = setInterval(() => {
            let opacity = this.state.opacity;
            opacity -= 0.05;
            if(opacity <= 0.1) {
                opacity = 1.0;
            }
            this.setState({
                opacity: opacity
            });
        }, 100);
    }
    render () {
        let myStyle = {
            fontFamily: 'microsoft yahei',
            width: '100%',
            height: '100px',
            background: 'red',
            opacity: this.state.opacity
        };

        return (
            <div style={myStyle}>
                Hello, {this.props.name}
                <p>{this.state.opacity}</p>
            </div>
        )
    }
}

// getDefaultProps要寫在外部
HelloMessage.defaultProps = {
    name: 'this is default name'
};

HelloMessage.propTypes = {
    name: React.PropTypes.string.isRequired
};

export default HelloMessage;

另一個例項,體現react的生命週期

import React from 'react';

class Content extends React.Component {
    componentWillMount () {
        console.log('元件將被插入到真實DOM');
    }
    componentDidMount () {
        console.log('已經插入真實DOM');
    }
    componentWillReceiveProps (newProps) {
        console.log('元件將要接收屬性,新屬性是:');
        console.log(newProps);
    }
    shouldComponentUpdate (newProps, newState) {
        return true;
    }
    componentWillUpdate (nextProps, nextState) {
        console.log('元件將要更新,下一個屬性:' + nextProps + ',下一個狀態:' + nextState);
        console.log(nextProps);
    }
    componentDidUpdate (prevProps, prevState) {
        console.log('元件已更新,上一個屬性:' + prevProps + ',上一個狀態:' + prevState);
        console.log(prevProps);
    }
    componentWillUnmount () {
        console.log('已經移除真實DOM');
    }
    render () {
        return (
            <div>
                次數:{this.props.myNum}
            </div>
        )
    }
}

class Increment extends React.Component {
    constructor (props) {
        super(props);
        this.state = {
            data: 0
        };
    }
    setNewNumber () {
        this.setState({
            data: this.state.data + 1
        });
    }
    render () {
        return (
            <div>
                <button onClick={this.setNewNumber.bind(this)}>Increment</button>
                <Content myNum={this.state.data}/>
            </div>
        )
    }
}

export default Increment;

未完待續 ... ...

相關推薦

React核心內容歸納總結

狀態、屬性、元件API、元件的生命週期 當react的狀態改變時,自動執行this.render()方法更新元件 ES6寫React的時候,事件裡不會自動繫結this,需要自己繫結,或者直接在constructor裡寫方法 constructor(props) {

【GPU精粹與Shader程式設計】(四) 《GPU Gems 2》全書核心內容提煉總結 · 上篇

毛星雲,網路ID「淺墨」,90後,熱愛遊戲開發、遊戲引擎、計算機圖形、實時渲染等技術,就職於騰訊互娛。 微軟最有價值專家 著作《Windows遊戲程式設計之從零開始》、《OpenCV3程式設計入門》 碩士就讀於南京航空航天大學航天學院(2013級碩士研究生),已於2016年三月畢業。本科

【GPU精粹與Shader程式設計】(八) 《GPU Pro 1》全書核心內容提煉總結

        本文由@淺墨_毛星雲 出品,首發於知乎專欄,轉載請註明出處   本文是【GPU精粹與Shader程式設計】系列的第八篇文章,全文共兩萬餘字。文章盤點、提煉和總結了《GPU Pro 1》全書總計22章的核心內容。 題圖來自《荒野大鏢客2》。

【GPU精粹與Shader程式設計】(二) 《GPU Gems 1》全書核心內容提煉總結 · 上篇

                                    本文由出品,首發於知乎專欄,轉載請註明出處  題圖背景來自《戰神4》。 系列文章前言 我們知道,《GPU Gems》1~3 、《GPU Pro》1~7 以及《GPU

【GPU精粹與Shader程式設計】(三) 《GPU Gems 1》全書核心內容提煉總結 · 下篇

本文由出品,首發於知乎專欄,轉載請註明出處 題圖背景來自《神祕海域4》。系列文章前言《GPU Gems》1~3 、《GPU Pro》1~7 以及《GPU Zen》組成的饕餮盛宴,共11本書,合稱“GPU精粹三部曲“,是遊戲開發、計算機圖形學和渲染領域的業界頂尖大牛們一線經驗的

【GPU精粹與Shader程式設計】(五) 《GPU Gems 2》全書核心內容提煉總結 · 下篇

                          本文由@淺墨_毛星雲 出品,首發於知乎專欄,轉載請註明出處   本文核心內容為《GPU Gems 2》中講到的真實感水體渲染,以及真實感頭髮渲染、通用的折射模擬、改進的Perlin噪聲等次核心內容。

Linux 核心 Starting kernel ... 串列埠無輸出問題歸納總結

Starting kernel ... Uncompressing Linux....................................................................................................................

編譯Android原始碼和核心原始碼的歸納總結

經過一個多星期的努力,終於在零基礎的情況下在ubuntu-12.04-desktop-amd64(64位Ubuntu系統)成功編譯了android-4.0.3的原始碼和Linux version 2.6.29的linux核心原始碼。期間遇到很多困難,好幾次想放棄

React-Native開發總結+構建-除錯-基礎歸納總結

更新時間:2017年11月07日16:47:07    對於前端工程師來說,這幾年是最輝煌的時刻,前端框架層出不窮,而且出現了像RN這種功能的框架,更讓移動開發工程師大跌眼鏡望洋興嘆。新技術的不斷湧現,說明了一個問題,前端在程式設計技術界的地位越來越高,而且前端工程師的崗位越

mysql ACID與四種隔離級別歸納總結

重新 style 出現 等待 mic 復讀 級別 for 保存 關於數據庫的ACID特性已經有很多的介紹,這裏再重新歸納總結一下: A(atomicity)原子性:   即事務要麽全部做完,要麽全部不做,不會出現只做一部分的情形,如A給B轉帳,不會出現A的錢少了,

react生命周期總結

react 生命周期 當通過createClass創建了組件之後,該React組件就有了生命周期。通常一個React組件的生命周期可分為三個階段:Mounting:掛載組件,也就是組件實例化ReciveProps:存在期,在這個時期組件的props和state會變化,重新渲染組件Unmounting:

React Native細節知識點總結<一>

idm tdi 刷新 循環 chan filelist sse inpu function 1.propTypes: static propTypes = { name:PropTypes.string, ID:PropTypes.num

30分鐘掌握ES6/ES2015核心內容[上和下], 不錯的說

還得 天下 span default es6 ava arguments nts http ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標準。因為當前版本的ES6是在2015年發布的,所以又稱ECMAScript 2015。 也就是說,E

React Native使用Redux總結

war lda 技術 pan strong blog connect lar win 1>npm安裝redux: "react-redux": "^5.0.5", "redux": "^3.7.1", "redux-thunk": "^2.2.0" 2>大

React Native使用Mobx總結

color nsh ... 博客 react 下大雨 shu mas https 參考博客: http://www.jianshu.com/p/505d9d9fe36a 這是目前為止覺得最詳細學習的博客了 Mobx實現購物車Demo: https://github

C#方法有關內容總結--C#基礎

programe height tasks adk 實例方法 text 三角形面積 string math.sqrt 1、靜態方法與實例方法 using System;using System.Collections.Generic;using System.Linq;u

關於《軟件需求分析》需要掌握哪些必要的內容總結與思考

http 可控 那種 基礎 由於 這一 技術 行為 領域 一、軟件需求的目的: 1.準確的理解和描述客戶需要的功能 客戶只知道他不滿意,但怎樣才能使他滿意呢?他不知道,於是就在一點兒一點兒試,於是這種反復變更就這樣發生了。 如果我們明白了這一點,深入地去理解客戶的業務,

字符串類型內建方法歸納總結

內建函數版本:python3.6在查看bulitins的內建函數時,對字符串的內建方法進行了分類總結。類別 方法描述示例查找string.find(sub, start=None, end=None)在指定的範圍內查找子串,找到則返回最小的index;未找到則返回-1mystr = ‘hello world

詳解斯坦納點及斯坦納樹及模版歸納總結

什麽是 com 需要 spa hub 等於 pac 其中 給定 ①什麽是斯坦納點? 假設原來已經給定了個點,庫朗等指出需要引進的點數至多為,此種點稱為斯坦納點。過每一斯坦納點,至多有三條邊通過。若為三條邊,則它們兩兩交成120°角;若為兩條邊,則此斯坦納點必為某一已

Hibernate核心接口總結

www html iar hibernate store c89 idt 核心 udf 1zazm7縣珊群啦號偎http://weibo.com/p/1005056358280635i9p7vt宰玖胤綠刑舊http://www.docin.com/bqpgm5506dsrl