Jes*_*ord 7 reactjs isomorphic-javascript
我正在React中构建一个Isomorphic Application,它首先渲染一个组件服务器端,然后利用React的智能重新渲染浏览器端.
我遇到过这种情况,在React能够首先呈现浏览器端之前,DOM可能与React组件的状态不同步.这可能发生在用户使用慢速Internet连接时,react.js文件需要一段时间才能下载(这也是我构建同构应用程序的原因)
这是我放在一起展示这种情况的一个例子:http://jsfiddle.net/jesstelford/z4o44esb
var TodoItem = React.createClass({
// ...
render: function() {
return (
<label>
<input type="checkbox" defaultChecked={this.state.done} onChange={this.onChange} />
{this.props.name}
</label>
);
}
});
// User toggles checkbox ON here, before React is rendered browser-side
// render using React browser-side
var renderedComponent = React.render(component, document.getElementById('content'));
// Incorrectly outputs { done: false }
console.log('React state:', renderedComponent.state);
Run Code Online (Sandbox Code Playgroud)
我找到了一个可能的解决方案React refs:http://jsfiddle.net/jesstelford/z4o44esb/2
var TodoItem = React.createClass({
// ...
syncStateFromDOM: function() {
this.setDone(this.refs.done.getDOMNode().checked);
},
render: function() {
return (
<label>
<input ref="done" type="checkbox" defaultChecked={this.state.done} onChange={this.onChange} />
{this.props.name}
</label>
);
}
});
// User toggles checkbox ON here, before React is rendered browser-side
// render using React browser-side
var renderedComponent = React.render(component, document.getElementById('content'));
// Sync state from the DOM
renderedComponent.syncStateFromDOM()
// Correctly outputs { done: true }
console.log('React state:', renderedComponent.state);
Run Code Online (Sandbox Code Playgroud)
这种方法的缺点是:
在预渲染React组件服务器端时,是否有任何方法可以在呈现浏览器端之前将DOM状态同步到该React组件,因为在React加载浏览器端之前,用户已经操纵了DOM?
谢谢!
这是一个有趣的问题!在较高的层面上,问题是当您单击复选框时,React没有捕获冒泡到顶级组件的"更改"事件,因为它尚未在客户端实例化.您的半解决方案通过手动模拟调用来处理此问题onChange.我开始认为你可能需要排队onChange事件......但后来我意识到React已经拥有你需要的一切.
"三季度"的解决方案是简单地重命名syncStateFromDOM到componentDidMount,甚至不费心手动调用它.根据文档,在最新版本的React中,componentDidMount只在浏览器中调用,并且它是组件安装后的生命周期回调(即何时React.render即将返回).它是您用例的理想之选.请参阅:http://jsfiddle.net/qdt4z3w9/
这解决了组件本身外部代码的问题!但是在原始渲染发生之后仍然存在状态设置.不幸的是,我认为这基本上就是React的工作方式 - 为了能够将现有的DOM节点与refs相匹配,每个组件都需要首先完全安装.但是额外的虚拟DOM差异是一个很小的代价,因为它的设计是闪电般快速的.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
3231 次 |
| 最近记录: |