【发布时间】:2020-12-14 10:24:50
【问题描述】:
说明
我有一个组件,它显示从服务器获取的数据,并使用状态、tableData 将其显示在表格上,并且 它必须在调度 Redux 操作时设置。
我使用了动作监听器库,它使用了Redux middleware,它由 63 行代码组成。 redux-listeners-qkreltms.
例如,当我在analysisListIsReady({}).type 上注册一个函数,即ANALYSISLIST_IS_READY 时,当动作被调度时,该函数被调用。
问题
问题是反应有时会抛出错误:Can't update react state... for setTableData 因此忽略设置响应数据。我想弄清楚它什么时候发生。
我假设是因为卸载组件,所以我打印了一些日志,但是没有打印任何日志,并且 ComponentA 也没有消失。
删除getAnalysisJsonPathApi 和getResource 时没有出现任何错误,所以我尝试重新处理它,但失败了...link
当我删除 listenMiddleware.addListener 时不会出现任何错误,请参阅:#2
#1
// ComponentA
const [tableData, setTableData] = useState([])
useEffect(() => {
return () => {
console.log("unmounted1")
}}, [])
useEffect(() => {
listenMiddleware.addListener(analysisListIsReady({}).type, (_) => {
try {
getAnalysisJsonPathApi().then((res) => {
//...
getResource(volumeUrl)
.then((data: any) => {
// ...
setTableData(data)
})
})
} catch (error) {
warn(error.message)
}
})
return () => {
console.log("unmounted2")
}
}, [])
export const getAnalysisJsonPathApi = () => {
return api
.post('/segment/volume')
.then(({ data }) => data)
export const getResource = async (src: string, isImage?: boolean): Promise<ArrayBuffer> =>
api
.get(src)
.then(({ data }) => data)
#2
// ComponentA
const [tableData, setTableData] = useState([])
useEffect(() => {
return () => {
console.log("unmounted1")
}}, [])
useEffect(() => {
if (steps.step2a) {
try {
getAnalysisJsonPathApi().then((res) => {
//...
getResource(volumeUrl)
.then((data: any) => {
// ...
setTableData(data)
})
})
} catch (error) {
warn(error.message)
}
}
return () => {
console.log("unmounted2")
}
}, [steps.step2a])
【问题讨论】:
标签: reactjs redux middleware