Parsen von React-Komponenten und State|Props
Einer der Schwachpunkte beim Lesen des Quellcodes besteht darin, dass Sie in das Dilemma geraten, das Rückgrat nicht zu begradigen. Diese Artikelserie implementiert ein (x)react und begradigt gleichzeitig den Grundgerüstinhalt des React-Frameworks (JSX). /virtual DOM/components/... )
Komponenten sind Funktionen
Im vorherigen Artikel JSX und Virtual DOM wurde der Prozess des Renderns von JSX an die Schnittstelle erläutert und der entsprechende Code implementiert . Der Codeaufruf lautet wie folgt:
import React from 'react' import ReactDOM from 'react-dom' const element = ( <p> hello<span>world!</span> </p> ) ReactDOM.render( element, document.getElementById('root') )
In diesem Abschnitt werden wir den Prozess des Komponenten-Renderings an die Schnittstelle weiter untersuchen. Hier stellen wir das Konzept der Komponenten vor, 组件本质上就是一个函数
, das Folgende ist ein Standardkomponentencode:
import React from 'react' // 写法 1: class A { render() { return <p>I'm componentA</p> } } // 写法 2:无状态组件 const A = () => <p>I'm componentA</p> ReactDOM.render(<a></a>, document.body)
<a name="componentA"></a>
ist die Art und Weise, JSX zu schreiben, genau wie im vorherigen Artikel, Babel konvertiert ihn in React. createElement( ) in der Form Wie folgt:
React.createElement(A, null)
Beachten Sie, dass der Knotenname im zurückgegebenen virtuellen DOM ebenfalls zu einer Funktion geworden ist. Basierend auf diesen Hinweisen transformieren wir die vorherige <a name="componentA"></a>
-Funktion.
{ attributes: undefined, children: [], key: undefined, nodeName: ƒ A() }
An diesem Punkt haben wir die Verarbeitungslogik der Komponente abgeschlossen. render
function render(vdom, container) {
if (_.isFunction(vdom.nodeName)) { // 如果 JSX 中是自定义组件
let component, returnVdom
if (vdom.nodeName.prototype.render) {
component = new vdom.nodeName()
returnVdom = component.render()
} else {
returnVdom = vdom.nodeName() // 针对无状态组件:const A = () => <p>I'm componentsA</p>
}
render(returnVdom, container)
return
}
}
Nach dem Login kopieren
Im obigen Code sehen Sie, dass die A-Funktion von Component erbt. Lassen Sie uns diese Komponente der übergeordneten Klasse erstellen und ihr Status, Requisiten, SetState und andere Attributmethoden hinzufügen, damit Unterklassen sie erben können.
function render(vdom, container) { if (_.isFunction(vdom.nodeName)) { // 如果 JSX 中是自定义组件 let component, returnVdom if (vdom.nodeName.prototype.render) { component = new vdom.nodeName() returnVdom = component.render() } else { returnVdom = vdom.nodeName() // 针对无状态组件:const A = () => <p>I'm componentsA</p> } render(returnVdom, container) return } }
import React, { Component } from 'react' class A extends Component { render() { return <p>I'm {this.props.name}</p> } } ReactDOM.render(<a></a>, document.body)
function Component(props) { this.props = props this.state = this.state || {} }
function render(vdom, container) { if (_.isFunction(vdom.nodeName)) { let component, returnVdom if (vdom.nodeName.prototype.render) { component = new vdom.nodeName(vdom.attributes) // 将组件外的 props 传进组件内 returnVdom = component.render() } else { returnVdom = vdom.nodeName(vdom.attributes) // 处理无状态组件:const A = (props) => <p>I'm {props.name}</p> } ... } ... }
Es ist offensichtlich nicht das, was wir in setState schreiben möchten. Wir übertragen den Dom-Knoten, der sich auf die _render-Funktion bezieht:
function Component(props) { this.props = props this.state = this.state || {} } Component.prototype.setState = function() { this.state = Object.assign({}, this.state, updateObj) // 这里简单实现,后续篇章会深入探究 const returnVdom = this.render() // 重新渲染 document.getElementById('root').innerHTML = null render(returnVdom, document.getElementById('root')) }
Rekonstruieren Sie natürlich die damit verbundene Render-Funktion : document.getElementById('root')
Component.prototype.setState = function(updateObj) { this.state = Object.assign({}, this.state, updateObj) _render(this) // 重新渲染 }
function render(vdom, container) { let component if (_.isFunction(vdom.nodeName)) { if (vdom.nodeName.prototype.render) { component = new vdom.nodeName(vdom.attributes) } else { component = vdom.nodeName(vdom.attributes) // 处理无状态组件:const A = (props) => <p>I'm {props.name}</p> } } component ? _render(component, container) : _render(vdom, container) }
function _render(component, container) { const vdom = component.render ? component.render() : component if (_.isString(vdom) || _.isNumber(vdom)) { container.innerText = container.innerText + vdom return } const dom = document.createElement(vdom.nodeName) for (let attr in vdom.attributes) { setAttribute(dom, attr, vdom.attributes[attr]) } vdom.children.forEach(vdomChild => render(vdomChild, dom)) if (component.container) { // 注意:调用 setState 方法时是进入这段逻辑,从而实现我们将 dom 的逻辑与 setState 函数分离的目标;知识点: new 出来的同一个实例 component.container.innerHTML = null component.container.appendChild(dom) return } component.container = container container.appendChild(dom) }
An diesem Punkt haben wir die Logik der Requisiten und Zustandsteile implementiert.
Detaillierte Erklärung von config/index.js in vue: Konfiguration
Erklärung der Angular-Vorlagensyntax
Das obige ist der detaillierte Inhalt vonParsen von React-Komponenten und State|Props. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Aufrufmethode: 1. Aufrufe in Klassenkomponenten können mithilfe von React.createRef(), der funktionalen Deklaration von ref oder props des benutzerdefinierten onRef-Attributs implementiert werden. 2. Aufrufe in Funktionskomponenten und Hook-Komponenten können mithilfe von useImperativeHandle oder forwardRef implementiert werden, um a auszulösen Die untergeordnete Komponentenreferenz ist implementiert.

Wie debugge ich den React-Quellcode? Der folgende Artikel befasst sich mit dem Debuggen des React-Quellcodes unter verschiedenen Tools und stellt vor, wie der echte Quellcode von React in Mitwirkenden-, Create-React-App- und Vite-Projekten debuggt wird. Ich hoffe, dass er für alle hilfreich ist!

Benutzerdefinierte React-Hooks sind eine Möglichkeit, Komponentenlogik in wiederverwendbaren Funktionen zu kapseln. Sie bieten eine Möglichkeit, Zustandslogik wiederzuverwenden, ohne Klassen zu schreiben. In diesem Artikel wird ausführlich beschrieben, wie Kapselungs-Hooks angepasst werden.

So legen Sie die Div-Höhe in React fest: 1. Implementieren Sie die Div-Höhe über CSS. 2. Deklarieren Sie ein Objekt C im Status und speichern Sie den Stil der Änderungsschaltfläche im Objekt. Rufen Sie dann A ab und setzen Sie „marginTop“ in C zurück . Das ist Can.

Warum nutzt React Vite nicht als erste Wahl für die Erstellung von Anwendungen? Im folgenden Artikel erfahren Sie, warum React Vite nicht als Standardempfehlung empfiehlt. Ich hoffe, er ist für alle hilfreich!

In diesem Artikel stellen wir Ihnen 7 großartige und praktische React-Komponentenbibliotheken vor, die häufig in der täglichen Entwicklung verwendet werden. Sammeln Sie sie und probieren Sie sie aus!
![[Übersetzung] Refactoring von React-Komponenten mithilfe benutzerdefinierter Hooks](https://img.php.cn/upload/article/000/000/024/63c690a1b11d0794.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
Ich höre oft Leute über React-Funktionskomponenten sprechen und erwähnen, dass Funktionskomponenten zwangsläufig größer und logisch komplexer werden. Schließlich haben wir die Komponente in „einer Funktion“ geschrieben, sodass Sie akzeptieren müssen, dass die Komponente erweitert wird und die Funktion weiterhin erweitert wird.

Bei der Entwicklung von Frontend-Projekten ist die Zustandsverwaltung immer ein unvermeidbares Thema. Die Vue- und React-Frameworks selbst bieten einige Möglichkeiten, dieses Problem zu lösen. Bei der Entwicklung umfangreicher Anwendungen gibt es jedoch häufig andere Überlegungen, wie z. B. die Notwendigkeit standardisierterer und vollständigerer Betriebsprotokolle, in Entwicklertools integrierte Zeitreisefunktionen, serverseitiges Rendering usw. In diesem Artikel wird das Vue-Framework als Beispiel verwendet, um die Unterschiede im Design und der Implementierung der beiden Statusverwaltungstools Vuex und Pinia vorzustellen.
