Cet article vous apporte une analyse détaillée de ReactDom.render. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.
Étapes
1. Créer ReactRoot
2. Créer FiberRoot et FiberRoot
3. >
Méthode de rendu :La méthode de rendu peut transmettre trois paramètres, notamment ReactElement, le nœud d'encapsulation DOM et une méthode de rappel exécutée après le rendu.
render( element: React$Element<any>, container: DOMContainer, callback: ?Function, ) { invariant( isValidContainer(container), 'Target container is not a DOM element.', ); return legacyRenderSubtreeIntoContainer( null, element, container, false, callback, ); },
Vérifiez que le conteneur est un nœud Dom valide.
Renvoie enfin le résultat après l'exécution de la méthode invariant
Jetons un coup d'œil aux paramètres de cette méthode legacyRenderSubtreeIntoContainer
function legacyRenderSubtreeIntoContainer( parentComponent: ?React$Component<any, any>, children: ReactNodeList, container: DOMContainer, forceHydrate: boolean, callback: ?Function, )
let root: Root = (container._reactRootContainer: any); if (!root) { // Initial mount root = container._reactRootContainer = legacyCreateRootFromDOMContainer( container, forceHydrate, );
forceHydrate crée un ReactRoot. ForceHydrate passe false dans la méthode render et true dans la méthode Hydrate, principalement pour distinguer le rendu côté serveur et le rendu côté client. Lorsqu'il est vrai, le nœud d'origine n'est pas réutilisé et convient au rendu côté serveurDans cet appel de méthode
Si c'est le cas. est faux Ensuite, exécutezlegacyCreateRootFromDOMContainer
pour supprimer tous les nœuds enfants.
retourne ensuite viacontainer.removeChild(rootSibling)
:new ReactRoot(container, isConcurrent, shouldHydrate)
function ReactRoot( container: DOMContainer, isConcurrent: boolean, hydrate: boolean, ) { const root = createContainer(container, isConcurrent, hydrate); this._internalRoot = root; }
: createContainer
react-reconciler/inline.dom
export function createContainer( containerInfo: Container, isConcurrent: boolean, hydrate: boolean, ): OpaqueRoot { return createFiberRoot(containerInfo, isConcurrent, hydrate); }
Après avoir créé la racine, effectuez la mise à jour createFiberRoot
et transmettez la racine. Mise à jour de la méthode de rendu : unbatchedUpdates
unbatchedUpdates(() => { if (parentComponent != null) { root.legacy_renderSubtreeIntoContainer( parentComponent, children, callback, ); } else { root.render(children, callback); } });
et updateContainer(children, root, null, work._onCommit);
, et renvoie expireTime, qui exécute l'algorithme de planification et le jugement de priorité enqueueUpdate
scheduleWork
[ Recommandations associées :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!