React SSR-在异步操作后呈现组件

时间:2019-01-13 13:35:05

标签: javascript reactjs serverside-rendering ssr

React的组件生命周期与DOM紧密相关,因此当我尝试在异步操作后在服务器端进行渲染时,会遇到问题。

我有一个组件(我们称它为包含组件),它负责根据其属性传递的数据动态导入另一个组件(我们称其为内部组件)。

一旦解决了导入承诺,我想在包含组件内部渲染内部组件。

问题是,我无法访问包含组件的生命周期。

render()仅在构建包含组件时触发一次。

由于无法调用componentDidMount()的相同原因,因此无法通过forceUpdate()和setState()更新组件。

使用服务器渲染时,如何在服务器端执行异步操作后渲染组件?

到目前为止,我的代码:

import React from 'react';

export default class ComponentLoader extends React.Component<{ component: string }, { component: any }> {

    constructor(props) {
        super(props);

        this.state = {
            component: null
        }; //no-op
    }

    componentDidMount(): void {
        //never called
    }

    componentWillMount(): void {
        import('./' + this.props.component).then(module => {
            this.forceUpdate(); //no-op
            this.setState({ component: React.createElement(module.default) }); //no-op
        });
    }

    render() {
        //called only once during construction
        return this.state.component || null; //this.state won't be available, nor will it matter if I access component any other way since render() won't be called again once that component is resolved anyway.
    }

}

1 个答案:

答案 0 :(得分:0)

我最终使用了可加载组件,但实现方式与您在注释中看到的有所不同。

https://github.com/jamiebuilds/react-loadable

https://github.com/konradmi/react-loadable-ssr-code-splitting

在服务器端,它确保仅在所有依赖项异步加载后才渲染react组件。这样一来,渲染是同步的,因为这是目前唯一支持的功能(尽管有功能要求支持async react ssr),但是加载是异步完成的,因此它不会阻止任何其他操作。