React Redux server render but client side fetch data

Panagiotis Vrs

I am having server render on a demo react application of mine. Although it works if i refresh the page on a url to fetch the doctor like /doctor/:id if i am at /login and try to go to /doctor/123456 the doctor property is empty and (this.props.doctor.name.first) fails.

What is a good approach to use redux to fetch data on these cases?

Code is below

import { fetchDoctor } from '../../DoctorActions';
import { getDoctor } from '../../DoctorReducer';

class DoctorDetailPage extends Component {
    render() {
        return (
            <div>{this.props.doctor.name.first}</div>
        );
    }
}

DoctorDetailPage.need = [params => {
    return this.props.dispatch(fetchDoctor(params.id));
}];

function mapStateToProps(state, props) {
    return {
        doctor: getDoctor(state, props.params.id),
    };
}
DoctorDetailPage.propTypes = {
    doctor: PropTypes.shape({
        insurance: PropTypes.string,
        description: PropTypes.string,
        GUID: PropTypes.string,
        name: PropTypes.shape({
            first: PropTypes.string,
            last: PropTypes.string,
        })
    }),
    dispatch: PropTypes.func.isRequired,
};

export default connect(mapStateToProps)(DoctorDetailPage);

REDUCER

import { ADD_DOCTOR } from './DoctorActions';

// Initial State
const initialState = { list: [] };

const DoctorReducer = (state = initialState, action = {}) => {

    switch (action.type) {
        case ADD_DOCTOR:
            return {
                list: [action.doctor, ...state.list],
            };

        default:
            return state;
    }
};

export const getDoctor = (state, id) => {
  return state.doctors.list.filter(doctor => doctor._id === id)[0];
};

export default DoctorReducer;

ACTIONS

import callApi from '../../util/apiCaller';

// Export Constants
export const ADD_DOCTOR = 'ADD_DOCTOR';

// Export Actions
export function addDoctor(doctor) {
    return {
        type: ADD_DOCTOR,
        doctor,
    };
}

export function addDoctorRequest() {
    return () => {
        return true;
    };
}

export function fetchDoctor(id) {
    return (dispatch) => {
        return callApi(`doctors/${id}`)
            .then(res => dispatch(addDoctor(res)));
    };
}

LOG ERROR

TypeError: Cannot read property 'name' of undefined
Deividas Karzinauskas

What is a good approach to fetch data in general?

A user friendly approach would be to enter the page /doctor/123456 wihtout the need of having the doctor available, so user get's instant feedback that his action (navigate me to page x) worked. In onEnter method of react-router or in componentDidMount you should start an action fetchDoctor and in a meanwhile show the user a spinner or a message indicating that the data is being loaded.

render() {
    return (
        <div>
          { this.props.doctor && <div>{this.props.doctor.name.first}</div> }
          { ! this.props.doctor && <YourSpinnerComponent/> }
        </div>
    );
}

So the above render method shows something while data is being loaded and when data comes in it displays it without any errors.

What is a good approach to fetch data using redux?

The "good old" way to handle async operations is to use redux-thunk. You can read this great SO answer about dispatching asynchronous redux actions.

The latest trend is to use redux-saga. It is a library that aims to make side effects (i.e. asynchronous things like data fetching and impure things like accessing the browser cache) in React/Redux applications easier and better. More about redux-saga.

So in your case, you would create a Saga to handle the fetching.

More about redux-thunk vs redux-saga in this great SO answer.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Fetch latest data on client side from server in meteor app

From Dev

Client side data to server side

From Dev

How to render component in react server side with async data

From Dev

Passing client-side parameters to the server-side with React/redux and Express (EMPTY_RESPONSE error)

From Dev

react server side rendering with client side routing

From Dev

react server side rendering with client side routing

From Dev

Pass data from client side to server side

From Dev

Pass data from client side to server side

From Dev

Rails 5 Redux React Server Side Rendering gives client side JavaScript warning 'Replacing React-rendered children with a new...'

From Dev

How to logically combine react-router and redux for client- and server-side rendering

From Dev

How to send data from server-side (Express.js) to client-side (React.js)?

From Dev

Render React JS server side using .net

From Dev

React-router unable to render on server side

From Dev

React Context undefined in Server Side Render

From Dev

Server side rendering with async data fetch

From Dev

Using fetch to render json data in react app

From Dev

React/Redux server side rendering initial state

From Dev

Server-side rendering with Node/React. How do I fetch the data?

From Dev

how to fetch data in react using redux?

From Dev

React Redux data-fetching : differentiate browser / server-side method in isomorphic app?

From Dev

Where do I fetch initial data from server in a React Redux app?

From Dev

Is it normal for NPoco/PetaPoco Fetch() to get all data and then filter client side?

From Dev

Client side data not reaching server side...maybe

From Dev

Send gridview data from client side to server side at once

From Dev

Rails: Getting a client side bit of data to server side model callbacks

From Dev

React/Redux/Router client-side login credentials - restricted page

From Dev

React, redux, and react-router server side rendering

From Dev

How to fetch a .txt file from a different domain from server side javascript and get it client side

From Dev

Server side react-router won't render my routes

Related Related

  1. 1

    Fetch latest data on client side from server in meteor app

  2. 2

    Client side data to server side

  3. 3

    How to render component in react server side with async data

  4. 4

    Passing client-side parameters to the server-side with React/redux and Express (EMPTY_RESPONSE error)

  5. 5

    react server side rendering with client side routing

  6. 6

    react server side rendering with client side routing

  7. 7

    Pass data from client side to server side

  8. 8

    Pass data from client side to server side

  9. 9

    Rails 5 Redux React Server Side Rendering gives client side JavaScript warning 'Replacing React-rendered children with a new...'

  10. 10

    How to logically combine react-router and redux for client- and server-side rendering

  11. 11

    How to send data from server-side (Express.js) to client-side (React.js)?

  12. 12

    Render React JS server side using .net

  13. 13

    React-router unable to render on server side

  14. 14

    React Context undefined in Server Side Render

  15. 15

    Server side rendering with async data fetch

  16. 16

    Using fetch to render json data in react app

  17. 17

    React/Redux server side rendering initial state

  18. 18

    Server-side rendering with Node/React. How do I fetch the data?

  19. 19

    how to fetch data in react using redux?

  20. 20

    React Redux data-fetching : differentiate browser / server-side method in isomorphic app?

  21. 21

    Where do I fetch initial data from server in a React Redux app?

  22. 22

    Is it normal for NPoco/PetaPoco Fetch() to get all data and then filter client side?

  23. 23

    Client side data not reaching server side...maybe

  24. 24

    Send gridview data from client side to server side at once

  25. 25

    Rails: Getting a client side bit of data to server side model callbacks

  26. 26

    React/Redux/Router client-side login credentials - restricted page

  27. 27

    React, redux, and react-router server side rendering

  28. 28

    How to fetch a .txt file from a different domain from server side javascript and get it client side

  29. 29

    Server side react-router won't render my routes

HotTag

Archive