【发布时间】:2021-07-09 20:04:16
【问题描述】:
我正在使用 react-query 的 useMutation() 来发布数据,我能够成功发布数据。 但是,我在成功发布我想要使用该响应并将其显示在组件中的数据后返回的响应
为此,我正在使用状态,并且我在 useMutation() 钩子中的 onSuccess 函数内设置状态,但它给了我错误 错误: TypeError:无法读取未定义的属性“tidpWarnings” 在 Object.onSuccess (UpdateMIDPPage.jsx:80) 在 mutation.js:86
以下是我的参考代码
const UpdateMIDPPage = ({ open, handleClose }) => {
const classes = useStyles()
const [tidpFiles, setTidpFiles] = useState([])
const [reportFile, setReportFile] = useState('')
const [tidpWarnings, setTidpWarnings] = useState([])
const [reportWarnings, setReportWarnings] = useState([])
const [toggleVisibleIcon, setToggleVisibleIcon] = useState(true)
const { mutate, data, isSuccess, isLoading, isIdle, isError } = useMutation(
async (body) => {
const resp = await axios.post('http://localhost:4000/api/v1/midp/update', body)
return resp.data
},
{
onSuccess: async (data) => {
console.log(data)
setTidpWarnings(data.warnings1.tidpWarnings)
setReportWarnings(data.warnings1.reportWarnings)
},
onError: async (error) => {
console.log(error)
},
},
)
const handleUpdateMIDP = () => {
const body = {
projectId,
tidpFiles,
reportFile,
}
mutate(body)
// also tried this doesnt work eiter
// mutate(body, {
// onSuccess: async () => {
// setTidpWarnings(data.warnings1.tidpWarnings)
// setReportWarnings(data.warnings1.reportWarnings)
// },
// })
}
return (
<div className={classes.container}>
<div className={classes.action}>
<div>
<Button
onClick={handleUpdateMIDP}
className={classes.updateBtn}
variant='contained'
disableElevation
startIcon={<CheckIcon />}
disabled={tidpFiles === [] ? true : reportFile === '' ? true : isSuccess ? true : false}
>
{isIdle
? 'Generate MIDP'
: isLoading
? 'Processing...'
: isSuccess
? 'Processed!'
: isError
? 'Error'
: null}
</Button>
</div>
<div>
<Tooltip title='Toggle upload section'>
<IconButton onClick={() => setToggleVisibleIcon(!toggleVisibleIcon)}>
{toggleVisibleIcon ? <VisibilityIcon /> : <VisibilityOffIcon />}
</IconButton>
</Tooltip>
</div>
</div>
{toggleVisibleIcon ? (
<UploadSection
reportFile={reportFile}
setReportFile={setReportFile}
tidpFiles={tidpFiles}
setTidpFiles={setTidpFiles}
/>
) : null}
{isLoading ? <div>loading ....</div> : null}
{isSuccess ? <WarningSection tidpWarnings={tidpWarnings} reportWarnings={reportWarnings} /> : null}
</div>
)
}
如果我在 onSuccess 中注释 setState 代码,一切正常。
这是供参考的 APi 响应
{status: "success", data: {…}}
data:
ignoreFiles: (2) ["test1.xlsx", "test5.xlsx"]
warnings1: {tidpWarnings: Array(3), reportWarnings: Array(0)}
__proto__: Object
status: "success"
__proto__: Object
请帮我解决这个问题,谢谢
【问题讨论】:
标签: javascript reactjs react-hooks react-query