javascript - ReactJS 在客户端和服务器上运行不同的代码。

标签 javascript reactjs

我正在使用 https://github.com/andreypopp/react-quickstart在让页面在客户端动态更新之前在服务器端呈现页面。

有些页面需要来自服务器的数据。在客户端上运行时,他们通过 superagent 获取此信息。

在初始(服务器端)呈现期间,我希望页面的 getInitialState 直接获取它的数据。

这可能吗?

最佳答案

有几种方法可以解决这个问题。

您正在使用的模板 react-quickstart 使用 audreypopp 的 react-async 插件来处理具有异步状态的渲染组件。它的自述文件中有一个部分描述了这个确切的场景:https://github.com/andreypopp/react-async#rendering-async-components-on-server-with-fetched-async-state .

基本上,您可以向 ReactAsync.renderComponentToStringWithAsyncState 的回调函数添加第三个参数,它指向您当前服务器状态的快照。自述文件提供了以下示例:

ReactAsync.renderComponentToStringWithAsyncState(
  Component(),
  function(err, markup, data) {
    res.send(ReactAsync.injectIntoMarkup(markup, data, ['./client.js']))
})

injectIntoMarkup 将预取的状态数据作为 JSON blob 注入(inject),可以在代码的其他地方引用为 window.__reactAsyncStatePacket

另一种方法不使用 react-async。相反,您可以调用 React.renderComponentToString,将预取的服务器数据作为 props 传递。

var markup = React.renderComponentToString(
    Item({ data: SERVER_DATA })
);

注意:您必须向您的组件代码添加一些条件逻辑,以区分直接作为 props 或通过 ajax/superagent 接收您的状态,但它应该直截了当。

现在,为了这个例子,假设您正在使用 Handlebars/Express,您可以将组件字符串注入(inject)到模板中:

res.render('template', {
    markup: markup
});

还有你的模板:

<div id="container">{{{ markup }}}</div>

最后,为了让您的组件在客户端上正常工作,您可以像通常在客户端上那样调用 React.renderComponent。 React 知道不会替换刚刚从服务器渲染的组件,但在将来必要时重新渲染它们。

希望这对您有所帮助,并乐于回答任何问题!

关于javascript - ReactJS 在客户端和服务器上运行不同的代码。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25660859/

相关文章:

reactjs - React useState - 我应该如何使用 setter 函数?

html - 居中对齐的word文档样式输入标签

javascript - 如何在 reactjs 中使用 promises 而不是回调?

javascript - 使用 Mongoose 将 GridFS-Stream 文件与架构关联

javascript - 自定义按钮

javascript - 按键jquery上的表单验证

javascript - 使用部分匹配或子字符串来获取索引号

javascript - jQuery 动画回调中的变量导致父循环中的范围困惑

reactjs - 在 ClojureScript 中,如何正确使用 cljsjs/react-mdl?

reactjs - 下一个js图像组件错误 "url"参数有效但上游响应无效