首页 文章

React JS同构渲染

提问于
浏览
2

ReactJS,原始Flux,react-router,nodeJS,socket.io一切都是最新的 .

如果我在浏览器中关闭javascript,则只呈现静态代码 .

在服务器端渲染 ComponentWillMountrender 方法被激发,但不是 ComponentDidMount .
即使我将Flux逻辑放入 ComponentWillMount 方法,也没有任何反应:调用action,但socket.io不向服务器发送请求以从数据库获取数据 . 这意味着,没有从数据库中检索数据,也没有对搜索引擎有任何用处 . 如果启用了javascript,一切都很完美 .

这里有重要的代码片段:

零件 . 添加侦听器和调用操作:

componentDidMount() {
    StoreUser.addChangeListener(this._onChange);
    Actions.getUser(this.props.params.userid)   
}

客户端的操作要求服务器提供用户数据:

function _getUser (userid) {
  socket.emit('getUser', userid)
}

直到这个地方服务器端渲染工作,但服务器本身没有收到 getUser 事件,所以没有进一步发生 . 同样,如果在浏览器中启用了javascript,这一切都可以正常工作 . 服务器接收此调用并返回用户的数据 .

如何使服务器接收此事件,返回用户的数据并在发送到客户端之前呈现它?作为替代方案,可能有不同的方式使其SEO友好?

1 回答

  • 3

    React的 componentDidMount 生命周期钩子不称为服务器端,as stated in the docs .

    如果需要在组件的 render 方法中获取数据并在服务器端使用它,则需要在初始渲染期间将此数据作为 props 传递 . 这意味着,即使调用了挂钩,也无法在 componentWillMount 期间获取它 .

    要实现您的目标,您需要服务器端代码:

    • 确定将呈现哪些组件

    • 调度正确的操作,以便正确填充您的商店

    • 仅渲染组件 - 因为数据可用于在初始渲染中传递给组件

    有关如何实现这一点的细节当然取决于您的通道实现,您使用服务器端的框架等 .

相关问题