真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

前言

成都創(chuàng)新互聯(lián)公司服務(wù)項目包括河?xùn)|網(wǎng)站建設(shè)、河?xùn)|網(wǎng)站制作、河?xùn)|網(wǎng)頁制作以及河?xùn)|網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,河?xùn)|網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到河?xùn)|省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

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

正文

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

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

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

注意:

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

變。把 this.state 當(dāng)做是不可變的。

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é)出來,當(dāng)使用 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(
    <del id="qcmyk"><sup id="qcmyk"></sup></del>
    <tfoot id="qcmyk"></tfoot>
      • <abbr id="qcmyk"><center id="qcmyk"></center></abbr>
        <strike id="qcmyk"></strike>