Heim Web-Frontend js-Tutorial Eine detaillierte Einführung in kontrollierte und unkontrollierte Komponenten in React

Eine detaillierte Einführung in kontrollierte und unkontrollierte Komponenten in React

Jun 15, 2018 pm 02:47 PM
react

In diesem Artikel werden hauptsächlich die kontrollierten und unkontrollierten Komponenten der ausführlichen React-Programmierung vorgestellt. Jetzt teile ich ihn mit Ihnen und gebe ihn als Referenz.

Es gibt nicht viele Informationen über kontrollierte Komponenten und unkontrollierte Komponenten auf der offiziellen Website und inländischen Websites. Manche Leute halten es für optional und kümmern sich nicht darum. Dies zeigt nur die Leistungsfähigkeit von React, die Anforderungen von Projekten unterschiedlicher Größe zu erfüllen. Wenn Sie beispielsweise nur eine einfache Datenanzeige wie ListView durchführen und die Daten erfassen, reichen eine for-Schleife und {} aus. Es gibt jedoch eine große Anzahl von Berichten im Hintergrundsystem, und ohne dass verschiedene Formulare miteinander verknüpft sind gesteuerte Komponenten, es wird wirklich nicht funktionieren.

Kontrollierte Komponenten und unkontrollierte Komponenten sind die Einstiegspunkte für React, um Formulare zu verarbeiten. Aus der Sicht von React muss der Autor die Daten alles kontrollieren lassen oder einfach verstehen, dass die Generierung und Aktualisierung der Seite die JSX-Anweisungen getreu ausführen muss.

Formularelemente haben jedoch ihre eigenen Besonderheiten. Benutzer können die Darstellung der Benutzeroberfläche durch Tastatureingabe und Mausauswahl ändern. Die Änderung der Schnittstelle bedeutet auch, dass einige Daten geändert wurden. Die offensichtlicheren sind der Wert der Eingabe, das innereHTML des Textbereichs und das Häkchen des Radios/Kontrollkästchens. Die weniger offensichtlichen sind der ausgewählte und der selectedIndex die Option, die passiv modifiziert werden.

 <input value="{this.state.value}"/>
Nach dem Login kopieren

Wenn der input.value vom state.value der Komponente übernommen wird, wenn der Benutzer eine Eingabeänderung vornimmt und JSX dann die Ansicht erneut zeichnet, übernimmt der input.value dann den neuen Wert des Benutzers oder den des Status? neuer Wert? Wert? Basierend auf dieser Meinungsverschiedenheit lieferte React eine Kompromisslösung, die von beiden unterstützt wurde, und das heutige Thema war geboren.

React glaubt, dass value/checked nicht alleine existieren kann und zusammen mit onInput/onChange/disabed/readOnly und anderen Eigenschaften oder Ereignissen verwendet werden muss, die value/checked steuern. Zusammen bilden sie eine kontrollierte Komponente, die von JSX gesteuert wird. Wenn der Benutzer diese zusätzlichen Eigenschaften und Ereignisse nicht schreibt, fügt das Framework intern einige Ereignisse hinzu, z. B. onClick, onInput und onChange, wodurch Sie daran gehindert werden, Eingaben oder Auswahlen vorzunehmen und den Wert zu ändern. Innerhalb des Frameworks gibt es eine hartnäckige Variable, die ich persistValue nenne, die den ihr zuletzt von JSX zugewiesenen Wert beibehält und nur durch interne Ereignisse geändert werden kann.

Wir können also behaupten, dass die kontrollierte Komponente die Wertkontrolle ist, die durch Ereignisse vervollständigt werden kann.

In kontrollierten Komponenten kann persistValue jederzeit aktualisiert werden.

Sehen wir uns noch einmal die unkontrollierten Komponenten an. Da value/checked bereits belegt ist, aktiviert React einen weiteren Satz ignorierter Attribute in HTML, defaultValue/defaultChecked. Es wird allgemein angenommen, dass sie value/checked ähneln, d. h. wenn kein Wert vorhanden ist, wird der Wert von defaultValue als Wert betrachtet.

Wir haben oben gesagt, dass die Anzeige von Formularelementen durch den internen persistValue gesteuert wird, sodass defaultXXX auch persistValue synchronisiert und persistValue dann das DOM synchronisiert. Der Ausgangspunkt unkontrollierter Komponenten besteht jedoch darin, den Benutzeroperationen treu zu bleiben. Wenn der Benutzer

input.value = "xxxx"
Nach dem Login kopieren

in den Code eingibt, wird

<input defaultvalue="{this.state.value}"/>
Nach dem Login kopieren

nicht mehr wirksam und ist immer xxxx.

Wie geht das und wie erkennt man, ob die Änderung von innerhalb oder außerhalb des Frameworks kommt? Ich habe den Quellcode von React durchgesehen und es stellte sich heraus, dass es etwas namens valueTracker gibt, um Benutzereingaben zu verfolgen

var tracker = {
  getValue: function () {
   return currentValue;
  },
  setValue: function (value) {
   currentValue = &#39;&#39; + value;
  },
  stopTracking: function () {
   detachTracker(node);
   delete node[valueField];
  }
 };
 return tracker;
}
Nach dem Login kopieren

Dieses Ding wird über Object.defineProperty in den Wert des Elements eingegeben/überprüft, damit es Bescheid weiß Der Benutzer weist ihm einen Wert zu.

Aber value/checked sind immer noch zwei Kernattribute, die zu viele interne Mechanismen beinhalten (wie value und oninput, onchange, Eingabemethodenereignisse oncompositionstart,

compositionchange, oncompositionend, onpaste, oncut), Um den Wert/die Prüfung reibungslos zu ändern, verwendet

auch Object.getOwnPropertyDescriptor. Wenn ich mit IE8 kompatibel sein möchte, gibt es kein so fortschrittliches Gadget. Ich wähle einen anderen, sichereren Ansatz und

ändere einfach defaultValue/defaultChecked mit Object.defineProperty.

Zuerst füge ich dem Element ein _uncontrolled-Attribut hinzu, um anzuzeigen, dass ich defaultXXX gekapert habe. Fügen Sie dann einen weiteren Schalter, _observing, zur Set-Methode hinzu, die das Objekt beschreibt (der dritte Parameter von Object.defineProperty). Wenn die Ansicht innerhalb des Frames aktualisiert wird, ist dieser Wert „false“. Nach der Aktualisierung wird er auf „true“ gesetzt.

Auf diese Weise wissen Sie, ob input.defaultValue = "xxx" vom Benutzer oder vom Framework geändert wurde.

if (!dom._uncontrolled) {
  dom._uncontrolled = true;
  inputMonitor.observe(dom, name); //重写defaultXXX的setter/getter
}
dom._observing = false;//此时是框架在修改视图,因此需要关闭开关
dom[name] = val;
dom._observing = true;//打开开关,来监听用户的修改行为
Nach dem Login kopieren

Die Implementierung von inputMonitor ist wie folgt

export var inputMonitor = {};
var rcheck = /checked|radio/;
var describe = {
  set: function(value) {
    var controllProp = rcheck.test(this.type) ? "checked" : "value";
    if (this.type === "textarea") {
      this.innerHTML = value;
    }
    if (!this._observing) {
      if (!this._setValue) {
        //defaultXXX只会同步一次_persistValue
        var parsedValue = (this[controllProp] = value);
        this._persistValue = Array.isArray(value) ? value : parsedValue;
        this._setValue = true;
      }
    } else {
      //如果用户私下改变defaultValue,那么_setValue会被抺掉
      this._setValue = value == null ? false : true;
    }
    this._defaultValue = value;
  },
  get: function() {
    return this._defaultValue;
  },
  configurable: true
};
 
inputMonitor.observe = function(dom, name) {
  try {
    if ("_persistValue" in dom) {
      dom._setValue = true;
    }
    Object.defineProperty(dom, name, describe);
  } catch (e) {}
};
Nach dem Login kopieren

Ich habe aus Versehen so einen hirnverbrennenden Code gepostet. Das ist eine schlechte Angewohnheit von Programmierern. An diesem Punkt versteht jedoch jeder, dass sowohl offizielle Reaktionen als auch Anu/Qreact Benutzereingaben über Object.defineProperty steuern.

Damit wir das Verhalten des folgenden Codes verstehen können

  var a = ReactDOM.render(<textarea defaultValue="foo" />, container);
  ReactDOM.render(<textarea defaultValue="bar" />, container);
  ReactDOM.render(<textarea defaultValue="noise" />, container);
  expect(a.defaultValue).toBe("noise");
  expect(a.value).toBe("foo");
  expect(a.textContent).toBe("noise");
  expect(a.innerHTML).toBe("noise");
Nach dem Login kopieren

Da der Benutzer den Standardwert nicht manuell geändert hat, war dom._setValue immer falsch/undefiniert, sodass _persistValue immer geändert werden kann.

Ein weiteres Beispiel:

var renderTextarea = function(component, container) {
  if (!container) {
    container = document.createElement("p");
  }
  const node = ReactDOM.render(component, container);
  node.defaultValue = node.innerHTML.replace(/^\n/, "");
  return node;
};
 
const container = document.createElement("p");
//注意这个方法,用户在renderTextarea中手动改变了defaultValue,_setValue就变成true
const node = renderTextarea(<textarea defaultValue="giraffe" />, container);
 
expect(node.value).toBe("giraffe");
 
// _setValue后,gorilla就不能同步到_persistValue,因此还是giraffe
renderTextarea(<textarea defaultValue="gorilla" />, container);
// expect(node.value).toEqual("giraffe");
 
node.value = "cat";
// 这个又是什么回事了呢,因此非监控属性是在diffProps中批量处理的,在监控属性,则是在更后的方法中处理
// 检测到node.value !== _persistValue,于是重写 _persistValue = node.value,于是输出cat
renderTextarea(<textarea defaultValue="monkey" />, container);
expect(node.value).toEqual("cat");
Nach dem Login kopieren

Einfache Textklasse: Text, Textbereich, JSX-Wert, immer in String konvertiert

type="number"-Steuerung, Wert Es ist immer eine Zahl . Wenn es nicht ausgefüllt ist oder „“ lautet, wird es in „0“ umgewandelt.

Radio hat einen Verknüpfungseffekt. Es kann nur eine Radiosteuerung mit demselben Namen unter demselben übergeordneten Knoten ausgewählt werden.

Der Wert/Standardwert von Select unterstützt Arrays und führt keine Konvertierung durch. Wenn der Benutzer jedoch das Optionselement unten hinzufügt oder löscht, ändert sich die Auswahl entsprechend.

Darüber hinaus kann die Auswahl in Fuzzy-Matching und Exact-Matching unterteilt werden.

//精确匹配
var dom = ReactDOM.render(
  <select value={222}>
    <option value={111}>aaa</option>
    <option value={"222"}>xxx</option>
    <option value={222}>bbb</option>
    <option value={333}>ccc</option>
  </select>,
  container
);
expect(dom.options[2].selected).toBe(true);//选中第三个
Nach dem Login kopieren
//模糊匹配
var dom = ReactDOM.render(
  <select value={222}>
    <option value={111}>aaa</option>
    <option value={"222"}>xxx</option>
    <option value={333}>ccc</option>
  </select>,
  container
);
expect(dom.options[2].selected).toBe(true);//选中第二个
Nach dem Login kopieren

凡此种种,React/anu都是做了大量工作,迷你如preact/react-lite之流则可能遇坑。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在vue.js中如何实现数据分发slot

在Vue中有关使用ajax方法有哪些?

通过vue如何引入公共css文件

Das obige ist der detaillierte Inhalt vonEine detaillierte Einführung in kontrollierte und unkontrollierte Komponenten in React. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So erstellen Sie eine Echtzeit-Chat-App mit React und WebSocket So erstellen Sie eine Echtzeit-Chat-App mit React und WebSocket Sep 26, 2023 pm 07:46 PM

So erstellen Sie eine Echtzeit-Chat-Anwendung mit React und WebSocket Einführung: Mit der rasanten Entwicklung des Internets hat die Echtzeitkommunikation immer mehr Aufmerksamkeit auf sich gezogen. Live-Chat-Apps sind aus dem modernen Sozial- und Arbeitsleben nicht mehr wegzudenken. In diesem Artikel wird erläutert, wie Sie mit React und WebSocket eine einfache Echtzeit-Chat-Anwendung erstellen, und es werden spezifische Codebeispiele bereitgestellt. 1. Technische Vorbereitung Bevor wir mit der Erstellung einer Echtzeit-Chat-Anwendung beginnen, müssen wir die folgenden Technologien und Tools vorbereiten: React: eine zum Erstellen

Leitfaden zur React-Front-End- und Back-End-Trennung: So erreichen Sie die Entkopplung und unabhängige Bereitstellung von Front-End und Back-End Leitfaden zur React-Front-End- und Back-End-Trennung: So erreichen Sie die Entkopplung und unabhängige Bereitstellung von Front-End und Back-End Sep 28, 2023 am 10:48 AM

React-Leitfaden zur Front-End- und Back-End-Trennung: So erreichen Sie die Front-End- und Back-End-Entkopplung und die unabhängige Bereitstellung. Es sind spezifische Codebeispiele erforderlich. In der heutigen Webentwicklungsumgebung ist die Front-End- und Back-End-Trennung zu einem Trend geworden. Durch die Trennung von Front-End- und Back-End-Code kann die Entwicklungsarbeit flexibler und effizienter gestaltet und die Zusammenarbeit im Team erleichtert werden. In diesem Artikel wird erläutert, wie Sie mithilfe von React eine Front-End- und Back-End-Trennung erreichen und so die Ziele der Entkopplung und unabhängigen Bereitstellung erreichen. Zuerst müssen wir verstehen, was Front-End- und Back-End-Trennung ist. Im traditionellen Webentwicklungsmodell sind Front-End und Back-End gekoppelt

So erstellen Sie einfache und benutzerfreundliche Webanwendungen mit React und Flask So erstellen Sie einfache und benutzerfreundliche Webanwendungen mit React und Flask Sep 27, 2023 am 11:09 AM

So erstellen Sie mit React und Flask einfache und benutzerfreundliche Webanwendungen. Einführung: Mit der Entwicklung des Internets werden die Anforderungen an Webanwendungen immer vielfältiger und komplexer. Um den Anforderungen der Benutzer an Benutzerfreundlichkeit und Leistung gerecht zu werden, wird es immer wichtiger, moderne Technologie-Stacks zum Aufbau von Netzwerkanwendungen zu verwenden. React und Flask sind zwei sehr beliebte Frameworks für die Front-End- und Back-End-Entwicklung, und sie arbeiten gut zusammen, um einfache und benutzerfreundliche Webanwendungen zu erstellen. In diesem Artikel erfahren Sie, wie Sie React und Flask nutzen

So erstellen Sie eine zuverlässige Messaging-App mit React und RabbitMQ So erstellen Sie eine zuverlässige Messaging-App mit React und RabbitMQ Sep 28, 2023 pm 08:24 PM

So erstellen Sie eine zuverlässige Messaging-Anwendung mit React und RabbitMQ Einführung: Moderne Anwendungen müssen zuverlässiges Messaging unterstützen, um Funktionen wie Echtzeitaktualisierungen und Datensynchronisierung zu erreichen. React ist eine beliebte JavaScript-Bibliothek zum Erstellen von Benutzeroberflächen, während RabbitMQ eine zuverlässige Messaging-Middleware ist. In diesem Artikel wird erläutert, wie Sie React und RabbitMQ kombinieren, um eine zuverlässige Messaging-Anwendung zu erstellen, und es werden spezifische Codebeispiele bereitgestellt. RabbitMQ-Übersicht:

Leitfaden für reaktionsfähiges Design: So erzielen Sie adaptive Front-End-Layouteffekte Leitfaden für reaktionsfähiges Design: So erzielen Sie adaptive Front-End-Layouteffekte Sep 26, 2023 am 11:34 AM

React Responsive Design Guide: So erzielen Sie adaptive Front-End-Layouteffekte Mit der Beliebtheit mobiler Geräte und der steigenden Nachfrage der Benutzer nach Multi-Screen-Erlebnissen ist Responsive Design zu einem der wichtigsten Aspekte in der modernen Front-End-Entwicklung geworden. React, eines der derzeit beliebtesten Frontend-Frameworks, bietet eine Fülle von Tools und Komponenten, die Entwicklern dabei helfen, adaptive Layouteffekte zu erzielen. In diesem Artikel werden einige Richtlinien und Tipps zur Implementierung von responsivem Design mit React vorgestellt und spezifische Codebeispiele als Referenz bereitgestellt. Fle mit React

Anleitung zum Debuggen von React-Code: So finden und beheben Sie Front-End-Fehler schnell Anleitung zum Debuggen von React-Code: So finden und beheben Sie Front-End-Fehler schnell Sep 26, 2023 pm 02:25 PM

React-Code-Debugging-Leitfaden: So finden und beheben Sie Front-End-Fehler schnell. Einführung: Bei der Entwicklung von React-Anwendungen stoßen Sie häufig auf eine Vielzahl von Fehlern, die zum Absturz der Anwendung oder zu fehlerhaftem Verhalten führen können. Daher ist die Beherrschung von Debugging-Fähigkeiten eine wesentliche Fähigkeit für jeden React-Entwickler. In diesem Artikel werden einige praktische Techniken zum Auffinden und Beheben von Front-End-Fehlern vorgestellt und spezifische Codebeispiele bereitgestellt, um Lesern dabei zu helfen, Fehler in React-Anwendungen schnell zu finden und zu beheben. 1. Auswahl der Debugging-Tools: In Re

React Router-Benutzerhandbuch: So implementieren Sie die Front-End-Routing-Steuerung React Router-Benutzerhandbuch: So implementieren Sie die Front-End-Routing-Steuerung Sep 29, 2023 pm 05:45 PM

ReactRouter-Benutzerhandbuch: So implementieren Sie die Front-End-Routing-Steuerung Mit der Popularität von Single-Page-Anwendungen ist das Front-End-Routing zu einem wichtigen Bestandteil geworden, der nicht ignoriert werden kann. Als beliebteste Routing-Bibliothek im React-Ökosystem bietet ReactRouter umfangreiche Funktionen und benutzerfreundliche APIs, wodurch die Implementierung des Front-End-Routings sehr einfach und flexibel ist. In diesem Artikel wird die Verwendung von ReactRouter vorgestellt und einige spezifische Codebeispiele bereitgestellt. Um ReactRouter zuerst zu installieren, benötigen wir

So erstellen Sie eine schnelle Datenanalyseanwendung mit React und Google BigQuery So erstellen Sie eine schnelle Datenanalyseanwendung mit React und Google BigQuery Sep 26, 2023 pm 06:12 PM

So verwenden Sie React und Google BigQuery zum Erstellen schneller Datenanalyseanwendungen. Einführung: Im heutigen Zeitalter der Informationsexplosion ist die Datenanalyse zu einem unverzichtbaren Bindeglied in verschiedenen Branchen geworden. Unter anderem ist die Entwicklung schneller und effizienter Datenanalyseanwendungen für viele Unternehmen und Einzelpersonen zum Ziel geworden. In diesem Artikel wird erläutert, wie Sie mit React und Google BigQuery eine schnelle Datenanalyseanwendung erstellen, und es werden detaillierte Codebeispiele bereitgestellt. 1. Übersicht React ist ein Werkzeug zum Erstellen

See all articles