React vs ReactDOM?

Noi*_*art 180 reactjs react-dom

我有点新的反应.我看到我们必须导入两件事才能开始,React并且ReactDOM,任何人都可以解释它们之间的区别.我正在阅读React文档,但它没有说.

Dav*_*lsh 236

React和ReactDOM最近才分成两个不同的库.在v0.14之前,所有ReactDOM功能都是React的一部分.这可能会引起混淆,因为任何稍微过时的文档都不会提及React/ReactDOM的区别.

顾名思义,ReactDOM是React和DOM之间的粘合剂.通常,您只会将它用于一件事:安装ReactDOM.render().ReactDOM的另一个有用功能是ReactDOM.findDOMNode()可以用来直接访问DOM元素.(你应该在React应用程序中谨慎使用的东西,但它可能是必要的.)如果你的应用程序是"同构的",你也可以ReactDOM.renderToString()在你的后端代码中使用.

对于其他一切,都有React.您可以使用React来定义和创建元素,生命周期钩子等,即React应用程序的内核.

React和ReactDOM分成两个库的原因是由于React Native的到来.React包含Web和移动应用程序中使用的功能.ReactDOM功能仅在Web应用程序中使用.[ 更新:经过进一步研究,很明显我对React Native的无知表现出来了.让网络和移动通用的React包更像是一种渴望,而不是现实.React Native目前是一个完全不同的包.]

请参阅宣布v0.14版本的博客文章:https://facebook.github.io/react/blog/2015/10/07/react-v0.14.html

  • 关注点分离......我们喜欢看到它 (2认同)

Dan*_*nce 48

来自React v0.14 Beta发布公告.

当我们看到像包react-native,react-art,react-canvas,和react-three,它很清楚,美和本质作出反应无关,与浏览器或DOM.

为了使这一点更加清晰,并且更容易构建React可以渲染的更多环境,我们将主反应包分成两部分:react和react-dom.

从根本上说,React的概念与浏览器无关,它们恰好是渲染组件树的众多目标之一.ReactDOM包允许开发人员从React包中删除添加非必要代码并将其移动到更合适的存储库中.

所述react包中包含React.createElement,React.createClass并且React.Component,React.PropTypes,React.Children,和与元件和组件类的其它辅助函数.我们将这些视为构建组件所需的同构或通用助手.

react-dom软件包包含ReactDOM.render,ReactDOM.unmountComponentAtNodeReactDOM.findDOMNode,并且在react-dom/server我们的服务器端渲染支持中使用ReactDOMServer.renderToStringReactDOMServer.renderToStaticMarkup.

这两段解释了核心API方法v0.13最终的位置.

  • 从React v15.4.0开始,React不再有`ReactDOM` - https://facebook.github.io/react/blog/2016/11/16/react-v15.4.0.html (6认同)

lif*_*foo 11

TL;TR react包需要创建和使用组件和钩子,react-dom包含react-dom/clientreact-dom/server在浏览器的 DOM 中或服务器上的字符串(或流)中呈现您的应用程序。您可以使用react-nativeReact 为 Android 和 iOS 创建本机应用程序。

\n
\n
\n

这个问题几乎七年前就被问过,从那时起发生了很多变化。\n大多数答案不再正确或包含过时的信息。\n我将尝试为您提供一个完整但简单的答案,并提供最新的信息可用的日期信息。

\n
\n

反应18

\n

2022 年 3 月,React 18 已发布。它在其公共 API 中带来了一些有趣的变化。

\n

套餐

\n

react

\n

正如 React 文档中所述:

\n
\n

React 是 React 库的入口点。如果您从<script>标签加载 React,则这些顶级 API 在 React 全局上可用。

\n
\n

事实上,它公开了大多数常见的 React 功能来创建和使用组件。其中一些是:

\n\n

React对象公开的 API 的完整列表

\n
\n

react-domreact-native下面列出的其他是React 渲染器。他们管理 React 树如何转变为底层平台调用。

\n
\n

react-dom

\n
\n

React-dom 包提供了特定于 DOM 的方法,可以在应用程序的顶层使用这些方法,并在需要时作为脱离 React 模型的逃生舱。

\n
\n

该包本质上是一个容器,用于从单个包中公开客户端和服务器子包。事实上它只公开了两个函数:

\n
    \n
  • createPortal(),用于创建门户并在父组件的 DOM 层次结构之外渲染子组件
  • \n
  • flushSync()这是您可能从未听说过的事情,并且是有原因的。因为它会严重损害性能
  • \n
\n

从 React 18 开始,这些函数已被标记为“legacy”,因此它们将在未来的版本中被弃用:

\n
    \n
  • render()
  • \n
  • hydrate()
  • \n
  • findDOMNode()
  • \n
  • unmountComponentAtNode()
  • \n
\n
\n

如果你在想“天哪,他们已经弃用了 React 中的 \xc2\xb4ReactDOM.render\xc2\xb4 方法”,别担心,请阅读下面的内容。

\n
\n

弃用背后的原因是:

\n
\n

有机会重新设计我们公开的用于在客户端和服务器上渲染的 API。这些更改允许用户在升级到 React 18 中的新 API 的同时,继续使用 React 17 模式下的旧 API。

\n
\n

请记住,如果您继续使用这些旧版API,新的 React 18 功能将被禁用。

\n

react-dom包公开的 API 的完整列表

\n
react-dom/client
\n
\n

react-dom/client 包提供了用于在客户端上初始化应用程序的特定于客户端的方法。大多数组件不需要使用此模块。

\n
\n

React DOM Client 模块仅公开两个方法:

\n
    \n
  • createRoot()是在您的应用程序所在位置创建根目录的新方法。这是替代品ReactDOM.render- 请参阅下面的示例
  • \n
  • hydrateRoot()是 的替代品ReactDOM.hydrate,需要水合服务器渲染的应用程序
  • \n
\n

现在渲染应用程序的惯用方法createRoot是使用并render链接在一起:

\n
import React from \'react\';\nimport * as ReactDOM from \'react-dom/client\';\n\nReactDOM\n  .createRoot(document.getElementById(\'root\'))\n  .render(<h1>Hello, world!</h1>);\n
Run Code Online (Sandbox Code Playgroud)\n

或者,如果您不喜欢链接,则使用常量,这只是风格问题:

\n
import React from \'react\';\nimport * as ReactDOM from \'react-dom/client\';\n\nconst root = ReactDOM.createRoot(document.getElementById(\'root\'))\nroot.render(<h1>Hello, world!</h1>);\n
Run Code Online (Sandbox Code Playgroud)\n

react-dom/client包公开的 API 的完整列表

\n
react-dom/server
\n
\n

ReactDOMServer 对象使您能够将组件渲染为静态标记。通常,它\xe2\x80\x99s在节点服务器上使用

\n
\n

使用 ReactDOMServer 你可以在服务器端渲染 React 组件。它提供了多种方法来实现这一目标 - 每个环境都有专用的功能:

\n\n

此外,还有一些渲染可以在不支持流的环境中使用:

\n\n
\n

您可以使用它们,但它们对Suspense支持有限。

\n
\n

这是您自己尝试 ReactDOMServer 的最小工作示例:

\n
import React from \'react\';\nimport * as ReactDOMServer from \'react-dom/server\';\n\nconst html = ReactDOMServer.renderToString(<h1>Hello, world!</h1>);\n
Run Code Online (Sandbox Code Playgroud)\n

react-dom/server包公开的 API 的完整列表

\n

react-native

\n
\n

通过 React Native,React 原语呈现到本机平台 UI,这意味着您的应用程序使用与其他应用程序相同的本机平台 API。

\n
\n

React Native现在本身已经拥有一个庞大的生态系统,并且不仅仅局限于渲染组件。

\n

今天不再建议您react-native自行安装该模块。相反,您可以使用 expo -cli来利用其自动化来开发应用程序。

\n
\n

其他 React 渲染器

\n
\n

这些是当今 React 可用的一些最有趣的渲染器(还没有死)

\n
\n

反应画布

\n

react-canvas项目已经死了,但类似的功能可以在react-konva中找到。使用它你可以在 HTML 画布中渲染你的 React 组件。

\n

反应三

\n

react-three已被 取代react-three-fiber。它允许您从 React 以声明方式构建您的场景。

\n

墨水

\n

ink是 CLI 的 React 渲染器。使用它,您可以使用组件构建 CLI 输出。

\n

反应figma

\n

react-figma是 Figma 的 React 渲染器。您可以使用 React 组件作为您的设计来源。

\n

反应pdf

\n

react-pdf是一个 React 渲染器,用于在浏览器和服务器上创建 PDF 文件。

\n
\n

常问问题

\n

去哪儿了prop-types

\n

随着React 15.5的发布,该prop-types库已从 React 移出到专用包中。

\n


Ali*_*eza 6

v0.14之前,它们是ReactJs主文件的一部分,但是在某些情况下,我们可能不需要两者,它们将它们分开,并且版本从0.14开始,这样,如果我们只需要其中一个,则我们的应用程序会变小,因为仅使用其中之一:

var React = require('react'); /* importing react */
var ReactDOM = require('react-dom'); /* importing react-dom */

var MyComponent = React.createClass({
  render: function() {
    return <div>Hello World</div>;
  }
});

ReactDOM.render(<MyComponent />, node);
Run Code Online (Sandbox Code Playgroud)

React包包含:React.createElement,React.createClass,React.Component,React.PropTypes,React.Children

React-dom包包含:ReactDOM.render,ReactDOM.unmountComponentAtNode,ReactDOM.findDOMNode和react-dom / server,其中包括:ReactDOMServer.renderToString和ReactDOMServer.renderToStaticMarkup。


Ího*_* Mé 6

看起来他们已经将 React 分为reactreact-dom包,因此您不必将与 DOM 相关的部分用于您希望在非 DOM 特定情况下使用它的项目,例如https:// github.com/Flipboard/react-canvas 他们导入的地方

var React = require('react');
var ReactCanvas = require('react-canvas');
Run Code Online (Sandbox Code Playgroud)

如你看到的。没有react-dom.


Dan*_*iel 5

ReactDOM模块公开特定于DOM的方法,而React具有旨在由React在不同平台(例如React Native)上共享的核心工具.

http://facebook.github.io/react/docs/tutorial.html


Arv*_*ind 5

更简洁地说,react 用于组件,而 react-dom 用于渲染 DOM 中的组件。'react-dom' 充当组件和 DOM 之间的粘合剂。您将使用 react-dom 的 render() 方法来渲染 DOM 中的组件,这就是您开始使用它时所需要知道的全部内容。