第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

存儲在狀態(tài)中的箭頭函數(shù)

存儲在狀態(tài)中的箭頭函數(shù)

侃侃爾雅 2022-09-29 17:50:59
所以我有這個問題,我不知道這是一個錯誤的概念還是這個概念的糟糕實現(xiàn)。我用 freecodecamp.org 做了番茄鐘,這迫使我從普通的js和 React 組件中使用 setInterval() 函數(shù)。在番茄工作組件內(nèi)部,每次將其安裝在DOM樹中時,都應(yīng)該運(yùn)行一個 setInterval 檢查狀態(tài)和時鐘,具體取決于組件的狀態(tài)。事實上,我可以看到狀態(tài)變量的變化(多虧了 React 調(diào)試工具),但間隔不起作用componentdidmount在將組件呈現(xiàn)在DOM樹中并檢查狀態(tài).status之后運(yùn)行,如果它的真實檢查要運(yùn)行的周期,無論是會話還是中斷時鐘。一個計時器結(jié)束后,另一個計時器應(yīng)立即開始。此計時器或間隔存儲在組件狀態(tài)中,然后從 this.state.間隔狀態(tài)中清除。class Pomodoro extends React.Component {  constructor(props) {    super(props);    this.state = {     session:1500,     break:300,     cycle:true,     status:false,     sessionClock:1500,     breakClock:300,     interval:0,    } this.addSessionTime = this.addSessionTime.bind(this); this.decSessionTime = this.decSessionTime.bind(this);this.addBreakTime = this.addBreakTime.bind(this); this.decBreakTime = this.decBreakTime.bind(this); this.pause = this.pause.bind(this); this.reset = this.reset.bind(this);  }/*Avoided all the other binded functions since they are just setStates*/componentDidMount() {  if (this.state.status) {  if (this.state.cycle /* cycle true = session */)       {         this.setState({          interval:(setInterval( ()=> {      if (!this.state.status/*status true = clock running*/ ) {clearInterval(this.state.interval);}      else         {/*begin session clock*/          if (this.state.sessionClock > 1 /*check if is the last second*/)          {        this.setState({sessionClock: this.state.sessionClock - 1});                      /*take away a second from sessionClock*/          }       else {this.setState({cycle:!this.state.cycle, sessionClock:this.state.session}) }        }                  /*change cycle and restart sessionclock*/                                                  }    ,1000)      )})}時鐘由于將集合間隔保存到組件狀態(tài)或由于其他原因而無法正常工作?編輯添加了一個筆,以便您可以看到實時版本和狀態(tài)的變化https://codepen.io/bigclown/pen/bGEpJZb編輯二刪除了組件didmount方法并將內(nèi)容移動到 pause() 方法,但現(xiàn)在兩個時鐘同時運(yùn)行,時鐘運(yùn)行速度比預(yù)期的要快(可能是 react 中的異步狀態(tài)更新帶來了問題?
查看完整描述

2 回答

?
蠱毒傳說

TA貢獻(xiàn)1895條經(jīng)驗 獲得超3個贊

問題是您對 的用法。它在掛載組件時被調(diào)用,這意味著在用戶可以與屏幕交互之前調(diào)用它。componentDidMount


您的支票


if (this.state.status) 

永遠(yuǎn)不會是真的,因為你的狀態(tài)設(shè)置為假。查看您的代碼,我假設(shè)您的意思是將狀態(tài)切換為真,并且您認(rèn)為其中的代碼將運(yùn)行。statuscomponentDidMount


但是,您應(yīng)該做的是將代碼移動到函數(shù)中,因為這實際上是時鐘的觸發(fā)器。pause()


從那里,您可以執(zhí)行類似于以下內(nèi)容的操作:


  pause() {

    if (this.state.status === false) {

       // Start your clock, whilst checking `cycle`

    } else {

       clearInterval(this.state.interval);

    }

  }

這是一個筆,我已經(jīng)重構(gòu)了你的代碼,但基本上將所有邏輯都移到了.https://codepen.io/stephenyu-the-encoder/pen/zYrqQYEPause


我已將所有時鐘更改為從5秒開始,因此看到它工作得更快。


查看完整回答
反對 回復(fù) 2022-09-29
?
四季花海

TA貢獻(xiàn)1811條經(jīng)驗 獲得超5個贊

我懷疑您的時鐘同時運(yùn)行并且計時器關(guān)閉的問題是由于在啟動新計時器之前沒有停止舊計時器。


您可能要查找的是組件更新方法。此方法允許您將上一個狀態(tài)與當(dāng)前狀態(tài)進(jìn)行比較,并進(jìn)行相應(yīng)的更改。使用該方法,您可以檢查我們何時從休息時間切換到會話時間,然后停止舊計時器以啟動新計時器,如下所示:


  componentDidUpdate(prevProps, prevState) {

    // We need to check that the new state is different from the old state

    // if it is, stop the old timer, and kick off the new one

    if (prevState.cycle !== this.state.cycle) {

      clearInterval(this.state.interval);

      if (this.state.cycle) {

        // If the cycle switched to session, start the session timer

        this.startSession();

      } else {

        // If the cycle switched to break, start the break timer

        this.startBreak();

      }

    }

  }

這樣,只要您的會話或中斷計時器達(dá)到0,您就會切換,您將始終啟動新的計時器。this.state.cycle


在此處查看我的新代碼筆,了解功能齊全的代碼


查看完整回答
反對 回復(fù) 2022-09-29
  • 2 回答
  • 0 關(guān)注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號