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

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

useEffect 內(nèi)的 setTimeout 和 useState

useEffect 內(nèi)的 setTimeout 和 useState

楊魅力 2023-08-18 09:54:51
我的 useState 掛鉤中有一個對象數(shù)組,我想更改每個數(shù)組元素的一個屬性,假設(shè)它看起來像:const array = [{id:1, isDisplayed: false}, {id:2, isDisplayed: false}, {id:3, isDisplayed: true}]雖然我嘗試使用setTimeout內(nèi)部useEffect鉤子來更改displayed不需要的任何地方的true屬性isDisplayed: true,但它會等待專用時間,并立即更改所有內(nèi)容,但我想要實(shí)現(xiàn)的是用自己的延遲更改每個元素。我的意思是像 const DELAY = 2000setTimeout 之類的東西setTimeout(() => ... , DELAY * id) ,因為當(dāng)我渲染 jsx 時,所有內(nèi)容都會同時出現(xiàn),我只想在每個元素出現(xiàn)之間產(chǎn)生小的延遲。例如,第一個元素在 2 秒后出現(xiàn),第二個元素在 3 秒后出現(xiàn)(不是第一個元素后 3 秒)我當(dāng)前的代碼如下所示:React.useEffect(() => { setTimeout(() => {  setArray(array.map((item)=> !item.isDisplayed ? {...item, displayed: true} : item)) }, DELAY * Math.floor(Math.random() * 5);}, [])
查看完整描述

2 回答

?
慕勒3428872

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

如果某些項目不可見,您可以設(shè)置超時并觸發(fā)更新。


并跟蹤是否顯示新項目revealed,如果沒有顯示新項目,則停止流程。


function TodoApp() {

  const [items, setItems] = React.useState([

    { id: 1, isDisplayed: false },

    { id: 2, isDisplayed: false },

    { id: 3, isDisplayed: false },

  ]);

  React.useEffect(() => {

    let currentTimeout = null;

    const displayMoreItems = () => {

      setItems(prevItems => {

        let revealed = false;

        const nextItems = prevItems.map(item => {

          if (!revealed && !item.isDisplayed) {

            revealed = true;

            return { ...item, isDisplayed: true };

          }

          return item;

        });

        if (revealed) {

          currentTimeout = setTimeout(() => {

            displayMoreItems();

          }, 1000);

        }

        return nextItems;

      });

    };

    currentTimeout = setTimeout(() => {

      displayMoreItems();

    }, 1000);

    return () => {

      if (currentTimeout) {

        clearTimeout(currentTimeout);

      }

    };

  }, [setItems]);

  return <div>{items.map(item => (item.isDisplayed ? item.id : null))}</div>;

}


ReactDOM.render(<TodoApp />, document.querySelector('#app'));

這是一個小提琴


查看完整回答
反對 回復(fù) 2023-08-18
?
侃侃無極

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

const DELAY = 2000;

React.useEffect(() => {

 let count = 1;

 array.forEach((item) => {

   if (!item.displayed) {

     setTimeout(() => {

        item.displayed = true;

        setArray([...array]);

     }, DELAY * count);

     count ++;

   }

 })

}, [])


查看完整回答
反對 回復(fù) 2023-08-18
  • 2 回答
  • 0 關(guān)注
  • 240 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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