React Hook useEffect() 连续运行,尽管我传递了第二个参数



我有这个代码的问题

如果我将整个pagination对象传递给函数useEffect()第二个参数,那么fetchData()将连续调用。如果我只传递pagination.current_page那么它只会调用一次,但是当我设置新pagination时,正如您在navigatePage()函数中看到的那样,尽管pagination已更改,useEffect()不会调用fetchData()

如何解决这个问题。谢谢!

此外,我不希望在第一次挂载组件时使用useEffect()调用,因为items是从 props 接收的(它是由服务器获取的,这是 nextjs 项目(。

import React, {useEffect, useState} from 'react';
import Filter from "../Filter/Filter";
import AdsListingItem from "../AdsListingItem/AdsListingItem";
import {Pagination} from "antd-mobile";
import styles from './AdsListing.module.css';
import axios from 'axios';
const locale = {
prevText: 'Trang trước',
nextText: 'Trang sau'
};
const AdsListing = ({items, meta}) => {
const [data, setData] = useState(items);
const [pagination, setPagination] = useState(meta);
const {last_page, current_page} = pagination;
const fetchData = async (params = {}) => {
axios.get('/ads', {...params})
.then(({data}) => {
setData(data.data);
setPagination(data.meta);
})
.catch(error => console.log(error))
};
useEffect( () => {
fetchData({page: pagination.current_page});
}, [pagination.current_page]);
const navigatePage = (pager) => {
const newPagination = pagination;
newPagination.current_page = pager;
setPagination(newPagination);
};
return (
<>
<Filter/>
<div className="row  no-gutters">
<div className="col-md-8">
<div>
{data.map(item => (
<AdsListingItem key={item.id} item={item}/>
))}
</div>
<div className={styles.pagination__container}>
<Pagination onChange={navigatePage} total={last_page} current={current_page} locale={locale}/>
</div>
</div>
<div className="col-md-4" style={{padding: '15px'}}>
<img style={{width: '100%'}} src="https://tpc.googlesyndication.com/simgad/10559698493288182074"
alt="ads"/>
</div>
</div>

</>
)
};
export default AdsListing;

问题是您没有返回新的对象引用。保存对最后一个状态对象的引用,改变其上的属性,然后再次保存它。

const navigatePage = (pager) => {
const newPagination = pagination; // copy ref pointing to pagination
newPagination.current_page = pager; // mutate property on ref
setPagination(newPagination); // save ref still pointing to pagination
};

在这种情况下,内存中pagination的位置保持静态。应改为将所有pagination属性复制到新对象

const navigatePage = (pager) => {
const newPagination = {...pagination}; // shallow copy into new object
newPagination.current_page = pager;
setPagination(newPagination); // save new object
};

为了更进一步,您确实应该进行功能更新,以便正确排队更新。这种情况是指在单个渲染周期中多次调用setPagination的情况。

const navigatePage = (pager) => {
setPagination(prevPagination => {
const newPagination = {...prevPagination};
newPagination.current_page = pager;
});
};

在分页队列的情况下,更新可能不是问题(最后一个当前页面集赢得下一个渲染战(,但如果任何状态更新实际上依赖于以前的值,那么一定要使用功能更新模式,

相关内容

  • 没有找到相关文章

最新更新