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ù)傳回給父組件。
父組件需要取到內(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
}