React/Redux Component will not render

2019-07-28 02:42发布

问题:

My component is not rendering and I am not getting any errors. I have been stuck on this error for a few hours now so I am looking for any advice!

I am trying to get a data to display when page loads using componentWillMount() and nothing is currently showing up. Before I was able to render simple strings with the component. Now I am not getting any console logs from components, not text, nothing... my api works but I am not getting http calls in chrome console. Below are my files.

indexTimesheet.js (component)

import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux';
import getTimesheet from '../actions/getTime';

class IndexTimesheet extends Component {
  componentWillMount() {
    console.log("test");
    this.props.getTimesheet();
  }

  render() {
    return (
      <h3>Index Timesheet</h3>
    );
  }
}

IndexTimesheet.propTypes = {
  getTimesheet: PropTypes.func
};

export default connect(null, {getTimesheet})(IndexTimesheet);

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import {Provider} from 'react-redux';
import {createStore, applyMiddleware} from 'redux';
import {Router, Route, browserHistory} from 'react-router'; // , IndexRoute
import promise from 'redux-promise';
import reducers from './app/reducers';

const createStoreWithMiddleware = applyMiddleware(promise)(createStore);

// components
import {IndexTimesheet} from './app/components/indexTimesheet';

ReactDOM.render(
 <Provider store={createStoreWithMiddleware(reducers)}>
   <Router history={browserHistory}>
     <Route path="/" component={IndexTimesheet}/>
   </Router>
 </Provider>,
document.getElementById('root')
);

getTime.js (action file)

import axios from 'axios';
export const GET_TIME = 'GET_TIME';
export const ROOT_URL = 'http://127.0.0.1:3055/api/v1/timesheet/';


export function getTimesheet() {
  const request = axios.get(ROOT_URL);

  return {
    type: GET_TIME,
    payload: request
  };
}

timesheet reducer.js

import {GET_TIME} from '../actions/getTime';
const INITIAL_STATE = {all: [], user: []};

export default function (state = INITIAL_STATE, action) {
  switch (action.type) {
    case GET_TIME:
  return {state, all: action.payload.data};
    default:
  return state;
  }
}

index reducer

import {combineReducers} from 'redux';
import TimesheetReducer from './timesheet';

const rootReducer = combineReducers({
  time: TimesheetReducer
});

export default rootReducer;

回答1:

I was able to re-create your project in a boilerplate template I have and was also able to re-create your issue.

In your index.js:

// components

import {IndexTimesheet} from './app/components/indexTimesheet';

Should be this - no brackets around the component:

import IndexTimesheet from './app/components/indexTimesheet';

This is an interesting problem because, as you say, it throws no errors...when you have it wrapped with the redux store and react-router.

If you were to simply do:

ReactDOM.render(<IndexTimesheet />, document.getElementById('root'));

This WILL throw an error:

warning.js:45 Warning: React.createElement: type should not be null, undefined, boolean, or number. It should be a string (for DOM elements) or a ReactClass (for composite components).warning @ warning.js:45ReactElementValidator.createElement @ ReactElementValidator.js:221(anonymous function) @ index.js:37(anonymous function) @ index.js:39(anonymous function) @ index.js:40(anonymous function) @ bundle.js:1036__webpack_require__ @ bundle.js:556fn @ bundle.js:87(anonymous function) @ multi_main:3(anonymous function) @ bundle.js:586__webpack_require__ @ bundle.js:556(anonymous function) @ bundle.js:579(anonymous function) @ bundle.js:582
invariant.js:39 Uncaught Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined.

So somewhere that error is being swallowed by Redux/React-Router, I haven't dug into where. In future troubleshooting always try to simplify your problem. Make everything as bare-bones as possible and then build it until you get the error - I took off your redux store and react-router wrapping which was how I was able to uncover it.

Try it out and see to make sure it wasn't just on my build.