【发布时间】:2019-01-13 13:35:04
【问题描述】:
React 的组件生命周期与 DOM 密切相关,因此当我尝试在异步操作后在服务器端进行渲染时,我遇到了问题。
我有一个组件(我们称之为包含组件),它负责根据其 props 中传递的数据动态导入另一个组件(我们称之为内部组件)。
一旦导入承诺得到解决,我想在包含组件的内部渲染内部组件。
问题是,我无法访问包含组件的生命周期。
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.
}
}
【问题讨论】:
-
请在您的问题中发布您迄今为止尝试过的相关代码。
-
给你,添加。
-
为了 SSR,您可能需要将代码重构为同步。使用
require。 -
require 可以实现加载同步。我将如何解决其他异步案例,如 s2s 请求?例如,我将无法将 await 放入构造函数中。有类似的解决方案吗?抛开一切同步,在使用 SSR 时真的不可能异步执行吗?尝试扩展时,使所有内容同步可能是一个问题,即在此处查看警告,让我知道您的想法:npmjs.com/package/sync-request
-
看看
loadable-components,这是React官方文档中推荐的在服务器上延迟加载React组件的方法:github.com/smooth-code/loadable-components/blob/master/packages/…
标签: javascript reactjs server-side-rendering