我对反应有点陌生。我看到我们必须导入两个东西才能开始,React和ReactDOM,有人能解释一下区别吗?我正在阅读React文档,但它没有说。
当前回答
在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);
React包包含:React。createElement,反应。createClass,反应。组件,反应。proptype,反应。孩子们
React-dom包包含:渲染,ReactDOM。unmountComponentAtNode ReactDOM。findDOMNode和react-dom/server,包括:ReactDOMServer。renderToString和ReactDOMServer.renderToStaticMarkup。
其他回答
看起来他们已经将React分为React和React -dom包,所以你不必在非dom特定的情况下使用dom相关的部分,比如这里的https://github.com/Flipboard/react-canvas 他们从哪里进口
var React = require('react');
var ReactCanvas = require('react-canvas');
如你所见。没有react-dom。
React: React是一个javascript库,旨在构建更好的用户界面。
React-DOM: React-DOM是React的一个免费库,它将React粘合到浏览器DOM上
我们正在使用React,每当我们使用render()或findDOMNode()等方法时,我们都在使用React- dom。
当我们看到React -native、React -art、React -canvas和React -three这样的包时,很明显,React的美丽和本质与浏览器或DOM无关。 为了更清楚地说明这一点,也为了更容易地构建更多React可以渲染的环境,他们将主要的React包分为两个:React和React -dom。
在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);
React包包含:React。createElement,反应。createClass,反应。组件,反应。proptype,反应。孩子们
React-dom包包含:渲染,ReactDOM。unmountComponentAtNode ReactDOM。findDOMNode和react-dom/server,包括:ReactDOMServer。renderToString和ReactDOMServer.renderToStaticMarkup。
react包保存了组件、状态、道具和所有react代码的react源。
React - DOM包顾名思义是React和DOM之间的粘合剂。通常,您只会将它用于一件事:使用ReactDOM.render()将应用程序挂载到index.html文件。
react包需要创建和使用组件和钩子,react- DOM包含react- DOM /客户端和react- DOM /服务器来在浏览器的DOM或服务器上的字符串(或流)中呈现你的应用程序。使用React -native,您可以使用React为Android和iOS创建原生应用程序。
这个问题在七年前就被提出了,自那以后发生了很多变化。 大部分答案不再正确或包含过时的信息。 我会尽量用最新的信息给你一个完整而简单的答案。
反应18
React 18已于2022年3月发布。它在其公共api中带来了一些有趣的变化。
包
反应
如React文档中所述:
React是React库的入口点。如果你从<script>标签加载React,这些顶级api在React全局中可用。
事实上,它公开了大多数常用的React特性来创建和使用组件。其中一些是:
React.Component and React.PureComponent, used to create class components and function components React.createElement(), used convert your JSX code from <Page title="Home page" />to React.createElement(Page, { title: "Home page" }, null) React.Fragment, to return multiple elements without creating additional DOM elements (starting with React 16.2 you can also use <></> to create a fragment. hooks, to let you use state and other React features without writing a class Refs, Suspence and Transitions
React对象公开的API的完整列表
React -dom, React -native和下面列出的其他都是React渲染器。它们管理React树如何转换为底层平台调用。
react-dom
React -dom包提供了特定于dom的方法,可以在应用程序的顶层使用,如果需要,也可以作为逃离React模型的出口。
这个包本质上是一个容器,用于从单个包中公开客户端和服务器子包。实际上,它只暴露了两个函数:
createPortal(),用于创建门户并在父组件的DOM层次结构之外呈现子门户 flushSync()是您可能从未听说过的东西,这是有原因的。因为它会严重影响性能。
从React 18开始,这些函数被标记为遗留函数,所以它们将在未来的版本中被弃用:
呈现() 水合物() findDOMNode () unmountComponentAtNode ()
如果你在想“天哪,他们已经弃用了ReactDOM。render´方法from React”,不要担心,阅读下面的内容。
弃用背后的原因是:
重新设计我们在客户端和服务器上呈现的api的机会。这些变化允许用户在升级到React 18的新api时,继续在React 17模式下使用旧的api。
请记住,如果你继续使用这些遗留api, React 18的新功能将被禁用。
react-dom包公开的API的完整列表
react-dom /客户端
react-dom/client包提供了客户端特定的方法,用于在客户端初始化应用程序。您的大多数组件都不需要使用这个模块。
React DOM Client模块只公开了两个方法:
createRoot()是一个新方法来创建一个根你的应用程序将。这是ReactDOM的替代品。渲染-请看下面的例子 hydrateRoot()是ReactDOM的替代品。水合物,需要水合物服务器渲染的应用程序
现在渲染你的应用程序的惯用方法是使用createRoot和渲染链接在一起:
import React from 'react';
import * as ReactDOM from 'react-dom/client';
ReactDOM
.createRoot(document.getElementById('root'))
.render(<h1>Hello, world!</h1>);
或者使用一个常量,如果你不喜欢链接,这只是一个风格的问题:
import React from 'react';
import * as ReactDOM from 'react-dom/client';
const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(<h1>Hello, world!</h1>);
react-dom/client包所公开的API的完整列表
react-dom /服务器
ReactDOMServer对象使您能够将组件呈现为静态标记。通常,它在Node服务器上使用
使用ReactDOMServer你可以在服务器端渲染React组件。它提供了广泛的方法来实现这一点-每个环境都有专门的功能:
renderToPipeableStream(),使用Node.js流 renderToNodeStream()(已弃用),使用Node.js流 renderToStaticNodeStream(),使用Node.js流 renderToReadableStream(),使用Web流可用的浏览器,Deno,…
此外,还有一些渲染可以在不支持流的环境中使用:
React 18不推荐使用renderToString() renderToStaticMarkup ()
你可以使用他们,但他们有有限的悬念支持。
这是一个最小的工作示例,尝试自己的ReactDOMServer:
import React from 'react';
import * as ReactDOMServer from 'react-dom/server';
const html = ReactDOMServer.renderToString(<h1>Hello, world!</h1>);
react-dom/server包公开的API的完整列表
react-native
使用React Native, React原语呈现到本机平台UI,这意味着你的应用程序使用与其他应用程序相同的本机平台api。
React Native本身已经有了一个巨大的生态系统,它不仅仅局限于渲染组件。
现在不再建议您自己安装react-native模块。相反,您可以使用expoi -cli来利用它的自动化来开发应用程序。
其他React渲染器
这些是目前React中最有趣的渲染器
react-canvas
React-canvas项目已死,但类似的功能可以在 react-konva。使用它,你可以在HTML画布中渲染React组件。
react-three
react- 3已经被react- 3 -fiber取代。它允许你从React中声明式地构建你的three.js场景。
ink
ink是一个用于cli的React渲染器。使用它,您可以使用组件构建CLI输出。
react-figma
React - Figma是一个针对Figma的React渲染器。你可以使用React组件作为你的设计来源。
react-pdf
React - PDF是一个React渲染器,用于在浏览器和服务器上创建PDF文件。
FAQ
原型去哪了?
随着react 15.5的发布,prop-types库 移到React之外的一个专用包中。
推荐文章
- npm犯错!代码UNABLE_TO_GET_ISSUER_CERT_LOCALLY
- 反应-显示加载屏幕,而DOM是渲染?
- 如何解决“不能在模块外使用导入语句”在开玩笑
- 是否有可能在react渲染函数中返回空?
- 使用Redux而不是Flux的缺点是什么
- 反应:为什么当道具改变时子组件不更新
- React vs ReactDOM?
- Axios -删除请求与请求体和头?
- “react-scripts”不被视为内部或外部命令
- 如何从状态数组中删除一个项目?
- 是否可以用if…else…语句在React渲染函数?
- 如何设置默认的复选框ReactJS?
- 反应。类型无效——期望为字符串
- 如何动态地将一个类添加到手动类名?
- 无效的钩子调用。钩子只能在函数组件的内部调用