redux 使用React中的useEffect在异步情况下关闭弹出窗口的错误处理

rryofs0p  于 2023-06-23  发布在  React
关注(0)|答案(2)|浏览(145)

我需要在应用程序中实现错误处理。我正在使用弹出窗口添加用户组。发送请求后,如果来自后端,我需要显示错误消息。然而,我在理解JavaScript异步函数方面遇到了困难。我创建了一个useEffect钩子,如果出现错误,我使用useState设置它并在弹出窗口中显示它。但如果没有错误,我想关闭弹出窗口。问题是错误最初为null,因此没有产生副作用,我无法用if语句控制它。只有在收到一些错误并发送一个没有抛出错误的新请求后,弹出窗口才会关闭。我认为问题在于useEffect钩子。也许我应该在开始时初始化错误?任何帮助将不胜感激。下面是相关代码:
我遇到了一个问题,错误在一开始就已经为null,所以它不会产生副作用,我不能用if语句控制它。我希望在没有错误的情况下能够关闭弹出窗口。我如何才能做到这一点?

const RoleList: React.FC<RoleListComponentProps> = (props) => {
    useWebservice(true, loadUserRoles);
    const roles = useSelector(selectUserRoles);
    const selectedRole = useSelector(selectSelectedRole);
    let roleError: string | null = useSelector(selectUserRoleErrorMessage);
    const msalContext: IMsalContext = useMsal();
    const dispatch = useDispatch();

    // ...other state and functions...

    useEffect(() => {
        if (typeof roleError === "string" && roleError === "Employees: Request failed with status code 409") {
            setGroupNameError("This user group is already created before!");
        } else if (typeof roleError === "string") {
            setGroupNameError(roleError);
        } else {
            handleCloseAddGroupPopup();
        }
    }, [dispatch, roleError, handleCloseAddGroupPopup]);

    return (
        <ListComponent
            // ...other props...
        />
    );
};

export default RoleList;
w8ntj3qf

w8ntj3qf1#

问题在于roleError的初始值为null,因此组件的初始渲染不会触发效果。

可能的解决方案

将roleError初始化为空字符串,效果将在初始渲染时触发。这允许您在没有错误的情况下处理该案例,并相应地关闭弹出窗口。

inn6fuwd

inn6fuwd2#

在这个组件中有很多事情要做,你正在混合多种不同的方法来达到你的目标。
第一:方括号中的值有点像缓存。使用效果“监听”这些值,如果它们发生变化,则触发该效果。
在您的示例中,分派和handleCloseAddGroupPopup很可能不在此数组中。更多关于这个
我假设你正在使用一个像redux这样的依赖项来从渲染组件外部获取值?如果是这样,所有的错误处理都应该在那里完成。组件应该接收所有应该呈现为props的内容。
如果由于某种原因,您无法关闭进行调用/创建错误对象的对话框,请向下传递一个具体值到将关闭对话框的组件。
这是一个反模式,但应该可以实现

相关问题