国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

instein / 1221人閱讀

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

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

前言

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

正文

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

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

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

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

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

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

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

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

很多開發剛開始沒有注意到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(
    • <th id="6oasy"></th><ul id="6oasy"></ul>
      <samp id="6oasy"></samp>
    • <ul id="6oasy"><pre id="6oasy"></pre></ul>
      <ul id="6oasy"><tbody id="6oasy"></tbody></ul>
    • <