重複使用names的useEffect在陣列中
P粉775788723
P粉775788723 2023-08-14 18:14:44
0
1
502
<p>我在這個網站上找到了這個練習;我正在測試這個,因為我也在學習React中的hooks。 </p> <p>我不明白為什麼當你輸入一個與數組中已有的名字相同的名字時,useEffect的執行會停止。 </p> <p>它不應該跳過重複的名字然後繼續下一個嗎?還是我做錯了什麼? </p> <pre class="brush:php;toolbar:false;">let users = ['Oliver', 'Thomas', 'George', 'George', 'William'] export default function App() { const [index, setIndex] = useState(0); console.log('RENDER'); useEffect(() => { setTimeout(() => setIndex(index => index 1), 1000) console.log('Hello ' users[index]); console.log('Side Effect RUNS!'); if (index === users.length - 1) { return } }, [users[index]]) }</pre> <p><br /></p>
P粉775788723
P粉775788723

全部回覆(1)
P粉034571623

在循環中的副作用:你在useEffect中使用setTimeout和setIndex的方式可能會導致意外的行為。 useEffect在每次渲染後執行,並且在setTimeout回調中直接使用index狀態可能會造成問題,因為閉包在建立回調時會捕獲狀態值。

存取陣列元素:你試圖使用索引來存取users陣列的元素,但由於useEffect和延遲的非同步性質,可能會超出陣列的範圍。

const [index, setIndex] = useState(0);

  useEffect(() => {
    console.log('RENDER');
    console.log('副作用运行!');
    
    if (index >= users.length) {
      return;
    }

    const timeoutId = setTimeout(() => {
      console.log('你好 ' + users[index]);
      setIndex(index + 1);
    }, 1000);

    return () => clearTimeout (timeoutId);
  }, [index]);
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板