【发布时间】:2020-02-01 20:31:44
【问题描述】:
这段代码有问题
如果我将整个pagination 对象传递给useEffect() 函数的第二个参数,那么fetchData() 将连续调用。如果我只通过pagination.current_page,那么它只会调用一次,但是当我设置新的pagination 时,正如您在navigatePage() 函数中看到的那样,useEffect() 不会调用fetchData(),尽管pagination 已经改变。
如何解决这个问题。非常感谢!
除了我不希望在第一次安装组件时使用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;
【问题讨论】:
标签: reactjs react-hooks use-effect