reactjs - 将 catch 错误状态从子级发送到父级并显示消息
问题描述
我有一个包含 2 个不同容器的页面,每个容器都发出数据请求,但如果失败,我想用页面中间的大错误消息替换所有页面,全部为空白
如果用户发现任何错误,应该使一切都失败,而不仅仅是显示消息在哪里,而是替换所有 UserApps 代码,用户和 UserProjects 将被替换为中间有错误消息的大空白页
(这只是一个例子):
父组件 - UsersApp.tsx
import React, { FC } from "react"
import User from "../containers/User"
import UserProjects from "../containers/UserProjects"
const UsersApp: FC = () => {
return (
<>
<div>
<h1>Welcome!</h1>
</div>
<hr />
<div>
{/* //this error must be from child <User/> catch error component */}
{error ? (
<ErrorState />
) : (
<User />
<UserProjects />
)}
</div>
</>
)
}
export default UsersApp
子组件 - User.tsx
import React, { FC, useState, useEffect } from "react"
import { getUserData } from "../requests/getUserData"
const User: FC<{}> = () => {
const [error, setError] = useState(false)
const [loading, setLoading] = useState(false)
const [name, setName] = useState("")
const [age, setAge] = useState("")
const [country, setCountry] = useState("")
const getData = async () => {
setLoading(true)
setError(false)
const response = await getUserData()
const data = response.data
return data
}
useEffect(() => {
getData()
.then((data) => {
setName(data.name)
setAge(data.age)
setCountry(data.country)
})
.catch((error) => {
setLoading(false)
setError(true)
})
return
}, [])
return (
<div>
<h1>{name}</h1>
<p>{age}</p>
<p>{country}</p>
</div>
)
}
export default User
错误状态.tsx
import React, { FC } from 'react'
const ErrorState: FC = (props) => (
<div>
<h1>Something went wrong!!!!! </h1>
</div>
)
export default ErrorState
解决方案
你的父母需要保持错误状态。将 setError 作为道具传递给孩子
const UsersApp = () => {
const [error, setError] = useState(false)
return (
<>
<div>
<h1>Welcome!</h1>
</div>
<hr />
<div>
{error && <ErrorState/>}
{!error && (
<User setError={setError} />
<UserProjects setError={setError} />
)}
</div>
</>
)
}
const User = ({ setError }) => {
//remove set error state from child
}
const UserProjects = ({ setError }) => {
//remove set error state from child
}
推荐阅读
- python - 如何将自定义函数链接到现有的数据框对象
- r - 另一列 R 的分组操作
- java - 带有列表的地图格式在 SpEL 中应该是什么样的
- if-statement - 如何解决yacc中if else语句的shift减少冲突?
- excel - 如何解决周六的Excel计数
- linq - 列表对象中包含详细信息的主/详细信息查询
- reactjs - 在 mui 版本 5 中使用 withStyles 时出错
- github-actions - 如何在 Github Actions 中设置 Rubocop
- python - 如何从 Tk 窗口中删除一组条目?
- android - Android WebView 不显示某些网站