亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

React,無法根據當前狀態設置狀態(狀態落后一步)

React,無法根據當前狀態設置狀態(狀態落后一步)

阿波羅的戰車 2023-12-14 15:34:02
我完全迷失了 React async setState :(代碼沙箱這就是我想要實現的目標:當我單擊操作符按鈕(App.js 第 81-98 行)時,我采用 current(new\updated) state.input,用我的函數“格式化”它fixInput(App.js 第 7-22 行,它接受state.input和 event.target.textContent,返回新字符串),并將結果設置為新state.input值。//Display.jsconst Display = (props) => {  //on equals  click  show  the  output ,  if  input continues  , show input, change showoutput  let { input, output, showInput } = props;  return (    <div id="display" className="display_font">      {showInput ? input : output}    </div>  );};//Keypad.jsconst Keypad = (props) => {  return (    <div id="keypad">      <button id="clear" onClick={props.handleCeClick}>        CE      </button>      <button id="seven" onClick={props.handleNumClick}>        7      </button>      <button id="eight" onClick={props.handleNumClick}>        8      </button>      <button id="nine" onClick={props.handleNumClick}>        9      </button>      <button id="add" onClick={props.handleOperClick}>        +      </button>      <button id="four" onClick={props.handleNumClick}>        4      </button>      <button id="five" onClick={props.handleNumClick}>        5      </button>      <button id="six" onClick={props.handleNumClick}>        6      </button>      <button id="subtract" onClick={props.handleOperClick}>        -      </button>      <button id="one" onClick={props.handleNumClick}>        1      </button>      <button id="two" onClick={props.handleNumClick}>        2      </button>      <button id="three" onClick={props.handleNumClick}>        3      </button>      <button id="multiply" onClick={props.handleOperClick}>        *      </button>    </div>  );};React setState 是異步的,并且不會立即更新,因此我只能訪問以前的 state.input,我可以從 setState 回調記錄到控制臺當前狀態,并且我需要設置一個新狀態,這是我無法從回調中執行的。我無法訪問當前狀態,這就是為什么我的fixInput功能無法正常工作(按數字和重復運算符,例如4++,預計只允許添加運算符*-和的兩種組合/-我確實嘗試過用我能想到的各種方式來改變事情。我的方法有什么問題嗎?我的結構可以做到這一點嗎?
查看完整描述

2 回答

?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

https://img1.sycdn.imooc.com/657ab0160001dda603140206.jpg

對我來說一切似乎都很好,只需根據給定的規范清理輸入方程,所有測試用例都將得到滿足。


對handleEqualClick()功能進行以下更改:


  handleEqualsClick = () => {

    const { input } = this.state;

    //todo ? if the last char is oper, delete it

    // console.log(input);

    let eq = [];

    for (let ch of [...input]) {

      if (!eq.length) {

        eq.push(ch);

      } else {

        if (ch === "-") {

          eq.push("-");

        } else if ("+-*/".includes(ch) && "+-*/".includes(eq[eq.length - 1])) {

          while ("+-*/".includes(ch) && "+-*/".includes(eq[eq.length - 1])) {

            eq.pop();

          }

          eq.push(ch);

        } else {

          eq.push(ch);

        }

      }

    }

    let sanitizedInput = eq.join("");

    console.log(sanitizedInput);

    let result = +eval(sanitizedInput).toFixed(7).toString();

    console.log("result:", result);


    if (result.length > 11) {

      result = result.slice(0, 11);

    }

    this.setState((state) => ({

      showInput: false,

      output: result,

      input: result //test14

    }));

  };

代碼沙箱鏈接


查看完整回答
反對 回復 2023-12-14
?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

一些說明:我想要 1) 通過測試#13,2) 在顯示上看到正確的字符

功能上有錯誤fixInput,我this.state.input在需要更新版本時進行了測試,該版本是this.state.input + value.

function fixInput(inputStr, currentOp) {

? ? const lastTwoOp = /([+\-*/]{2})$/;

? ? const lastThreeOp = /([+\-*/]{3})$/;

? ? const allowTwo = /(\*|\/)-/;


? ? const toTest = inputStr + currentOp; //<=?


? ? if (lastTwoOp.test(toTest) && !allowTwo.test(toTest)) {

? ? ? ? inputStr = inputStr.slice(0, -1) + currentOp;

? ? } else if (lastThreeOp.test(toTest)) {

? ? ? ? inputStr = inputStr.slice(0, -2) + currentOp;

? ? } else {

? ? ? ? inputStr += currentOp;

? ? }

? ? return inputStr;

}


查看完整回答
反對 回復 2023-12-14
  • 2 回答
  • 0 關注
  • 203 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號