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

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

第三個下拉菜單基于前兩個下拉菜單的選擇,但第三個下拉菜單的狀態始終落后 1 步

第三個下拉菜單基于前兩個下拉菜單的選擇,但第三個下拉菜單的狀態始終落后 1 步

慕雪6442864 2023-08-10 15:42:34
我有以下代碼:const [homeSelect, setHomeSelect] = useState('Home');const [hedgeSelect, setHedgeSelect] = useState('Hedge');const [symbolSelect, setSymbolSelect] = useState('');const [similarSymbols, setSimilarSymbols] = useState([]);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 = () => {    setSimilarSymbols([]);    //add symbols together from selected dropdowns    var allSymbols = response.content.symbols[homeSelect] + response.content.symbols[hedgeSelect];    console.log(allSymbols);    //sort the symbols    allSymbols = allSymbols.split(",");    var sort_arr = allSymbols.sort();    console.log(sort_arr);    //find duplicates    for(var i = 0; i < sort_arr.length-1; i++)    {      if(sort_arr[i + 1] == sort_arr[i]) {         setSimilarSymbols(similarSymbols => [...similarSymbols, sort_arr[i]]);      }    }  }<FormControl dense>    <TextField      id="standard-select-currency"      select      label="Home"      className={classes.textField}      value={homeSelect}      onChange={handleHome}      SelectProps={{        native: true,      }}      helperText="Please select exchange"    >      <option>Home</option>      {response ? response.content.exchanges.map((option) => (        <option value={option}>          {option}        </option>      )) : <option>Data is loading...</option>}    </TextField>  </FormControl>  <FormControl dense>    <TextField      id="standard-select-currency"      select      label="Hedge"      className={classes.textField}      value={hedgeSelect}      onChange={handleHedge}      SelectProps={{        native: true,      }}homeSelect選擇和后hedgeSelect,應使用相應的數據填充“similarSymbols”。問題是,“相似符號”直到再次選擇后才會正確填充homeSelect,hedgeSelect例如,選擇一個下拉列表并選擇另一個下拉列表,然后再次選擇其中之一??雌饋砗孟駠衣浜罅艘徊剑也恢廊绾巫屗l揮作用。如有任何幫助,我們將不勝感激,謝謝。
查看完整描述

1 回答

?
米琪卡哇伊

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

這是由于setState的async,也是hook造成的。


調用 Exchange_change 時,狀態尚未設置,并且選擇了先前的值。


嘗試使用 useEffect 對homeSelect和所做的更改做出反應hedgeSelect:


const [homeSelect, setHomeSelect] = useState('Home');

const [hedgeSelect, setHedgeSelect] = useState('Hedge');

const [symbolSelect, setSymbolSelect] = useState('');

const [similarSymbols, setSimilarSymbols] = useState([]);



const handleHome = (event) => {

    setHomeSelect(event.target.value);

  };


const handleHedge = (event) => {

    setHedgeSelect(event.target.value);

};


const handleSymbol = (event) => {

    setSymbolSelect(event.target.value);

};

React.useEffect(exchange_change, [homeSelect, hedgeSelect]) // Here you listen to changes and update similarSymbols once changes are made.


const exchange_change = () => {

    setSimilarSymbols([]);

    //add symbols together from selected dropdowns

    var allSymbols = response.content.symbols[homeSelect] + response.content.symbols[hedgeSelect];

    console.log(allSymbols);


    //sort the symbols

    allSymbols = allSymbols.split(",");

    var sort_arr = allSymbols.sort();

    console.log(sort_arr);


    //find duplicates

    for(var i = 0; i < sort_arr.length-1; i++)

    {

      if(sort_arr[i + 1] == sort_arr[i]) { 

        setSimilarSymbols(similarSymbols => [...similarSymbols, sort_arr[i]]);

      }

    }

  }


<FormControl dense>

    <TextField

      id="standard-select-currency"

      select

      label="Home"

      className={classes.textField}

      value={homeSelect}

      onChange={handleHome}

      SelectProps={{

        native: true,

      }}

      helperText="Please select exchange"

    >

      <option>Home</option>

      {response ? response.content.exchanges.map((option) => (

        <option value={option}>

          {option}

        </option>

      )) : <option>Data is loading...</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"

    >

      <option>Hedge</option>

      {response ? response.content.exchanges.map((option) => (

        <option value={option}>

          {option}

        </option>

      )) : <option>Data is loading...</option>}

    </TextField>

  </FormControl>


  <FormControl dense>

    <TextField

      id="standard-select-currency"

      select

      label="Symbols"

      className={classes.textField}

      value={symbolSelect}

      onChange={handleSymbol}

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

      SelectProps={{

        native: true,

      }}

      helperText="Please select the exchanges"

    >

      <option>Symbol</option>

      {console.log(similarSymbols.map((element) => (element)))}

      {response ? similarSymbols.map((option) => (

        <option value={option}>

          {option}

        </option>

      )) : <option>Data is loading...</option>}

    </TextField>

  </FormControl>



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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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