Answers:
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将为其创建一个div
DOM节点,并将其插入DOM容器中。
创建实例和与React组件相对应的DOM节点并将其插入DOM的过程称为安装。
请注意,通常您只会调用ReactDOM.render()
挂载根组件。您无需手动“挂载”子组件。每次父组件调用setState()
,并且其render
方法说应首次渲染特定的子代时,React都会自动将该子代“装载”到其父代中。
findDOMNode
在React元素上运行)。
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 div或li元素)中。在本机应用程序中,这意味着将React元素输出到本机组件中。如果您有胆量,也可以编写自己的渲染器,并将React组件输出到JSON或XML甚至XAML中。
因此,安装/卸载处理程序对于React应用程序至关重要,因为您只能确保在安装时输出/渲染组件。但是,componentDidMount
仅当渲染为实际的UI表示(DOM或本机组件)时,才调用该处理程序,而如果使用渲染为服务器上的HTML字符串,则不会调用该处理程序renderToString
,这是有道理的,因为该组件在到达浏览器并在其中执行。
而且,是的,如果您问我,Mounting也是一个不幸的名字。恕我直言componentDidRender
,componentWillRender
将是更好的名字。
componentDidRender
是可替代的,componentDidMount
因为在一次安装道具后更改组件时,该组件可以渲染多次。
(id === that.id) ? <Component /> : null
| /app/items/:id
| this.setState(...)
。
/react-js-the-king-of-universal-apps/
(编辑注释中明确提到这是断开的链接),但是同行两次都拒绝了该编辑。有人可以指导我编辑答案和删除断开的链接有什么问题吗?
挂载是指React中的组件(创建的DOM节点)被附加到文档的某个部分。而已!
忽略React,您可以将这两个本机功能视为安装:
这可能是React在内部使用的最常用功能。
考虑到:
componentWillMount ===挂载前
和:
挂载后componentDidMount ===
appendChild
,那是render
什么?
render
是安装本身的实际方法。因此componentWillMount
==之前,render
==进行DOM插入,componentDidMount
==进行了挂载(或render
已调用DOM API插入组件,并且异步操作已完全完成)
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概念,甚至不是一般的浏览器概念。
componentDidUpdate
称为。
安装是指首次渲染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渲染时都会调用(初始安装除外)。
React js的主要目标是创建可重用的组件。在此,组件是网页的各个部分。例如,在网页中,标头是一个组件,页脚是一个组件,敬酒通知是一个组件,等等。术语“ mount”告诉我们这些组件是在DOM中加载或呈现的。这些是处理这些问题的许多顶级API和方法。
为简单起见,已安装意味着将组件已加载到DOM,而已卸载意味着将组件从DOM中删除。
React.createElement(FooComponent)
您并未创建的实例FooComponent
。foo
是虚拟DOM表示形式,FooComponent
也称为React元素。但这也许就是您所说的FooComponent
React type的意思。无论如何,你不做出反应贴装元件,你叫渲染这反过来可能会安装该组件,如果要创建一个实际的DOM节点需要代表DOM树的组件。实际安装是第一次发生这种情况。