簡體   English   中英

帶有 function 的 setState 創建無限循環

[英]setState with function creates infinite loop

我需要創建一些數據並將其設置為初始 state。

const initialState = [
{
    name: "Joe",
    email: "joe@lorem.com",
    username: "FOOOO",
    website: "www.foosite.com",
    address: {
        city: "New York",
        street: "Times Square",
        suite: "244/78",
        zipcode: "00000",
    },
},
];

在這里,我只是多次重新創建該數據,因為我需要更多數據。

const createSkeletons = useCallback(() => {
    const arr = [];
    let i;
    for (i = 0; i < 20; i++) {
        initialState.forEach((item) => arr.push(item));
    }
    console.log(arr);
    return arr;
}, []);

在這里將它們設置為 state,同時獲取真實數據。 同時渲染創建的數據。

useEffect(() => {
    setIsFetching(true);
    const initial = createSkeletons();
    setDesigners(initial);
    axios.get(`site.com`).then((res) => {
        setIsFetching(false);
        //setDesigners(res.data);
    });
}, [isFetching, createSkeletons]);

但是,這會創建一個無限循環。 我究竟做錯了什么?

您不需要使用useEffect來設置初始 state,您可以直接在useState中進行設置:

const [designers, setDesigners] = useState(createSkeletons());

useEffect(() => {
    setIsFetching(true);
    axios.get(`site.com`).then((res) => {
        setIsFetching(false);
        setDesigners(res.data);
    });
}, []);

useEffect with [isFetching, createSkeletons] 每次isFetching變化都會執行,問題是你在useEffect中修改了isFetching,所以會產生循環。 只是從參數中刪除 isFetching

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM