ReactJS 教程

ReactJS - 主页 ReactJS - 简介 ReactJS - 路线图 ReactJS - 安装 ReactJS - 功能 ReactJS - 优势和缺点 ReactJS - 架构 ReactJS - 创建 React 应用程序 ReactJS - JSX ReactJS - 组件 ReactJS - 嵌套组件 ReactJS - 使用组件 ReactJS - 集合组件 ReactJS - 样式 ReactJS - 属性 (props) ReactJS - 使用属性创建组件 ReactJS - props 验证 ReactJS - 构造函数 ReactJS - 组件生命周期 ReactJS - 事件管理 ReactJS - 创建事件感知组件 ReactJS - Expense Manager 事件 ReactJS - 状态管理 ReactJS - 状态管理 API ReactJS - 无状态组件 ReactJS - Hooks 进行状态管理 ReactJS - Hooks 的组件生命周期 ReactJS - 布局组件 ReactJS - 分页 ReactJS - Material UI ReactJS - Http 客户端编程 ReactJS - 表单编程 ReactJS - 受控组件 ReactJS - 非受控组件 ReactJS - Formik ReactJS - 条件渲染 ReactJS - 列表 ReactJS - Key 键 ReactJS - 路由 ReactJS - Redux ReactJS - 动画 ReactJS - Bootstrap ReactJS - Map ReactJS - 表格 ReactJS - 使用 Flux 管理状态 ReactJS - 测试 ReactJS - CLI 命令 ReactJS - 构建和部署 ReactJS - 示例

Hooks

ReactJS - Hooks 简介 ReactJS - 使用 useState ReactJS - 使用 useEffect ReactJS - 使用 useContext ReactJS - 使用 useRef ReactJS - 使用 useReducer ReactJS - 使用 useCallback ReactJS - 使用 useMemo ReactJS - 自定义 Hooks

ReactJS 高级

ReactJS - 可访问性 ReactJS - 代码拆分 ReactJS - 上下文 ReactJS - 错误边界 ReactJS - 转发 Refs ReactJS - 片段 ReactJS - 高阶组件 ReactJS - 与其他库集成 ReactJS - 优化性能 ReactJS - Profiler API ReactJS - Portals ReactJS - 不使用 ES6 ECMAScript ReactJS - 不使用 JSX 的 React ReactJS - Reconciliation ReactJS - Refs 和 DOM ReactJS - 渲染道具 ReactJS - 静态类型检查 ReactJS - 严格模式 ReactJS - Web 组件

其他概念

ReactJS - 日期选择器 ReactJS - Helmet ReactJS - 内联样式 ReactJS - PropTypes ReactJS - BrowserRouter ReactJS - DOM ReactJS - 轮播 ReactJS - 图标 ReactJS - 表单组件 ReactJS - 参考 API

ReactJS 有用资源

ReactJS - 快速指南 ReactJS - 备忘录 Axios - 备忘录 ReactJS - 有用资源 ReactJS - 讨论


ReactJS - renderToString() 方法

将 React 组件渲染为 HTML 是一种常见操作,尤其是在进行服务器端渲染 (SSR) 时。使用 renderToString 方法可以实现这一点。

什么是 renderToString?

React 的 renderToString 函数将 React 组件渲染为 HTML 字符串。在服务器上,它主要用于预渲染我们的 React 应用,然后将其作为初始服务器响应的一部分提供给客户端。这意味着我们的网站将加载得更快,并且更适合搜索引擎。

语法

renderToString(reactNode)

参数

reactNode − 它是一个要渲染为 HTML 的 React 节点。例如 <App />。

返回值

它返回一个 HTML 字符串。

示例

示例 − Greetings App

在此代码中,我们将创建一个名为 Greetings 的 React 组件来显示一条简单的问候消息。它将使用服务器端渲染将组件转换为 HTML 字符串并将该字符串记录到控制台。执行后,我们将看到 Greetings 组件的初始 HTML 表示,其中包含欢迎标题和鼓励使用 React 构建的消息。

// 导入必要的模块
const React = require('react');
const ReactDOMServer = require('react-dom/server');

// 定义一个带有问候的组件
const Greetings = () => (
   <div>
      <h1>Welcome to React!</h1>
      <p>Hope you enjoy building with it.</p>
   </div>
);
export default Greetings;

// 将组件渲染为字符串
const htmlString2 = ReactDOMServer.renderToString(<Greetings />);

// 记录结果
console.log(htmlString2);

输出

welcome to react

示例 − 计数器应用

在此应用中,我们将创建一个 React 组件 (Counter),该组件表示一个带有增量按钮的简单计数器。它将使用服务器端渲染将组件转换为 HTML 字符串并将该字符串记录到控制台。执行后,我们将看到计数器组件的初始 HTML 表示,计数为 0。

// 导入必要的模块
const React = require('react');
const ReactDOMServer = require('react-dom/server');

// 定义一个带有简单计数器的组件
class Counter extends React.Component {
   constructor() {
      super();
      this.state = { count: 0 };
   }   
   render() {
      return (
         <div>
            <h1>Counter: {this.state.count}</h1>
            <button onClick={() => this.setState({ count: this.state.count + 1 })}>
               Increment
            </button>
         </div>
      );
   }
}
export default Counter;

// 将组件渲染为字符串
const htmlString3 = ReactDOMServer.renderToString(<Counter />);

// 记录结果
console.log(htmlString3);

输出

counter 3 increasing

示例 − 服务器和客户端

我们可以通过两种不同的方式使用 renderToString:第一种是在服务器上,第二种是在客户端上。因此,我们将逐一讨论这两种方式。

在服务器上

因此,首先我们将从"react-dom/server"导入 renderToString 方法。并使用它将我们的 React 应用渲染为 HTML。

import { renderToString } from 'react-dom/server';
const html = renderToString(<App />);

在客户端

我们需要一个单独的函数,如 hydrateRoot,以使服务器生成的 HTML 具有交互性。

首先,验证我们的响应是否包含服务器渲染的 HTML,以及我们是否已包含加载 React 组件和客户端 hydrateRoot 所需的脚本。

服务器端渲染(Node.js/Express)

import express from 'express';
import React from 'react';
import { renderToString } from 'react-dom/server';
import App from './App';  // 导入主 React 组件

const app = express();
app.get('/', (req, res) => {
   
   // Server-side rendering
   const html = renderToString(<App />);
   res.send(`
      <!DOCTYPE html>
      <html>
      <head>
         <title>Server-Side Rendering</title>
      </head>
      <body>
         <div id="root">${html}</div>
         <script src="/client.js"></script>
      </body>
      </html>
   `);
});

app.listen(3000, () => {
   console.log('Server is running on http://localhost:3000');
});

Client-Side (client.js)

import React from 'react';
import { hydrateRoot } from 'react-dom'; // 导入 hydrateRoot
import App from './App'; // 导入主 React 组件

// 查找根元素
const rootElement = document.getElementById('root');

// Hydrate 服务器渲染的 HTML
hydrateRoot(rootElement, <App />);

按照这种方法,我们可以实现服务器端渲染,同时使内容在客户端具有交互性,结合两种方式的优点。

限制

  • React Suspense 仅部分受 renderToString 支持。如果组件等待数据,renderToString 会立即将其回退作为 HTML 发送。

  • 虽然它可以在浏览器中使用,但不建议用于客户端应用程序。客户端渲染有更好的选择。

总结

renderToString 是一种有用的 React 方法,用于在服务器端将我们的组件更改为 HTML,从而提高网站性能和搜索引擎优化。请记住,它可能不是客户端代码的最佳选择。

reactjs_reference_api.html