当前位置: 首页 > 面试题库 >

React.js服务器端渲染和事件处理程序

崔绍辉
2023-03-14
问题内容

我正在学习使用react.js并在使用事件处理程序时遇到一些问题。最后一个问题是:是否可以使用服务器端渲染并将事件处理程序自动发送到客户端?

这是我的示例:我有一个index.jsx,它渲染服务器端并发送给客户端

var React = require("react");
var DefaultLayout = require("./layout/default");

var LikeButton = React.createClass({
  getInitialState: function() {
    return {liked: false}; 
  }, 
  handleClick: function(event) {
    this.setState({liked: !this.state.liked});
  }, 
  render: function() {
    var text = this.state.liked ? 'like' : 'haven\'t liked';
    return (
      <p onClick={this.handleClick}>
        You {text} this. Click to toggle.
      </p>
    );
  } 
});

var IndexComponent = React.createClass({
   render: function(){
       return (
           <DefaultLayout title={this.props.name}>
                <div>
                        <h1>React Test</h1>
                </div>

                <div id="testButton">
                    <LikeButton/>
                </div>

                <script type="text/babel" src="/js/react.js"></script>
           </DefaultLayout>
       )
   }   
});

但是“赞按钮”没有任何交互。要使其单击,我必须添加此代码客户端。

var LikeButton = React.createClass({
  getInitialState: function() {
    return {liked: false};
  },
  handleClick: function(event) {
    this.setState({liked: !this.state.liked});
  },
  render: function() {
    var text = this.state.liked ? 'like' : 'haven\'t liked';
    return (
      <p onClick={this.handleClick}>
        You {text} this. Click to toggle.
      </p>
    );
  }
});

ReactDOM.render(
  <LikeButton />,
  document.getElementById('testButton')
);

我只是从react.js开始的,也许我只是在这里缺少一些主要概念。但是,为什么在呈现页面服务器端时react.js不仅创建代码(我现在必须手动将其添加到客户端)?像这样,我有多余的代码,感觉这在大型应用程序中将是一团糟。至少react.js足够聪明,不会绘制两个LikeButton,而是将一个创建的服务器端“绑定”到客户端组件。


问题答案:

对于客户端交互式React应用程序,您还需要渲染该应用程序客户端。通常,此代码与您在服务器上运行的代码相同, 因此没有多余的代码
。这是相同的代码。您可能会问自己,在客户端和服务器上进行渲染是否都可能会过头,但是从性能和SEO的角度来看,这是很合理的。

ReactDOMServer.renderToString(<MyApp foo={bar} />)基本上只渲染带有标记的字符串。没有javascript或任何魔术。只是普通的旧HTML。但是,呈现的标记具有大量的React
ID属性,这些属性随后将在客户端上用于生成初始的虚拟DOM和附加事件。

当您再次在客户端上呈现应用程序时,在服务器端呈现标记被注入到服务器的同一DOM元素上,React不需要重新绘制整个应用程序。它只是创建一个新的Virtual
DOM树,将其与初始Virtual
DOM树进行比较,并进行必要的DOM操作(如果有)。首先,虚拟DOM的概念使React如此之快。在同一过程中,您在应用程序中定义的任何事件侦听器都将附加到已经呈现的标记上。

所有这些事情的发生都非常快。这样您就可以受益于搜索引擎将抓取的服务器端渲染页面(可以使用Varnish或类似方法缓存在服务器上),用户无需等待任何时间即可看到初始渲染,并且页面基本上适用于已禁用JavaScript的用户



 类似资料:
  • info 如果您能了解下面这些技术,能加快您对本文的了解 vuex - Vue.js 应用程序开发的状态管理模式 Vue.js SSR - Vue.js 服务器端渲染 webpack - 编译构建工具 Lavas 服务器端渲染模板参考了 vue-hackernews 的渲染和开发机制,并且结合了 Lavas 的 App Shell 模板,导出的工程中会有 App Shell 等 如果您不了解 vu

  • React 提供了两个方法 renderToString 和 renderToStaticMarkup 用来将组件(Virtual DOM)输出成 HTML 字符串,这是 React 服务器端渲染的基础,它移除了服务器端对于浏览器环境的依赖,所以让服务器端渲染变成了一件有吸引力的事情。 服务器端渲染除了要解决对浏览器环境的依赖,还要解决两个问题: 前后端可以共享代码 前后端路由可以统一处理 Rea

  • 如果你调研服务器端渲染(SSR)只是用来改善少数营销页面(例如/,/about,/contact等)的 SEO,那么你可能需要预渲染。无需使用 web 服务器实时动态编译 HTML,而是使用预渲染方式,在构建时(build time)简单地生成针对特定路由的静态 HTML 文件。优点是设置预渲染更简单,并可以将你的前端作为一个完全静态的站点。 如果你使用 webpack,你可以使用prerende

  • 问题内容: 我刚刚开始研究ReactJS,发现它为您提供了两种渲染页面的方法:服务器端和客户端。但是,我不知道如何一起使用。是使用两种单独的方法来构建应用程序,还是可以将它们一起使用? 如果可以一起使用,该如何做- 我们是否需要在服务器端和客户端重复相同的元素?或者,我们是否可以仅在服务器上构建应用程序的静态部分,而在客户端构建动态部分,而无需与已经预先渲染的服务器端建立任何连接? 问题答案: 对

  • 我刚刚开始研究ReactJS,发现它提供了两种呈现页面的方法:服务器端和客户端。但是,我不明白如何一起使用它。构建应用程序有两种不同的方法,还是可以一起使用? 如果我们可以一起使用它,如何做到这一点——我们需要在服务器端和客户端复制相同的元素吗?或者,我们可以只在服务器上构建应用程序的静态部分,在客户端构建动态部分,而不与已经预渲染的服务器端建立任何连接吗?

  • 服务端渲染一个很常见的场景是当用户(或搜索引擎爬虫)第一次请求页面时,用它来做初始渲染。当服务器接收到请求后,它把需要的组件渲染成 HTML 字符串,然后把它返回给客户端(这里统指浏览器)。之后,客户端会接手渲染控制权。 下面我们使用 React 来做示例,对于支持服务端渲染的其它 view 框架,做法也是类似的。 服务端使用 Redux 当在服务器使用 Redux 渲染时,一定要在响应中包含应用