试图在 React DOM 上为 CurrentUser 反映来自 CurrentUser 的 Redux 状态变化?

Posted

技术标签:

【中文标题】试图在 React DOM 上为 CurrentUser 反映来自 CurrentUser 的 Redux 状态变化?【英文标题】:Trying to reflect changes in Redux State from CurrentUser on React DOM for CurrentUser? 【发布时间】:2020-08-29 00:19:14 【问题描述】:

我的应用程序是一个仪表板,允许公众查看某些项目,但不能查看 CRUD。如果用户登录,则可以访问完整的 CRUD。我在 Rails 后端使用自制 JWT/Bcrypt 身份验证,在前端和状态管理中使用 React/Redux。我想知道让 React DOM 在用户登录/注销时立即反映的最佳策略,并根据登录状态让某些项目(如创建按钮)出现/消失。现在,即使 Redux 商店已经更新,来自 Redux 商店的this.props.currentUser 似乎也没有帮助。

我正在使用 JSX 三元运算符根据 currentUser 状态显示某些项目。我已经尝试过this.props.currentUser ? <button>Example</button> : nullthis.props.currentUser !== null ? <button>Example</button> : nullthis.props.currentUser.length !== 0 ? <button>example</button> : null,但我都没有得到任何一致性(可能适用于一个组件,但页面刷新不再有效,等等)。

这是一个示例组件:

import React,  Component  from "react";
import  Link, withRouter  from "react-router-dom";
import  Container, Grid, Image  from "semantic-ui-react";
import  connect  from 'react-redux';
import logo from "../../images/logo-2-dashboard";
import  clearCurrentUser  from "../actions/clearCurrentUserAction";

class Header extends Component 

  logout = () => 
    localStorage.clear();
    this.props.clearCurrentUser()
    this.props.history.push("/");
  

  render() 

    return (
      <>
        <Container fluid>
          <Grid divided>
            <Grid.Row columns=2>
              <Grid.Column>
                <Image
                  src=logo
                  size="large"
                  style= margin: "3px", padding: "2px" 
                ></Image>
              </Grid.Column>
              <Grid.Column>

                 // Here's the kitchen sink approach lol 

                this.props.currentUser && this.props.currentUser === null ||
                this.props.currentUser && this.props.currentUser.length === 0 ? (
                  <Link
                    to="/login"
                    onClick=this.props.login
                    style= marginLeft: "200px" 
                  >
                    Login
                  </Link>
                ) : (
                  <Link
                    to="/"
                    onClick=this.logout
                    style= marginLeft: "200px" 
                  >
                    Logout
                  </Link>
                )

                 // SAME HERE 

                this.props.currentUser && this.props.currentUser !== null ||
                this.props.currentUser && this.props.currentUser.length !== 0 ? (
                  <div>Logged in as: this.props.currentUser.username</div>
                ) : null
              </Grid.Column>
            </Grid.Row>
          </Grid>
        </Container>
      </>
    );
  


const mapStateToProps = state => 
    return 
        currentUser: state.currentUser.currentUser
    


const mapDispatchToProps = dispatch => 
  return 
    clearCurrentUser: () => dispatch(clearCurrentUser())
  


export default connect(mapStateToProps, mapDispatchToProps)(withRouter(Header));

这是我的 Redux Action Thunk,用于在注销时将 CurrentUser 设置回 null(我也在清除 localHistory):


export const CLEAR_CURRENT_USER = 'CLEAR_CURRENT_USER'

export const clearCurrentUser = () => dispatch => 
     return dispatch( type: 'CLEAR_CURRENT_USER', payload: null )

和 currentUser 的 Reducer:

const initialState = 
  currentUser: [],
;

export const currentUserReducer = (state = initialState, action) => 
    switch (action.type) 
        case "SET_CURRENT_USER": 
            return  ...state, currentUser: action.payload 
        case "GET_CURRENT_USER":
            return  currentUser: action.payload 
        case "CLEAR_CURRENT_USER":
            return  currentUser: action.payload 
    default:
        return state;  
    
;

也许这完全是错误的方法。我是一名在公司独自工作的大三学生。

【问题讨论】:

【参考方案1】:

您正在检查 currentUser 是否为真,但您的初始状态是一个数组。 currentUser reducer 的 initialState 应该为 null 而不是空数组。


const initialState = 
  currentUser: null,
;

export const currentUserReducer = (state = initialState, action) => 
    switch (action.type) 
        case "SET_CURRENT_USER": 
            return  ...state, currentUser: action.payload 
        case "GET_CURRENT_USER":
            return  currentUser: action.payload 
        case "CLEAR_CURRENT_USER":
            return  currentUser: action.payload 
    default:
        return state;  
    
;

【讨论】:

以上是关于试图在 React DOM 上为 CurrentUser 反映来自 CurrentUser 的 Redux 状态变化?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 react-native 0.57+ 上为 react-relay(经典)配置 babel

React.js - 目标容器不是DOM元素

React Router Dom(四)编程导航

React Native 在 iOS 上为 addImageFromBase64 指定文件格式

React Router匹配对象null响应问题

无法在 React 上为 HTML5 拖放获取 onDragStart 事件