什么是React js中的“安装”?


128

在学习ReactJS时,我多次听到“ mount”一词。与此术语相比,似乎存在生命周期方法和错误。通过安装,React到底意味着什么?

例子: componentDidMount() and componentWillMount()

Answers:


138

React的主要工作是弄清楚如何修改DOM以匹配要在屏幕上呈现的组件。

React通过“装载”(将节点添加到DOM),“卸载”(将它们从DOM中删除)和“更新”(对DOM中已经存在的节点进行更改)来做到这一点。

React节点如何表示为DOM节点以及它在DOM树中的出现位置和时间,由顶级API进行管理。为了更好地了解正在发生的事情,请看一下最简单的示例:

// JSX version: let foo = <FooComponent />;
let foo = React.createElement(FooComponent);

那是foo什么,你能用它做什么?foo目前是一个普通的JavaScript对象,大致类似于以下形式(简化):

{
  type: FooComponent,
  props: {}
}

它当前不在页面上的任何地方,即它不是DOM元素,在DOM树中不存在,并且除了是React元素节点外,在文档中也没有其他有意义的表示形式。它只是告诉React 如果呈现此React元素,则屏幕上需要显示什么。它尚未“安装”。

您可以通过调用告诉React将其“装入”到DOM容器中:

ReactDOM.render(foo, domContainer);

这告诉React现在该显示foo在页面上了。React将创建FooComponent该类的实例并调用其render方法。假设它渲染一个<div />,在这种情况下,React将为其创建一个divDOM节点,并将其插入DOM容器中。

创建实例和与React组件相对应的DOM节点并将其插入DOM的过程称为安装。

请注意,通常您只会调用ReactDOM.render()挂载根组件。您无需手动“挂载”子组件。每次父组件调用setState(),并且其render方法说应首次渲染特定的子代时,React都会自动将该子代“装载”到其父代中。


9
我想指出的是,当您致电时,React.createElement(FooComponent)您并未创建的实例FooComponentfoo是虚拟DOM表示形式,FooComponent也称为React元素。但这也许就是您所说的FooComponentReact type的意思。无论如何,你不做出反应贴装元件,你叫渲染这反过来可能会安装该组件,如果要创建一个实际的DOM节点需要代表DOM树的组件。实际安装是第一次发生这种情况。
约翰·莱德格伦

5
挂载是指将React组件实例附加到DOM节点,这对于在后续渲染调用中进行树差异/增量渲染更新是必需的。
约翰·莱德格伦

3
我可以自由地编辑此答案,因为它已经被接受,但是其中存在很多误解(例如,您不能findDOMNode在React元素上运行)。
Dan Abramov

1
@Rahamin卸载是在组件被删除/替换时发生的,如果您在场景之间进行导航以致无法渲染,则无法保证会获得卸载信号。componentWillUnmount与页面卸载不同。
John Leidegren '18

1
@Yossi 是在测试套件中显式安装和卸载组件的示例:stackoverflow.com/a/55359234/6225838
CPHPython

38

React是一个同构/通用框架。这意味着存在UI组件树的虚拟表示,并且与它在浏览器中输出的实际呈现是分开的。从文档中:

React是如此之快,因为它从不直接与DOM对话。React维护了DOM的快速内存表示。

但是,该内存中表示并不直接与浏览器中的DOM绑定(即使它被称为虚拟DOM,对于通用应用程序框架来说这是一个不幸的名称也令人困惑),它只是一个类似于DOM的数据,表示所有UI组件层次结构和其他元数据的结构。虚拟DOM只是实现细节。

“我们认为React的真正基础只是组件和元素的概念:能够以声明性的方式描述您要渲染的内容。这些是所有这些不同程序包共享的部分。React的特定于某些渲染的部分目标通常不是我们想到React时想到的。” -React js博客

因此,结论是React是Rendering Agnostic的,这意味着它不在乎最终输出是什么。它可以是浏览器中的DOM树,也可以是XML,本机组件或JSON。

“当我们查看像React-native,React-Art,React-Canvas和React-Three这样的包时,很明显,React的本质和本质与浏览器或DOM无关。” -React js博客

现在,您知道React的工作原理,很容易回答您的问题:)

挂载是将组件的虚拟表示输出到最终UI表示(例如DOM或本机组件)的过程。

在浏览器中,这意味着将React元素输出到DOM树中的实际DOM元素(例如HTML divli元素)中。在本机应用程序中,这意味着将React元素输出到本机组件中。如果您有胆量,也可以编写自己的渲染器,并将React组件输出到JSON或XML甚至XAML中。

因此,安装/卸载处理程序对于React应用程序至关重要,因为您只能确保在安装时输出/渲染组件。但是,componentDidMount仅当渲染为实际的UI表示(DOM或本机组件)时,才调用该处理程序,而如果使用渲染为服务器上的HTML字符串,则不会调用该处理程序renderToString,这是有道理的,因为该组件在到达浏览器并在其中执行。

而且,是的,如果您问我,Mounting也是一个不幸的名字。恕我直言componentDidRendercomponentWillRender将是更好的名字。


6
有人刚刚从另一个论坛向我指出了这个答案。我不认为这componentDidRender是可替代的,componentDidMount因为在一次安装道具后更改组件时,该组件可以渲染多次。
Gaurav

@TheMinister它之所以被称为“虚拟DOM”库,是因为它最初不是同构的,而是从一开始就与DOM绑定在一起。使它同构是事后的想法。
伊西亚·梅多斯

那么,mountrender可以互换吗?在这种情况下,是这样一个组件被安装/呈现以下每个hypotheticals ?:的(id === that.id) ? <Component /> : null| /app/items/:id| this.setState(...)
科迪

1
链接到/ react-js-the-king-of-universal-apps /的链接已损坏
Michael Freidgeim,

我对帖子进行了两次编辑,以删除断开的链接/react-js-the-king-of-universal-apps/编辑注释中明确提到这是断开的链接),但是同行两次都拒绝了该编辑。有人可以指导我编辑答案和删除断开的链接有什么问题吗?
Aaditya Sharma,

12

挂载是指React中的组件(创建的DOM节点)被附加到文档的某个部分。而已!

忽略React,您可以将这两个本机功能视为安装:

replaceChild

appendChild

这可能是React在内部使用的最常用功能。

考虑到:

componentWillMount ===挂载前

和:

挂载后componentDidMount ===


如果安装类似于appendChild,那是render什么?
Deke '18

我想您可以说render是安装本身的实际方法。因此componentWillMount==之前,render==进行DOM插入,componentDidMount==进行了挂载(或render已调用DOM API插入组件,并且异步操作已完全完成)
Rob,

8

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

在这里,componentDidMount是一个在渲染组件时由React自动调用的方法。

概念是您要告诉ReactJS,“请在浏览器页面上使用此东西,此注释框或旋转图像或我想要的任何东西,然后将其实际放在浏览器页面上。完成后,调用我必须履行的职责,componentDidMount这样我才能继续。”

componentWillMount相反。它将在组件渲染之前立即触发。

另请参见此处 https://facebook.github.io/react/docs/component-specs.html

最后,“ mount”一词对于react.js似乎是唯一的。我认为这不是一般的javascript概念,甚至不是一般的浏览器概念。


所以坐骑可以称为“摆放”?
登机门

我会这么说,是的。
Ross Presser

我会说报价有些误导,因为它仅在初始渲染后才调用,而不是在更新引起的重新渲染时调用。然后componentDidUpdate称为。
汉尼斯·约翰逊

为此facebook.github.io/react/docs/…+1,那里的描述确认它已经放置;)
登机

5

安装是指首次渲染React组件时的初始页面加载。从React文档中的Mounting:componentDidMount:

Invoked once, only on the client (not on the server), immediately after the initial rendering occurs. At this point in the lifecycle, the component has a DOM representation which you can access via React.findDOMNode(this).

您可以将它与componentDidUpdate函数进行对比,该函数在每次React渲染时都会调用(初始安装除外)。


3

React js的主要目标是创建可重用的组件。在此,组件是网页的各个部分。例如,在网页中,标头是一个组件,页脚是一个组件,敬酒通知是一个组件,等等。术语“ mount”告诉我们这些组件是在DOM中加载或呈现的。这些是处理这些问题的许多顶级API和方法。

为简单起见,已安装意味着将组件已加载到DOM,而已卸载意味着将组件从DOM中删除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.