第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
慕課專欄

目錄

索引目錄

剖析 React 內(nèi)部運(yùn)行機(jī)制

原價(jià) ¥ 58.00

立即訂閱
03 你對(duì) ReactDOM.render( ... ) 操作了解多少
更新時(shí)間:2020-08-11 15:06:23
低頭要有勇氣,抬頭要有底氣。——韓寒

前言

ReactDOM.render函數(shù)是整個(gè) React 應(yīng)用程序首次渲染的入口函數(shù),你對(duì)它了解多少呢?本節(jié)主要介紹 ReactDOM 對(duì)象有哪些屬性與方法,ReactDOM.render函數(shù)在的三個(gè)重要參數(shù)分別是什么,以及函數(shù)返回值是什么。

ReactDOM 對(duì)象

ReactDOM 對(duì)象的定義,見代碼示例 1.2.1。

注:本專欄引用的 React 源碼版本為 v16.9。

// 源碼位置:packages/react-dom/src/client/ReactDOM.js
const ReactDOM = {
  findDOMNode: function(...) { ... },
  hydrate: function(...) { ... },
  render: function (element, container, callback) {
    // 會(huì)先檢驗(yàn)container是否有效,無(wú)效則停止執(zhí)行且拋出錯(cuò)誤
    // ...
    return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);
  },
  unstable_renderSubtreeIntoContainer: function(...) {},
  unmountComponentAtNode: function(...) {}
  // ...
}
代碼示例 1.2.1 ReactDOM 對(duì)象的定義

ReactDOM 對(duì)象上面有findDOMNode、hydraterender等多個(gè)函數(shù)。其中ReactDOM.render函數(shù)有三個(gè)參數(shù)和一個(gè)返回值。下面內(nèi)容將會(huì)對(duì)這三個(gè)參數(shù)和返回值進(jìn)行詳細(xì)說明。

理解 ReactDOM.render 函數(shù)的三個(gè)參數(shù)

ReactDOM.render( ... )的基本用法見代碼示例 1.2.2。

import React from 'react';
import ReactDOM from 'react-dom';
import UpdateCounter from './pages/UpdateCounter';

ReactDOM.render(<UpdateCounter name="Taylor" />, document.getElementById('root'));
代碼示例 1.2.2 ReactDOM.render 函數(shù)的使用

在代碼示例 1.2.1 中,傳入ReactDOM.render函數(shù)的兩個(gè)參數(shù)分別是<UpdateCounter name="Taylor" />document.getElementById('root')。第二個(gè)參數(shù)很明顯是 DOM 元素,也就是 React 應(yīng)用程序最終渲染在頁(yè)面中的容器。那么,我們?cè)撊绾卫斫獾谝粋€(gè)參數(shù)呢?

UpdateCounter是由 class 聲明的一個(gè)「類」,它在 React 中被稱為組件( component )。React 提供了 JSX 語(yǔ)法,基于 JSX 語(yǔ)法在函數(shù)或者「類」的兩側(cè)分別加上</>就變成了元素( element )。因此,<UpdateCounter name="Taylor" />就是一個(gè) React 元素。在第二章中會(huì)詳細(xì)介紹 React 組件和 React 元素。

第三個(gè)參數(shù)是應(yīng)用程序渲染完成后的回調(diào)函數(shù),這個(gè)參數(shù)是可選項(xiàng),React 會(huì)在應(yīng)用程序渲染完成后檢查是否有回調(diào)函數(shù),如果有則調(diào)用該回調(diào)函數(shù)。

ReactDOM.render函數(shù)除了執(zhí)行渲染任務(wù)外還有自己的返回值即legacyRenderSubtreeIntoContainer函數(shù)的執(zhí)行結(jié)果。那么,legacyRenderSubtreeIntoContainer函數(shù)的執(zhí)行結(jié)果是什么呢?

ReactDOM.render 函數(shù)的返回值

在 React 源碼中,legacyRenderSubtreeIntoContainer函數(shù)內(nèi)部通過return的形式又嵌套了多層函數(shù)。為了方便看到ReactDOM.render函數(shù)最終的返回值,使用console.log(...)將函數(shù)執(zhí)行結(jié)果輸出,見代碼示例 1.2.3。

console.log('返回值', 
  ReactDOM.render(
  	<UpdateCounter name="Taylor" />, document.getElementById('root'), () => {console.log('渲染完成')}
	)
);

// 輸出結(jié)果
UpdateCounter: {
  context: {},
  handleClick: ? (),
  props: {name: "Taylor"},
  refs: {},
  state: {count: 0, text: "點(diǎn)擊計(jì)數(shù)"},
  // 更新觸發(fā)器
  updater: {isMounted: ?, enqueueSetState: ?, enqueueReplaceState: ?, enqueueForceUpdate: ?},
  // 存儲(chǔ)了首次渲染完成后對(duì)應(yīng)的Fiber結(jié)點(diǎn)信息
  _reactInternalFiber: FiberNode {tag: 1, key: null, stateNode: UpdateCounter, elementType:},
  _reactInternalInstance: {_processChildContext: ?},
  isMounted: (...),
  replaceState: (...),
	// 繼承于React.Component
  __proto__: Component,
}
代碼示例 1.2.3 ReactDOM.render 函數(shù)執(zhí)行后的返回值

ReactDOM.render函數(shù)的返回值是當(dāng)前應(yīng)用程序根組件的實(shí)例。組件實(shí)例是 React 應(yīng)用程序運(yùn)行時(shí)在內(nèi)存中的一種臨時(shí)狀態(tài),組件實(shí)例的屬性包括了自身類定義的屬性以及繼承于React.Component的屬性。在UpdateCounter 實(shí)例中,statehandleClick為自身類的屬性,而contextpropsupdater等則繼承于React.Component。

小結(jié)

本章主要介紹了在研究 React 內(nèi)部運(yùn)行機(jī)制方面的一些思路與切入點(diǎn)以及 React 應(yīng)用程序的首次渲染入口—ReactDOM.render函數(shù)。下一章將會(huì)更加詳細(xì)的介紹 React 世界中的一些基礎(chǔ)概念,如 React 組件,組件繼承原理,React 元素設(shè)計(jì)思想,React 組件實(shí)例的作用以及組件與元素之間的關(guān)系 等。

}
立即訂閱 ¥ 58.00

你正在閱讀課程試讀內(nèi)容,訂閱后解鎖課程全部?jī)?nèi)容

千學(xué)不如一看,千看不如一練

手機(jī)
閱讀

掃一掃 手機(jī)閱讀

剖析 React 內(nèi)部運(yùn)行機(jī)制
立即訂閱 ¥ 58.00

舉報(bào)

0/150
提交
取消