React要點整理

bind的意義

以下組件在construtor中使用bind將onClick與類成員函數(shù)綁定:

import React, { Component } from 'react';

export default class ClickCounter extends Component {
    constructor(props) {
        super(props);
        this.onClick = this.onClick.bind(this);
        this.state = {
            count: 0
        };
    }

    onClick() {
        this.setState({
            count: this.state.count + 1
        });
    }

    render() {
        return (
            <div>
                <button onClick={this.onClick}>Click Me</button>
                <div>
                    Click Count : {this.state.count}
                </div>
            </div>
        )
    }
}

原因:
ES6的類成員函數(shù)與類實例并不是自動綁定的,constructor是組件裝載時調用的第一個函數(shù),此時this指向當前的類實例宿亡,使用bind就可以把成員函數(shù)綁定到這個實例肪凛。

prop和state

React 組件的數(shù)據(jù)分為兩種卿捎, prop state ,無論 prop 或者 state 的改變柄沮,都可能引
發(fā)組件的重新渲染。prop 是組件的對外接口废岂, state 是組件的內(nèi)部狀態(tài)祖搓,對外用
prop ,內(nèi)部用 state湖苞。
prop state 的區(qū)別:

  • prop 用于定義外部接口拯欧, state 用于記錄內(nèi)部狀態(tài);
  • prop 的賦值在外部世界使用組件時财骨, state 的賦值在組件內(nèi)部镐作;
  • 組件不應該改變 prop 的值,而 state 存在的目的就是讓組件來改變的隆箩。

組件向外傳遞數(shù)據(jù)

props用于將數(shù)據(jù)從父組件傳遞給子組件该贾,子組件將內(nèi)部數(shù)據(jù)向父組件傳遞時也可以使用props。這種情況下捌臊,父組件要通過props向子組件傳遞可以調用的函數(shù)杨蛋,子組件通過調用這個函數(shù)就能把內(nèi)部數(shù)據(jù)傳回給父組件。

例如:
image.png

父組件需要取到內(nèi)部三個子組件的數(shù)值進行計算娃属,可以這樣做:
import React, {Component} from 'react';
import Counter from './Counter';

export default class ControlPanel extends Component {
    constructor(props) {
        super(props);

        this.onCounterUpdate = this.onCounterUpdate.bind(this);
        this.state = ({
            sum: 30
        });
    }

    onCounterUpdate(previousValue, newValue) {
        this.setState({
            sum: this.state.sum + (newValue - previousValue)
        });
    }

    render() {
        return (
            <div>
                <Counter caption="First" onUpdate={this.onCounterUpdate} />
                <Counter caption="Second" onUpdate={this.onCounterUpdate}  initValue={10} />
                <Counter caption="Third" onUpdate={this.onCounterUpdate}  initValue={20} />
                <hr />
                <span>Total count: {this.state.sum} </span>
            </div>
        )
    }
}

父組件的onUpdate與成員函數(shù)onCounterUpdate綁定六荒,因此在子組件調用onUpdate函數(shù)時,父組件就會通過onCounterUpdate取得子組件傳遞的值矾端。

import React, {Component} from 'react';
import PropTypes from 'prop-types';

export default class Counter extends Component {

    constructor(props) {
        super(props);
        
        this.onAdd = this.onAdd.bind(this);
        this.onDecrease = this.onDecrease.bind(this);
        this.state = {
            count: props.initValue || 0
        };
    }

    onAdd() {
        this.updateValue(true);
    }

    onDecrease() {
        this.updateValue(false);
    }

    updateValue(isAdd) {
        const previousValue = this.state.count;
        const newValue = isAdd ? previousValue + 1 : previousValue - 1 ;
        this.setState({
            count: newValue
        });
        this.props.onUpdate(previousValue, newValue);
    }

    render() {
        return (
            <div>
                <button onClick={this.onAdd}>+</button>
                <button onClick={this.onDecrease}>-</button>
                <span>{this.props.caption} count:{this.state.count}</span>
            </div>
        )
    }
}

Counter.propTypes = {
    caption: PropTypes.string.isRequired,
    initValue: PropTypes.number,
    onUpdate: PropTypes.func
}

Counter.defaultProps = {
    initValue: 0,
    onUpdate: f => f
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掏击,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子秩铆,更是在濱河造成了極大的恐慌砚亭,老刑警劉巖灯变,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捅膘,居然都是意外死亡添祸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門寻仗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刃泌,“玉大人,你說我怎么就攤上這事署尤“姨妫” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵曹体,是天一觀的道長俗扇。 經(jīng)常有香客問我,道長箕别,這世上最難降的妖魔是什么铜幽? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮串稀,結果婚禮上除抛,老公的妹妹穿的比我還像新娘。我一直安慰自己厨诸,他們只是感情好镶殷,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布禾酱。 她就那樣靜靜地躺著微酬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颤陶。 梳的紋絲不亂的頭發(fā)上颗管,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音滓走,去河邊找鬼垦江。 笑死,一個胖子當著我的面吹牛搅方,可吹牛的內(nèi)容都是我干的比吭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼姨涡,長吁一口氣:“原來是場噩夢啊……” “哼衩藤!你這毒婦竟也來了?” 一聲冷哼從身側響起涛漂,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤赏表,失蹤者是張志新(化名)和其女友劉穎检诗,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓢剿,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡逢慌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了间狂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攻泼。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鉴象,靈堂內(nèi)的尸體忽然破棺而出坠韩,到底是詐尸還是另有隱情,我是刑警寧澤炼列,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布只搁,位于F島的核電站,受9級特大地震影響俭尖,放射性物質發(fā)生泄漏氢惋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一稽犁、第九天 我趴在偏房一處隱蔽的房頂上張望焰望。 院中可真熱鬧,春花似錦已亥、人聲如沸熊赖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽震鹉。三九已至,卻和暖如春捆姜,著一層夾襖步出監(jiān)牢的瞬間传趾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工泥技, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留浆兰,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓珊豹,卻偏偏與公主長得像簸呈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子店茶,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容蜕便,還有我對于 Vue 1.0 印象不深的內(nèi)容。關于...
    云之外閱讀 5,045評論 0 29
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理忽妒,服務發(fā)現(xiàn)玩裙,斷路器兼贸,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • 深入JSX date:20170412筆記原文其實JSX是React.createElement(componen...
    gaoer1938閱讀 8,048評論 2 35
  • GUIDS 第一章 為什么使用React? React 一個提供了用戶接口的JavaScript庫吃溅。 誕生于Fac...
    jplyue閱讀 3,519評論 1 11
  • 自己最近的項目是基于react的溶诞,于是讀了一遍react的文檔,做了一些記錄(除了REFERENCE部分還沒開始讀...
    潘逸飛閱讀 3,339評論 1 10