【问题标题】:React Component doesn't read state from reducer with 'mapStateToProps'React 组件不使用“mapStateToProps”从减速器读取状态
【发布时间】:2020-12-17 21:08:25
【问题描述】:

我正在使用 reducer 来读取状态并查看用户是否经过身份验证。我可以从其他文件中读取状态,但只有一个特定文件无法读取状态。

下面,我定义 mapStateToProps

const mapStateToProps = state => ({
    user: state.auth.user,
    isAuthenticated: state.auth.isAuthenticated,
});
  
export default connect(mapStateToProps)(ViewJobPage);

这里是组件的渲染方法

render() {
        const {user, isAuthenticated} = this.props;

        if(!isAuthenticated){
            return <Redirect to='/'/>;
        }
        
        return(
            <Card
                style={{ width: 300 }}
                cover={
                <img
                    alt="example"
                    src="https://gw.alipayobjects.com/zos/rmsportal/JiqGstEfoWAOHiTxclqi.png"
                />
                }
                actions={[
                <SettingOutlined key="setting" />,
                <EditOutlined key="edit" />,
                <EllipsisOutlined key="ellipsis" />,
                ]}
            >
                <Card.Meta
                avatar={<Avatar src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png" />}
                //title={user.username}
                //description={"Email: " + {user.email}}
                />
            </Card>
        );
    }

编辑:这是我的 reducer 文件,名为“auth.js”,它将用户的状态存储为一个对象,并将 isAuthenticated 存储为布尔值

首先,我定义初始状态,然后对其进行更改,如上所述,我可以从其他文件中读取状态,因此该文件应该可以正常工作。还有一个额外的细节,当我第一次执行这样的代码时,它在 ViewPage 上运行,但是当我重新运行代码而不进行额外更改时,它停止读取。它可能与混合文件路径有关吗?

// frontend/src/reducers/auth.js

import {
    USER_LOADING,
    USER_LOADED,
    AUTH_ERROR,
    REGISTER_FAIL,
    REGISTER_SUCCESS,
    LOGIN_SUCCESS,
    LOGIN_FAIL,
    LOGOUT_SUCCESS,
  } from '../actions/types';
  
  const initialState = {
    isLoading: false,
    isAuthenticated: null,
    user: null,
    token: localStorage.getItem('token')
  };
  
  export default function(state = initialState, action) {
    switch (action.type) {
      case USER_LOADING:
        return {
          ...state,
          isLoading: true
        };
      case USER_LOADED:
        return {
          ...state,
          isLoading: false,
          isAuthenticated: true,
          user: action.payload
        };
      case LOGIN_SUCCESS:
        localStorage.setItem('token', action.payload.token);
        return {
          ...state,
          isLoading: false,
          isAuthenticated: true,
          ...action.payload
        };
      case AUTH_ERROR:
      case REGISTER_FAIL:
      case REGISTER_SUCCESS:
      case LOGIN_FAIL:
        localStorage.removeItem('token');
        return {
          ...state,
          isLoading: false,
          isAuthenticated: false,
          user: null,
          token: null
        };
        case LOGOUT_SUCCESS: // added
      localStorage.removeItem('token');
      return {
        ...state,
        isLoading: false,
        isAuthenticated: false,
        user: null,
        token: null
      };
      default:
        return state;
    }
  }

编辑 2:按照建议,我使用 Redux Extension 来查看状态。状态似乎是正确的。

{
  type: 'USER_LOADED',
  payload: {
    id: 1,
    username: 'david',
    email: 'david@admin.com',
    is_employer: true,
    is_employee: false
  }
}

感谢您的帮助!

【问题讨论】:

  • 渲染这个组件时你的 redux 状态是什么样的?您可能想要安装Redux DevTools extension,它允许您查看您的 redux 状态(以及其他内容)。请在渲染此组件时发布您的 redux 状态的 sn-p。
  • 我用过扩展,状态正常@srk
  • 您发布了该操作。您可以发布当前状态吗?

标签: javascript reactjs react-native react-redux mapstatetoprops


【解决方案1】:

你打电话给connect 两次。你只需要调用一次。

所以不要这样:

  ViewJobPage = connect(
    mapStateToProps
  )(ViewJobPage);
export default connect(mapStateToProps)(ViewJobPage);

你应该这样写:

export default connect(mapStateToProps)(ViewJobPage);

【讨论】:

  • 您好,两种方法我都试过了,但似乎不起作用:(
猜你喜欢
  • 2017-06-20
  • 2021-01-12
  • 1970-01-01
  • 2021-07-27
  • 2019-11-03
  • 2021-07-18
  • 2019-11-10
  • 1970-01-01
相关资源
最近更新 更多