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

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

window.addEventListener 未按預期更新狀態

window.addEventListener 未按預期更新狀態

慕森卡 2023-11-11 15:57:41
我想從頭開始構建無限滾動。這是代碼:import React,{useEffect, useRef, useState} from 'react';const Container:React.FC<{}> = () => {  const containerRef = useRef<HTMLDivElement | null>(null)  const [ scrollNumber, setScrollNumber ] = useState<number>(1);  const [posts, setPosts] = useState<any[]>([]); useEffect(() => {  async function main(){      const req = await  fetch('https://jsonplaceholder.typicode.com/posts');      const result = await req.json();      const pst = result.splice(0,10*scrollNumber);      setPosts(pst)    function scrollHandler(){   if(containerRef.current?.getBoundingClientRect().bottom === window.innerHeight){          console.log("Salam", scrollNumber);          setScrollNumber(scrollNumber + 1);        }  }  window.addEventListener("scroll", scrollHandler);  return () => window.removeEventListener("scroll", scrollHandler);  }  main()},[]) useEffect(() => {  const loadData = async () => {    const req = await  fetch('https://jsonplaceholder.typicode.com/posts');    const result = await req.json();    const pst = result.splice(0,10*scrollNumber);    setPosts(pst)  }  loadData() },[scrollNumber])  return (    <div  ref={containerRef}>      {posts.map(post => (        <div key={post.id}>          <br/>          <h1>{post.title}</h1>      (<p>{post.body}</p>)      <code>{post.userId}</code>      <br/><br/>      <hr/>        </div>      ))}    </div>  )}export default Container但有一個問題。當我測試它時。它總是更新為 2 沒有其他。我搜索了一下。我發現window.addEventListener只記住initialState,這就是state總是更新為2的原因。但我找不到任何代碼解決方案。
查看完整描述

1 回答

?
當年話下

TA貢獻1890條經驗 獲得超9個贊

在第一個useEffect依賴數組中是空的,這意味著如果您在其中使用任何狀態變量,它的值不會在效果中改變


正如我所看到的,您正在使用scrollNumber設置的下一個狀態setScrollNumber(scrollNumber + 1);和值scrollNumber不會改變內部效果,因為依賴項數組為空


因此,如果您對效果進行了任何更改,您必須告訴反應重新初始化效果scrollNumber


所以scrollNumber作為一個依賴項會為你工作


 useEffect(() => {

     ...


    function scrollHandler(){

        if(containerRef.current?.getBoundingClientRect().bottom === window.innerHeight) {

            console.log("Salam", scrollNumber);

            setScrollNumber(scrollNumber + 1);

        }

    }


    window.addEventListener("scroll", scrollHandler);

    return () => window.removeEventListener("scroll", scrollHandler);


.....

}, [scrollNumber]) //add a dependency


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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