当前位置: 首页 > 知识库问答 >
问题:

React Redux服务器渲染,但客户端获取数据

商松
2023-03-14

我正在我的演示反应应用程序上进行服务器渲染。虽然它的工作原理,如果我刷新一个网址上的页面来获取医生,如/doctor/:id,如果我在/login并尝试去/医生/123456医生属性是空的,并且(这个.props.医生.name.first)失败。

在这些情况下,使用redux获取数据的好方法是什么?

代码如下

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);

异径管

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;

行动

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)));
    };
}

日志错误

TypeError: Cannot read property 'name' of undefined

共有1个答案

葛桐
2023-03-14

一种用户友好的方法是在不需要医生的情况下进入页面,这样用户就可以得到他的操作(导航到第x页)有效的即时反馈。在react-router的onEnter方法中或在compentDidMount中,您应该启动一个操作fetchDr,同时向用户显示一个微调器或一条消息,指示正在加载数据

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

所以上面的渲染方法在加载数据时显示一些东西,当数据进来时,它会毫无错误地显示它。

处理异步操作的“好旧”方法是使用重制操作。您可以阅读有关分派异步 redux 操作的精彩 SO 答案。

最新的趋势是使用重制传奇。它是一个库,旨在使 React/Redux 应用程序中的副作用(即异步内容,如数据获取和不纯内容,如访问浏览器缓存)更容易、更好。更多关于重制传奇的信息

因此,在您的情况下,您将创建一个传奇来处理获取。

关于redux-thunkvsredux-saga的更多信息,请参阅这个伟大的SO答案。

 类似资料:
  • 问题内容: 我刚刚开始研究ReactJS,发现它为您提供了两种渲染页面的方法:服务器端和客户端。但是,我不知道如何一起使用。是使用两种单独的方法来构建应用程序,还是可以将它们一起使用? 如果可以一起使用,该如何做- 我们是否需要在服务器端和客户端重复相同的元素?或者,我们是否可以仅在服务器上构建应用程序的静态部分,而在客户端构建动态部分,而无需与已经预先渲染的服务器端建立任何连接? 问题答案: 对

  • 我刚刚开始研究ReactJS,发现它提供了两种呈现页面的方法:服务器端和客户端。但是,我不明白如何一起使用它。构建应用程序有两种不同的方法,还是可以一起使用? 如果我们可以一起使用它,如何做到这一点——我们需要在服务器端和客户端复制相同的元素吗?或者,我们可以只在服务器上构建应用程序的静态部分,在客户端构建动态部分,而不与已经预渲染的服务器端建立任何连接吗?

  • info 如果您能了解下面这些技术,能加快您对本文的了解 vuex - Vue.js 应用程序开发的状态管理模式 Vue.js SSR - Vue.js 服务器端渲染 webpack - 编译构建工具 Lavas 服务器端渲染模板参考了 vue-hackernews 的渲染和开发机制,并且结合了 Lavas 的 App Shell 模板,导出的工程中会有 App Shell 等 如果您不了解 vu

  • React 提供了两个方法 renderToString 和 renderToStaticMarkup 用来将组件(Virtual DOM)输出成 HTML 字符串,这是 React 服务器端渲染的基础,它移除了服务器端对于浏览器环境的依赖,所以让服务器端渲染变成了一件有吸引力的事情。 服务器端渲染除了要解决对浏览器环境的依赖,还要解决两个问题: 前后端可以共享代码 前后端路由可以统一处理 Rea

  • 如果你调研服务器端渲染(SSR)只是用来改善少数营销页面(例如/,/about,/contact等)的 SEO,那么你可能需要预渲染。无需使用 web 服务器实时动态编译 HTML,而是使用预渲染方式,在构建时(build time)简单地生成针对特定路由的静态 HTML 文件。优点是设置预渲染更简单,并可以将你的前端作为一个完全静态的站点。 如果你使用 webpack,你可以使用prerende

  • 服务端渲染一个很常见的场景是当用户(或搜索引擎爬虫)第一次请求页面时,用它来做初始渲染。当服务器接收到请求后,它把需要的组件渲染成 HTML 字符串,然后把它返回给客户端(这里统指浏览器)。之后,客户端会接手渲染控制权。 下面我们使用 React 来做示例,对于支持服务端渲染的其它 view 框架,做法也是类似的。 服务端使用 Redux 当在服务器使用 Redux 渲染时,一定要在响应中包含应用