React 狀態
如何與組件的狀態互動
設置默認狀態
在組件的構造函數中,初始化this.state
。例如,BlogPostExcerpt 組件可能有一個clicked
的狀態:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class BlogPostExcerpt extends Component { constructor(props) { super(props) this.state = { clicked: false } }
render() { return ( <div> <h1>標題</h1> <p>描述</p> </div> ) } }
|
訪問狀態
可以通過引用this.state.clicked
來訪問 clicked 狀態:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class BlogPostExcerpt extends Component { constructor(props) { super(props) this.state = { clicked: false } }
render() { return ( <div> <h1>標題</h1> <p>描述</p> <p>點擊: {this.state.clicked}</p> </div> ) } }
|
改變狀態
永遠不要使用以下方式修改狀態:
1
| this.state.clicked = true
|
相反,應始終使用setState()
,並將一個對象作為參數傳遞給它:
1
| this.setState({ clicked: true })
|
該對象可以包含狀態的子集或超集。只有傳遞的屬性才會被修改,忽略的屬性將保持當前狀態。
為什麼應該始終使用setState()
使用此方法的原因是,React 知道狀態已經改變。然後,它將啟動一系列事件,導致該組件被重新渲染,以及任何DOM的更新。
單向數據流
狀態始終由一個組件擁有。受此狀態影響的任何數據只能影響它下面的組件:它的子組件。
更改組件的狀態永遠不會影響其父組件、兄弟組件或其他應用中的任何其他組件:只會影響它的子組件。
這就是為什麼狀態通常在組件樹中向上移動的原因。
將狀態向上移動到樹中
根據單向數據流規則,如果兩個組件需要共享狀態,則需要將狀態向上移動到共同的祖先組件中。
許多時候,最接近的祖先是管理狀態的最佳位置,但這不是強制性的規則。
通過 props 將狀態傳遞給需要該值的組件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Converter extends React.Component { constructor(props) { super(props) this.state = { currency: '€' } }
render() { return ( <div> <Display currency={this.state.currency} /> <CurrencySwitcher currency={this.state.currency} /> </div> ) } }
|
可以通過將一個具有變異函數的子組件作為 props 傳遞下去來改變狀態:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| class Converter extends React.Component { constructor(props) { super(props) this.state = { currency: '€' } }
handleChangeCurrency = event => { this.setState({ currency: this.state.currency === '€' ? '$' : '€' }) }
render() { return ( <div> <Display currency={this.state.currency} /> <CurrencySwitcher currency={this.state.currency} handleChangeCurrency={this.handleChangeCurrency} /> </div> ) } }
const CurrencySwitcher = props => { return ( <button onClick={props.handleChangeCurrency}> 當前貨幣:{props.currency}。更改它! </button> ) }
const Display = props => { return <p>當前貨幣:{props.currency}。</p> }
|
tags: [“React”, “state management”]