从 Redux Store 更新后 React 组件无法重新渲染

Posted

技术标签:

【中文标题】从 Redux Store 更新后 React 组件无法重新渲染【英文标题】:React Component fails to re-render after update from Redux Store 【发布时间】:2018-06-15 00:55:48 【问题描述】:

谁能帮我弄清楚为什么我的组件在调度后没有更新?

function mapStateToProps(state) 
     const  isAuthenticated  = state
     return  isAuthenticated 


class LoginForm extends Component 

 handleSubmit(event)  
        event.preventDefault();
        const  dispatch  = this.props
        const credentials = this.state
        dispatch(attemptLogIn(credentials)); 



//    Dispatch works properly when API validates Login:
//               Redux Log:  
//                nextState: authReducer: isAuthenticated: true

render() 
    const  isAuthenticated  = this.props;
        return (
  <div>
     isAuthenticated && <div> Authenticated: True </div>  
                         // Does not render even after dispatch

      <form onSubmit=this.handleSubmit>
     ... Form Stuff ...
      </form>
    </div>
  )


export default withRouter(connect(mapStateToProps)(LoginForm))

只是来自 Redux 商店的简单条件渲染,我希望显示额外的 div 以通知用户他已通过身份验证,但它没有渲染。

Redux 异步教程中的 AsyncApp 示例中使用了这种类型的条件渲染示例,所以我不确定为什么它不起作用。我的动作被调度,reducers 成功更新状态,将其传递给连接的组件。这是我的减速器:

const initialState =  isAuthenticated: false

const authReducer = (state = initialState, action) => 
    switch(action.type)
    case ('USER_AUTHENTICATED'):  
        return Object.assign(, state, 
            isAuthenticated: true,
            userPermissions: action.userInfo.userPermissions,
            instanceType: action.userInfo.instanceType
            
        )
    
    case ('INVALID_CREDENTIALS'):  
        return Object.assign(, state, 
            isAuthenticated:false
            
        ) 
    

    case ('LOG_OUT'):  
        return initialState 
    
    default:
            return state
    


const rootReducer = combineReducers(
    authReducer,
    routerReducer
)

export default rootReducer

有谁知道为什么我的组件没有重新渲染?

【问题讨论】:

在类 LoginForm 组件之外编写函数 mapStateToProps 表单。 @KuldeepSaxena 这是在这里发布代码的错误 - 我将重新编辑,我的 mapStateToProps 实际上在组件之外 - 我只是错误地将示例粘贴到这里:\ 请提琴 正在处理它,加载所有依赖项需要一些时间 你发布的reducer是你唯一的/root reducer吗?还是结合更多? 【参考方案1】:

将您的 mapStateToProps 函数更改为此。

function mapStateToProps(state) 
 const  isAuthenticated  = state.authReducer;
 return  isAuthenticated ;

【讨论】:

所以,如果有多个 reducer,我必须始终指定从哪个 reducer 收集状态? 是的,只定义那些你真正想要重新渲染你的组件的道具。为了获得更好的性能,请始终指定您的道具。例如。如果你有一个用户对象并且你只在你的渲染函数中使用它的一个特定属性,那么像这样定义它:username: state.user.name 而不是username: state.user

以上是关于从 Redux Store 更新后 React 组件无法重新渲染的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React hooks 和 Redux 从 useEffect 执行 store.unsubscribe

在 redux store 更新后立即执行自定义回调

React Redux Store 更新,但组件不重新渲染

React / Redux 主题:基于 Store State 的条件渲染

React Redux reducer 未更新状态

React 类组件和 React 功能组件更改 redux store 后访问 props 的区别