成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用React.setState需要注意的三點

instein / 1234人閱讀

摘要:而不是在方法中在通過來獲取使用回調(diào)函數(shù)方法接收一個作為回調(diào)函數(shù)。這樣子直接輸出,回調(diào)函數(shù),對比如果默認為輸入的結(jié)果是和渲染無關(guān)的狀態(tài)盡量不要放在中來管理通常中只來管理和渲染有關(guān)的狀態(tài),從而保證改變的狀態(tài)都是和渲染有關(guān)的狀態(tài)。

原文: https://medium.com/@mweststra...
作者: Michel Weststrate

前言

這篇文章原標題是3 Reasons why I stopped using React.setState,但是我對原文作者提出的論點不是很感冒,但是作者提出的三點對React新手來說是很容易忽略的地方,所以我在這里只提出部分內(nèi)容,而且把標題改為使用React.setState需要注意的三點。

正文

React新手來說,使用setState是一件很復雜的事情。即使是熟練的React開發(fā),也很有可能因為React的一些機制而產(chǎn)生一些bug,比如下面這個例子:

文檔中也說明了當使用setState的時候,需要注意什么問題:

注意:
絕對不要 直接改變this.state,因為之后調(diào)用setState()可能會替換掉你做的改變。把this.state當做是不可變的。

setState()不會立刻改變this.state,而是創(chuàng)建一個即將處理的state轉(zhuǎn)變。在調(diào)用該方法之后訪問this.state可能會返回現(xiàn)有的值。

setState的調(diào)用沒有任何同步性的保證,并且調(diào)用可能會為了性能收益批量執(zhí)行。

setState()將總是觸發(fā)一次重繪,除非在shouldComponentUpdate()中實現(xiàn)了條件渲染邏輯。如果可變對象被使用了,但又不能在shouldComponentUpdate()中實現(xiàn)這種邏輯,僅在新state和之前的state存在差異的時候調(diào)用setState()可以避免不必要的重新渲染。

總結(jié)出來,當使用setState的時候,有三個問題需要注意:

1. setState是異步的(譯者注:不保證同步的)

很多開發(fā)剛開始沒有注意到setState是異步的。如果你修改一些state,然后直接查看它,你會看到之前的state。這是setState中最容易出錯的地方。 setState這個詞看起來并不像是異步的,所以如果你不假思索的用它,可能會造成bugs。下面這個例子很好的展示了這個問題:

class Select extends React.Component {
  constructor(props, context) {
    super(props, context)
    this.state = {
      selection: props.values[0]
    };
  }
  
  render() {
    return (
      
    {this.props.values.map(value =>
  • this.onSelect(value)} > {value}
  • )}
) } onSelect(value) { this.setState({ selection: value }) this.fireOnSelect() } onKeyDown = (e) => { const {values} = this.props const idx = values.indexOf(this.state.selection) if (e.keyCode === 38 && idx > 0) { /* up */ this.setState({ selection: values[idx - 1] }) } else if (e.keyCode === 40 && idx < values.length -1) { /* down */ this.setState({ selection: values[idx + 1] }) } this.fireOnSelect() } fireOnSelect() { if (typeof this.props.onSelect === "function") this.props.onSelect(this.state.selection) /* not what you expected..*/ } } ReactDOM.render(
<option id="gwc0o"></option>
<button id="gwc0o"><th id="gwc0o"></th></button>
<strike id="gwc0o"><kbd id="gwc0o"></kbd></strike>
<strike id="gwc0o"></strike>
<