javascript - 刷新后反应数据表不重新填充
问题描述
所以我正在获取一个对象数组来填充我的数据表,当我以我需要的格式获取我需要的数据时,获取没有问题。我像这样从我的 redux 商店中检索它:
const contractorList = useSelector(state => state.contractorList)
const { loading, error, contractors } = contractorList
在我useEffect
的检查中,我检查用户是否登录,如果是,我调度我的操作来获取我的数据,通过它映射并将每个对象推送到我的data
数组,这是一个如下状态:
const [data, setData] = useState([])
最后,我在这里将 DataTable 的源设置为我的状态数组:
<DataTable
noHeader
pagination
selectableRowsNoSelectAll
columns={columns}
className='react-dataTable'
paginationPerPage={25}
sortIcon={<ChevronDown size={10} />}
paginationDefaultPage={currentPage + 1}
data={data}
/>
问题如下,如果我最初访问该页面,表格中的数据加载正常,或者如果我从应用程序中的其他任何地方导航到该页面,它似乎工作得很好。但是,如果我手动刷新页面(因此单击浏览器上的刷新按钮),我的表格上会出现“无数据显示”。几乎就像我刷新时 useEffect 不会触发一样。有谁知道为什么?我迷路了,我看不出它是我的 redux 或 useEffect 的问题,因为它在应用程序中导航时有效。
这是使用效果:
useEffect(() => {
if(userInfo ) {
if(userInfo) {
dispatch(listContractors())
if(contractors) {
contractors.map(c => {
setData(data => [...data, {
action: <Link className='text-dark text-center' to={`/contractor/${c._id}`}><MoreHorizontal /></Link>,
psa_licence_no: c.psa_licence_no,
company: c.company,
trading_as: c.trading_as,
address_1: c.address_1,
address_2: c.address_2,
address_3: c.address_3,
county: c.county,
eircode: c.eircode,
contact_f_name: c.contact_f_name,
contact_s_name: c.contact_s_name,
office_tel_no: c.office_tel_no,
mobile_tel_no: c.mobile_tel_no,
sentinel_id: c.sentinel_id,
email: c.email,
intruder: c.intruder,
cctv: c.cctv,
guard_static: c.guard_static,
arc_intruder: c.arc_intruder,
arc_cctv: c.arc_cctv,
issue_date: c.issue_date,
expiry_date: c.expiry_date,
psa_date_added: c.psa_date_added,
psa_date_updated: c.psa_date_updated,
psa_date_removed: c.psa_date_removed
}])
})
}
}
} else {
history.push('/login')
}
}, [dispatch, userInfo, history, successCreate])
如果我添加contractors
到依赖项列表中,那么它会创建一个执行listContractors
操作的无限循环
解决方案
我会将您的 useEffect 分为两个,因为它们处理代码的不同部分,一个用于分派 fetch,另一个用于在收到数据时对数据进行处理。
// this will dispatch the listContractors action when the userInfo changes
useEffect(() => {
if (userInfo) {
dispatch(listContractors())
} else {
history.push('/login')
}
}, [userInfo, history])
// this will update the data when contractors is changed
useEffect(() => {
if (contractors) {
const transformedContractors = contractors.map(contractor => ({
...contractor, // used this to avoid the one-by-one hand written copy.
action: <Link className='text-dark text-center' to={`/contractor/${c._id}`}><MoreHorizontal /></Link>
}));
setData(transformedContractors);
}
}, [contractors]);
推荐阅读
- flutter - Flutter:一个 FocusNode 被处理后使用
- java - 云环境中如何处理多个请求
- jms - Spring 集成 - 缺少自定义 IBM MQ JMS 标头
- ssl - TLS 的 Tcpdump 过滤器不起作用 - “(tcp[((tcp[12] & 0xf0) >>2)] = 0x16)”
- sqlite - 如何将时间信息保存到 Xamarin 中的 SQLite 文件中?
- angular - 角!和奇偶
- python - 如何在python中对DataFrame进行切片并以列表的形式将行与DataFrame分开
- java - 处理异常:javax.net.ssl.SSLHandshakeException:没有合适的协议(协议被禁用或密码套件不合适)
- file - 如何在文件流上创建新文件?
- python-3.x - 使用 beautifulsoup 将 ul 类中的详细信息解析为 dict