我正在创建一个提交表单,并在这里使用useEffect()。
useEffect从后端接收到一个400-Statuscode和一个错误消息,我想在我的提交表单上显示这个错误,但是我很难在'useEffect(()=>{}‘-范围之外访问这个错误。
这是我的代码(我正在使用react-bootstrap和@redux-toolkid):
简短版本:
var error = null
useEffect(() => {
console.log('useEffect(): ')
console.log(createResult)
if (createResult.isSuccess) {
createResult.reset()
dispatch(hideCreateMessageDialog())
}
if (createResult.error) {
error = createResult.error
console.log(error) //output = null我也尝试使用return(error)语句,但这会让我的整个应用程序崩溃。我还尝试使用error作为参数,比如useEffect(error)()=>...。
为什么不能访问useEffect()-scope中的错误变量?我需要在我的JSX代码中使用错误消息。
,我该怎么做?
createResult.error值
{
"status": 400,
"data": {
"Error": "Could not create forum message. Reason: Forum thread ID is missing"
}
}完整代码
import React, { useEffect } from 'react'
// utils
import { jlog, jsn } from '../../../utils/parseJSON'
import JsonHelper from '../../../utils/parseJSON'
//bootstrap
import Button from 'react-bootstrap/Button'
import FloatingLabel from 'react-bootstrap/FloatingLabel'
import Form from 'react-bootstrap/Form'
import Modal from 'react-bootstrap/Modal'
import Spinner from 'react-bootstrap/Spinner'
import Stack from 'react-bootstrap/Stack'
//redux
import { useDispatch, useSelector } from 'react-redux'
// import selectors
import { selectCreateMessageDialog, selectHandleThreadID, selectHandleThreadName } from '../../../redux/ui/UISlices'
//import my reducers
import { useCreateMessageMutation } from '../../../redux/forum/ForumMessageSlice'
import { hideCreateMessageDialog } from '../../../redux/ui/UISlices'
export default function CreateMessageDialog() {
var error = null
const [createMessage, createResult] = useCreateMessageMutation()
const dispatch = useDispatch()
const parentThreadID = useSelector(selectHandleThreadID)
const parentThreadName = useSelector(selectHandleThreadName)
const handleSubmit = function (event) {
event.preventDefault()
const newMessage = {
title: event.target.elements.ForumMessageTitleInput.value,
text: event.target.elements.ForumMessageTextInput.value,
threadID: parentThreadID
}
createMessage(newMessage)
}
useEffect(() => {
console.log('useEffect(): ')
console.log(createResult)
if (createResult.isSuccess) {
createResult.reset()
dispatch(hideCreateMessageDialog())
}
if (createResult.error) {
error = createResult.error
console.log('error in createResult: ')
console.log(jsn(error))
console.log(jsn(error.data.message))
console.log(jsn(error.status))
}
})
return (
<>
<Modal show={useSelector(selectCreateMessageDialog)} onHide={() => dispatch(hideCreateMessageDialog())}>
<Modal.Header closeButton>
<Modal.Title>{JSON.stringify(error)}</Modal.Title>
</Modal.Header>
<Form onSubmit={handleSubmit}>
<CreateMessageBody error={error} threadID={parentThreadID} threadName={parentThreadName} />
<Modal.Footer>
<Button
variant='secondary'
id='CancelCreateForumMessageButton'
onClick={() => dispatch(hideCreateMessageDialog())}
>
Cancel
</Button>
<Button type='submit' variant='primary' id='CreateForumMessageButton'>
Create Message
</Button>
</Modal.Footer>
</Form>
</Modal>
</>
)
}
function CreateMessageAlert({ error }) {
return <JsonHelper data={error} />
/* if (error) return error.data */
return null
}
function CreateMessageBody(props) {
console.log('props von CreateMessageBody: ' + jsn(props))
if (false) {
return (
<Modal.Body>
<Spinner animation='border' role='status'>
<span className='visually-hidden'>Loading...</span>
</Spinner>
</Modal.Body>
)
}
return (
<Modal.Body>
<Stack>
<JsonHelper data={props} />
<CreateMessageAlert error={props} />
<FloatingLabel controlId='ForumMessageTitleInput' label='Message Title' className='mb-3'>
<Form.Control type='text' name='ForumMessageTitleInput' placeholder='Eigener Title' />
</FloatingLabel>
<FloatingLabel controlId='ForumMessageTextInput' label='Message' className='mb-3'>
<Form.Control
as='textarea'
type='text'
name='ForumMessageTextInput'
placeholder='Message'
style={{ height: '125px' }}
/>
</FloatingLabel>
</Stack>
</Modal.Body>
)
}发布于 2022-07-16 01:03:54
您很可能会将错误设置为useState,这样组件就可以对更改做出反应。
外部console.log(错误)只在脚本加载时运行一次
这是useState的文档
https://reactjs.org/docs/hooks-state.html
我从消息为空开始,如果消息有什么内容,然后显示消息,如果消息为空,则不显示任何内容
最后,在“使用效果”中,设置状态而不是变量。
https://stackoverflow.com/questions/73000779
复制相似问题