/

React 狀態

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”]