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

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

在下拉列表中進行選擇后,useState 未正確更新

在下拉列表中進行選擇后,useState 未正確更新

森欄 2023-07-06 14:55:45
我有一個功能可以禁用下拉菜單,直到在其他兩個下拉菜單中做出選擇為止。我相信由于一些異步問題,它沒有正確啟用下拉菜單useState。const [homeSelect, setHomeSelect] = useState('Home');const [hedgeSelect, setHedgeSelect] = useState('Hedge');const [symbolSelect, setSymbolSelect] = useState('1');const handleHome = (event) => {    setHomeSelect(event.target.value);    exchange_change();  };const handleHedge = (event) => {  setHedgeSelect(event.target.value);  exchange_change();};const handleSymbol = (event) => {  setSymbolSelect(event.target.value);};const exchange_change = () => {  if (homeSelect != 'Home' && hedgeSelect != 'Hedge'){    //enable the symbol dropdown      setDisabled(false);  } else {      //disable the select exchanges dropdown      setDisabled(true);  }}<FormControl dense>  <TextField    id="standard-select-currency"    select    label="Home"    className={classes.textField}    value={homeSelect}    onChange={handleHome}    SelectProps={{      native: true,    }}    helperText="Please select exchange"  >    {home.map((option) => (      <option key={option.value} value={option.value}>        {option.label}      </option>    ))}  </TextField></FormControl><FormControl dense>  <TextField    id="standard-select-currency"    select    label="Hedge"    className={classes.textField}    value={hedgeSelect}    onChange={handleHedge}    SelectProps={{      native: true,    }}    helperText="Please select exchange"  >    {hedge.map((option) => (      <option key={option.value} value={option.value}>        {option.label}      </option>    ))}  </TextField></FormControl><FormControl dense>  <TextField    id="standard-select-currency"    select    label="Symbols"    className={classes.textField}    value={symbolSelect}    onChange={handleSymbol}    disabled={disabled}    SelectProps={{      native: true,    }}home下拉hedge菜單需要在啟用下拉菜單之前進行選擇symbol。錯誤是symbol下拉菜單直到之后才會啟用home并且hedge被選擇多次。如何更改我正在使用的方法useReducer(如果這可以解決狀態更新問題)?我嘗試閱讀它,但不明白我的開關盒是什么。
查看完整描述

1 回答

?
躍然一笑

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

“設置”操作是異步的。所以當你這樣做時:


setHomeSelect(event.target.value);

exchange_change();

當調用第二個方法時,變量homeSelect沒有改變。當邏輯完成處理并且組件準備重新渲染時,它將會發生變化。


更重要的是,這不太像 React:


const exchange_change = () => {

  if (homeSelect != 'Home' && hedgeSelect != 'Hedge'){

    //enable the symbol dropdown

    setDisabled(false);

  } else {

    //disable the select exchanges dropdown

    setDisabled(true);

  }

}

當您在此處修改狀態值時,從概念上講,您似乎正在嘗試修改 UI。不。UI 組件只能響應狀態。因此,您可以在“符號”組件中執行此操作,而不是使用該方法:


disabled={homeSelect == 'Home' || hedgeSelect == 'Hedge'}

如果您想將其放入方法中,請將其放入由組件調用的方法中,而不是在重新渲染之前調用。例如:


disabled={() => checkSelects()}

該方法可以是:


const checkSelects = () => 

  homeSelect == 'Home' || hedgeSelect == 'Hedge';

但總體而言,請注意此處的操作順序。UI 事件調用的所有邏輯都會被執行,這些邏輯會將狀態更新排隊。然后狀態就會更新。然后組件重新渲染(如果需要)。不要依賴在該邏輯期間更新的狀態。


查看完整回答
反對 回復 2023-07-06
  • 1 回答
  • 0 關注
  • 185 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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