【问题标题】:How to use the response of useMutation in react-query to display data?react-query中如何使用useMutation的响应来显示数据?
【发布时间】: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


    【解决方案1】:

    为此,我正在使用状态,并且我在 useMutation() 钩子中的 onSuccess 函数中设置状态

    useMutation 返回的data 将包含从 api 返回的响应,因此不需要添加额外的状态管理

    【讨论】:

      猜你喜欢
      • 2023-01-24
      • 2021-10-08
      • 2021-11-29
      • 2021-07-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 2021-03-09
      相关资源
      最近更新 更多