ReactJS 状态未正确呈现

Posted

技术标签:

【中文标题】ReactJS 状态未正确呈现【英文标题】:ReactJS states not being rendered correctly 【发布时间】:2021-08-17 06:26:19 【问题描述】:

我正在使用 Django Rest Framework 开发一个 React 应用程序,我正在更新用户配置文件。 一切正常,但有一个小问题我无法解决。 当我更新用户电子邮件并且输入的电子邮件已存在于 DB 中时,DRF 会发回一个错误。 在我的用户减速器中,状态随错误而更新。但是 react 不会呈现该输出,它会呈现成功场景,尽管电子邮件没有更新。

当我用同一封电子邮件第二次提交表单时,它会呈现错误消息。现在,如果我将电子邮件更改为唯一的电子邮件并提交,电子邮件会在数据库中更新,updateProfileState 也会更新。但是错误消息会在前端配置文件页面上呈现。同样,如果我使用相同的电子邮件地址或任何其他现有电子邮件提交表单,则会呈现成功场景。我必须再次提交表单才能在屏幕上呈现错误消息。

对这个问题的简单描述是,我的前端页面是实际状态之后的一个状态。

这是我的行动

export const updateUserProfile = (user)=> async (dispatch, getState) => const userLogin: userInfo = getState()

try 
    dispatch(
        type: USER_PROFILE_UPDATE_REQUEST
    )

    const config = 
        headers : 
            'Content-Type':'application/json',
            Authorization: `Bearer $userInfo.access`
        
    

    const data = await axios.patch('/api/v1/users/me/', user, config)

    dispatch(
        type: USER_PROFILE_UPDATE_SUCCESS,
        payload: data
    )


catch (error) 
    dispatch(
        type: USER_PROFILE_UPDATE_FAIL,
        payload: error.response.data.old_password ? error.response.data.old_password
            : error.response.data
    )

还有我的减速器功能

export const userUpdateProfileReducer=(state=, action)=> 
switch (action.type) 
    case USER_PROFILE_UPDATE_REQUEST:
        return ...state, success: false

    case USER_PROFILE_UPDATE_SUCCESS:
        return success: true, user : action.payload

    case USER_PROFILE_UPDATE_FAIL:
        return success: false, error: action.payload

    default:
        return state

我的 handleSubmit 函数

const handleSubmit = event => 
    event.preventDefault();

    if (Object.values(formValidity).every(Boolean)) 
        dispatch(updateUserProfile('first_name': formValues.first_name, 'last_name':formValues.last_name, 'username': formValues.email, 'email': formValues.email))

        if(success===true) 
            console.log(success)
            toast('Profile updated successfully...', position:toast.POSITION.TOP_CENTER, autoClose: 2000)
        
        else 
            error && error["email"].map(msg => (formErrors.email = msg))
        
    

;

从 reducern usig useSelector 中提取成功和错误变量。

const updateProfile = useSelector(state => state.userUpdateProfile)
const loading, success, error = updateProfile

当我在 Redux Dev Tools 中检查状态时,状态正在正确更新。只有我的首页没有得到正确的价值。只有当我更新电子邮件时才会发生这种情况。对于电子邮件以外的任何其他内容,它都可以正常工作。

谁能帮我看看我做错了什么? 编辑: 这是我要呈现错误消息的表单。在成功的情况下,我将显示一个 toast 弹出窗口。 (参见 handleSubmit 函数

 <FormGroup className="row">
                        <FormLabel className="col-xl-3 col-lg-3 col-form-label text-alert">Email</FormLabel>
                        <div className="col-lg-9 col-xl-6">
                            <FormControl
                                type="email"
                                name="email"
                                className=`form-control form-control-lg form-control-solid mb-2 $
                                    formErrors.email ? "is-invalid" : ""
                                `
                                placeholder="Enter Email"
                                onChange=handleChange
                                value=formValues.email
                            />
                            <div className="ml-2 text-md-left invalid-feedback">formErrors.email</div>
                        </div>
                    </FormGroup>

【问题讨论】:

您希望在哪里呈现成功场景或错误场景? @ksav 我已经添加了要呈现错误消息的表单 你能检查一下这个值是从哪里来的吗? formErrors 是呈现表单的组件的内部状态吗? 内部状态。我用从 DRF 和 formValidation 发送的错误消息填充它。无论如何,Rohit 的回答解决了我的问题。感谢您的宝贵意见。 【参考方案1】:
    if(success===true) 
        console.log(success)
        toast('Profile updated successfully...', position:toast.POSITION.TOP_CENTER, autoClose: 2000)
    
    else 
        error && error["email"].map(msg => (formErrors.email = msg))
    

这在 dispatch 语句之后运行。所以这个得到的值不会更新,因为调度需要一些时间来更新状态,因为它是一个网络请求。

尝试使用 await,或者在 useEffect 中进行检查(页面级别检查页面中的任何错误)

useEffect(() => 
    if (props.error) 
        toast.error(props.error);
    
    if(props.success)
      toast.success('success message') 
    

, [props.error, props.success]);

【讨论】:

使用 useEffect 进行了尝试。还是同样的问题。我将什么作为依赖项传递?我将调度、成功、错误作为依赖传递。 props.success 和 props.error(来自 redux 存储的错误和成功) 谢谢伙计。这解决了我的问题。此外,我没有在成功更新后立即重置 updateProfile 状态。这给我下次加载页面时带来了麻烦。现已修复。

以上是关于ReactJS 状态未正确呈现的主要内容,如果未能解决你的问题,请参考以下文章

调用 setState 后 ReactJS 元素未更新

ReactJS:组件未在嵌套路由中呈现

POST 请求 ReactJS 后列表项未呈现

ReactJS 中的路由。显示 URL 但未呈现组件

ReactJS onClick 状态变化落后一步

重新渲染 Reactjs 后,父组件立即失去状态