如何用同构的React处理子组件
How to handle child components with isomorphic React?
我有这样的服务器代码:
var data = {
scripts: scripts,
children:[<Comp1 />, <Comp2 />, <Comp3 />]
};
// keeping smaller for easier example than reality
var markup = '';
markup += '<script type="text/javascript">' +
'var PROPS = {' +
'Layout: ' + JSON.stringify(data) +
'};' +
'</script>';
markup += React.renderToString(
<Layout {...data} ></Layout>
);
所以服务器呈现一切正常。然后,不管我怎么尝试,我得到各种各样的警告,关于我如何处理孩子序列化和重用在浏览器中,当我运行:React.render(App(window.PROPS.Layout), document.getElementById('content'));
我的目标是呈现Layout组件和几个子组件,并让浏览器中的React知道下面有相同的元素。多次尝试也会产生如下错误:
Warning: React attempted to reuse markup in a container but the checksum was invalid. This generally means that you are using server rendering and the markup generated on the server was not what the client was expecting. React injected new markup to compensate which works but you have lost many of the benefits of server rendering. Instead, figure out why the markup being generated is different on the client or server:
(client) d=".1frk89jhyio.1"></div><div data-react
(server) d=".1frk89jhyio.1"><div style="float:lef
我的客户端代码是:
var React = require('react'),
Layout = require('./components/layout');
React.render(<Layout {...PROPS.Layout} />, document.getElementById('content'));
您不应该像这样将组件字符串化以服务于客户端。你应该重新渲染你的应用程序。需要字符串化的应该是原始数据,如{id: 1, name: 'limelights'}
。
在服务器上
React.renderToString(<Layout {...data} />);
和客户端
var data = JSON.parse(window.PROPS.data);
React.render(<Layout {...data} />, document.body);
使用同构应用程序的关键在于,相同的代码可以同时在服务器和客户机上运行。
我的答案是,我做事情的理论错误的方式。
有服务器渲染像<Layout {...data} ><Comp1 /></Layout>
将工作。然而,当浏览器启动时,它将没有子道具,您将失去Comp1
。然后,我试着把孩子们当作道具,就像我问题中的例子。真正的方法是让服务器执行<Layout {...data} ></Layout>
。
答案的真正关键是Layout
的render
方法应该直接放置孩子。我可以在渲染中使用状态(或道具,仍然在计算语义差异)来确定子元素是否应该不同。
相关文章:
- 处理表行的当前子级,而不是名称或类的所有元素
- 正在尝试处理子窗口上的关闭窗口事件
- 如何在元素中处理鼠标事件,但不能在其子元素上处理
- API的快速路由-当您有子资源时的URL处理程序
- 检测单击子节点并发送槽事件处理程序
- 有没有更好的方法来处理窗口属性&React/Redux中的子组件
- 按子数组处理数组
- "执行处理程序'的子请求时出错;System.Web.UI.Page'"同时使用JQu
- 反应:无法访问父级事件处理程序中的子道具
- 我们如何处理包含带有秘银的子数组的数据模型
- 子元素上的 JavaScript 事件处理程序
- 用于将鼠标悬停在元素及其所有子元素上的处理程序
- 在 Javascript 中,如何从父事件处理程序中防止子元素的默认
- requirejs 如何处理子页面
- 如何在 Fabric.js 子类中定义事件处理程序
- 让元素的子元素单独但按顺序进行动画处理
- 处理通过聚焦在子元素上并通过单击子元素外部触发的父元素的模糊事件
- 子级和父级都是事件处理程序.可能
- hammer.js - 父节点和子节点上的不同滑动处理程序
- jQuery:绑定一个可以处理其子级事件的单个事件侦听器