dom - ReactJS 可以根据服务器端渲染的 DOM 初始化其状态吗?

标签 dom reactjs progressive-enhancement isomorphic-javascript reactjs.net

喜欢它是多么容易做到isomorphic JavaScript in React 。唯一让我困扰的是它的工作原理是浏览器必须下载数据两次。首先是 DOM 标记,然后是 JSON 格式,以便在运行时初始化状态。所有数据都已经存在于 DOM 中,React 不应该能够仅基于这些数据进行重新水化吗?

screenshot of react component rendered server-side screenshot of the data duplicated in JSON format

我已经做了一些实验 progressive enhancement in KnockoutJS使用自定义绑定(bind)处理程序。我希望有一种方法可以实现与 React 类似的功能。

//Custom binding to load the values into the view model from the DOM
ko.bindingHandlers.PE = {
    init: function(element, valueAccessor, allBindings) {
        var bindings = allBindings();
        if (typeof bindings.text === 'function') {
            bindings.text($(element).text());
        }
    }
};

更新

将逻辑放入 React 中以从 DOM 读取值似乎并不符合习惯。但没有什么可以阻止您编写一些 JavaScript 来自己收集值!鉴于 example above你可以做类似下面的事情。

var comments = $('.media').map(function() {
  return {
    Author: $(this).find('.media-object').attr('src'),
    Text: $(this).find('.media-body').text()
  };
});

然后使用它来初始化客户端的 react 组件。我对此很满意。

最佳答案

渲染是 React 中的一种单向转换。它没有在 DOM 中存储足够的信息来重建创建 DOM 的数据结构。 data-react-id 属性用于 React 的 diffing algorithm但不用于存储有关用户数据的信息。

从你的例子(data-react-id这里是任意的,我手写的):

var Comment = React.createClass({
  render: function() {
    return (
      <div className="comment">
        <h3 className="commentAuthor">{this.props.comment.Author}</h3>
        {this.props.comment.Text}
      </div>
    );
  }
});

React.render(
  <Comment comment={{"Author": "Shellie", "Text": "semper, dui lectus"}} />,
  ...
);

...

<!-- Output -->
<div class="comment" data-react-id=".x.0">
  <h3 class="commentAuthor" data-react-id=".x.0.0">Shellie</h3>
  <span data-react-id=".x.0.1">semper, dui lectus</span>
</div>

DOM 中没有关于字符串“Shellie”来自何处以及“semper, dui lectus”来自何处的信息。此示例产生相同的输出:

var Comment = React.createClass({
  render: function() {
    return (
      <div className="comment">
        <h3 className="commentAuthor">Shellie</h3>
        semper, dui lectus
      </div>
    );
  }
});

React.render(
  <Comment />,
  ...
);

...

<!-- Output -->
<div class="comment" data-react-id=".x.0">
  <h3 class="commentAuthor" data-react-id=".x.0.0">Shellie</h3>
  <span data-react-id=".x.0.1">semper, dui lectus</span>
</div>

关于dom - ReactJS 可以根据服务器端渲染的 DOM 初始化其状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28488236/

相关文章:

java - 如何知道一个标签是否包含一个值或另一个标签?

java - 如何在不使用 JAXB 的情况下以编程方式创建 XSD 文件和 XML?

javascript - React JS 尝试映射集合,值未定义

javascript - Flash Of Un X 是否有任何协议(protocol)增强功能?

javascript - 是否可以在关闭 JS 的情况下使 AJAX 站点可抓取并优雅地降级?

javascript - 如何将 span 的内容复制到它的 title 属性中?

javascript - 更改文本框的颜色并在 Javascript 验证中添加文本

javascript - 如何在 react 加载后运行普通 JavaScript?

javascript - react Axios : How to send just the state value of my prop to backend

javascript - jQuery Mobile 1.4 未增强使用 knockout.js 添加的内容