Получение ‘this.props.user’ не определено при попытке подключить компонент React с помощью Redux

#reactjs #react-redux

#reactjs #react-redux

Вопрос:

Я пытаюсь создать компонент React с использованием REST API-заполнителя JSON, используя redux в качестве API управления состоянием. Я могу видеть, как действие отправляется в redux logger, но каким-то образом, когда я пытаюсь получить доступ к измененным состояниям через свойство компонента, я получаю ‘this.props.user’ не определено в окне консоли браузера. Пожалуйста, найдите мой код ниже :

Reducer:

 import {FETCH_DATA} from  '../Actions/actionTypes';

const initialState={
    userlist:[]
}

function jphReducer(state=initialState,action){
      switch(action.type){

          case FETCH_DATA:
              
              state={
                  ...state,
                  userlist:action.payload
              }
            
            break;
          default :
             state;
      }
      return state;
}

export default jphReducer;

  

Экшен:

 import axios from 'axios';
import {FETCH_DATA} from  '../Actions/actionTypes';

 export  const  getjphData = () => async dispatch => {
      await  axios.get("https://jsonplaceholder.typicode.com/users").then(
          response => {
               dispatch({
                  type:FETCH_DATA,
                  payload:response.data
                  
              });
          },
          reason => {
              dispatch({
                  type:FETCH_DATA,
                  payload:reason
              });
          }
      );
 }
  

MainComponent:

 import React,{Component} from 'react';
import {getjphData} from  '../app/Actions/jphAction';
import { connect } from 'react-redux';
import jphReducer from '../app/Reducers/jphReducer';
import propTypes from "prop-types";
import { FETCH_DATA } from './Actions/actionTypes';

 class MainComponent extends Component{

    constructor(props){
        
        super(props);
        
    }
    componentDidMount(){
        
        this.props.getData(); 
        
           
    }
     render(){
        
         return(
            
               <div>
                
                 <table>
                     <thead>
                     <th>
                         <td>ID</td>
                         <td>name</td>
                         <td>username</td>
                         <td>Email</td>
                     </th>
                     </thead>
                     <tbody>
                    {
                        
                        this.props.users.map((user) =>
                          <tr>
                              <td>{user.id}</td>
                              <td>{user.name}</td>
                              <td>{user.username}</td>
                              <td>{user.email}</td>
                          </tr>
                        )
                    }
                     </tbody>
                 </table>
                
             </div>
             
         );
           
         
     }
 }

 const mapDispatchToProps = dispatch => ({
    getData :  dispatch(getjphData())
    
});

const mapStateToProps = state => ({
    
    
        users: state.userlist
    
});

export default connect(mapStateToProps,mapDispatchToProps)(MainComponent);

  

Корневой компонент :

 import React,{Component} from 'react';
import {Provider} from 'react-redux';
import {jphStore} from  './jphStore';
import MainComponent from './MainComponent';
import { connect } from 'react-redux';

export default class RootComponent extends Component{
    constructor(props){
        super(props);
    }
    render(){
        return(
            <Provider store={jphStore}> 
                <MainComponent/>
            </Provider>
        );
    }
}

  

Ответ №1:

Ваш users.map пытается запуститься сразу, даже до того, как будет выполнен запрос на получение пользователей, поэтому, чтобы убедиться, что это props.users определено, прежде чем пытаться сопоставить его, добавьте условие перед ним следующим образом this.props.users amp;amp; this.props.users.map...

Ваше tbody сообщение должно выглядеть следующим образом

       <tbody>
          {
              this.props.users amp;amp; this.props.users.map((user) =>
                  <tr>
                      <td>{user.id}</td>
                      <td>{user.name}</td>
                      <td>{user.username}</td>
                      <td>{user.email}</td>
                  </tr>
              )
          }
       </tbody>
  

Комментарии:

1. Спасибо! это было единственное missing…it сработало