Inhaltsverzeichnis
React vermeidet wiederholtes Rendern
Beispiel
PureComponent
Prinzip
Probleme
Lösung
immutable.js
Zusammenfassung
Heim Web-Frontend js-Tutorial Einführung in PureComponent in React

Einführung in PureComponent in React

Jul 09, 2018 pm 04:26 PM
react.js

Dieser Artikel stellt hauptsächlich die Einführung von PureComponent in React vor, die einen gewissen Referenzwert hat. Jetzt kann ich ihn mit allen teilen, die ihn brauchen.

React vermeidet wiederholtes Rendern

React erstellt und verwaltet eine innere Implementierung innerhalb der gerenderten Benutzeroberfläche, die von Komponenten zurückgegebene React-Elemente enthält. Diese Implementierung ermöglicht es React, unnötige Erstellung und Verknüpfung von DOM-Knoten zu vermeiden, da dies möglicherweise langsamer ist als die direkte Manipulation von JavaScript-Objekten. Es wird als „virtuelles DOM“ bezeichnet.

Wenn sich die Requisiten oder der Status einer Komponente ändern, bestimmt React, ob das tatsächliche DOM aktualisiert werden muss, indem es das neu zurückgegebene Element mit dem zuvor gerenderten Element vergleicht. Wenn sie nicht gleich sind, aktualisiert React das DOM.

In einigen Fällen kann Ihre Komponente die Geschwindigkeit verbessern, indem sie die Lebenszyklusfunktion „shouldComponentUpdate“ überschreibt, die ausgelöst wird, bevor der erneute Rendering-Prozess beginnt. Diese Funktion gibt standardmäßig true zurück, sodass React Aktualisierungen durchführen kann:

shouldComponentUpdate(nextProps, nextState) {
  return true;
}
Nach dem Login kopieren

Beispiel

Wenn Sie möchten, dass die Komponente nur dann neu gerendert wird, wenn sich der Wert von props.color oder state.count ändert , können Sie wie folgt vorgehen. Setzen Sie shouldComponentUpdate wie folgt:

class CounterButton extends React.Component {
  constructor(props) {
    super(props);
    this.state = {count: 1};
  }

  shouldComponentUpdate(nextProps, nextState) {
    if (this.props.color !== nextProps.color) {
      return true;
    }
    if (this.state.count !== nextState.count) {
      return true;
    }
    return false;
  }

  render() {
    return (
      <button
        color={this.props.color}
        onClick={() => this.setState(state => ({count: state.count + 1}))}>
        Count: {this.state.count}
      </button>
    );
  }
}
Nach dem Login kopieren

Im obigen Code prüft shouldComponentUpdate nur auf Änderungen in props.color und state.count. Wenn sich diese Werte nicht ändern, wird die Komponente nicht aktualisiert. Wenn Ihre Komponenten komplexer werden, können Sie ein ähnliches Muster verwenden, um einen „flachen Vergleich“ von Eigenschaften und Werten durchzuführen, um festzustellen, ob die Komponente aktualisiert werden muss. Dieses Muster ist so häufig, dass React ein Hilfsobjekt zur Implementierung dieser Logik bereitstellt – geerbt von React.PureComponent. Der folgende Code kann den gleichen Vorgang einfacher erreichen:

class CounterButton extends React.PureComponent {
  constructor(props) {
    super(props);
    this.state = {count: 1};
  }

  render() {
    return (
      <button
        color={this.props.color}
        onClick={() => this.setState(state => ({count: state.count + 1}))}>
        Count: {this.state.count}
      </button>
    );
  }
}
Nach dem Login kopieren

PureComponent

Prinzip

Wenn sich bei der Aktualisierung der Komponente weder die Requisiten noch der Status der Komponente ändern, die Render-Methode wird nicht ausgelöst, wodurch der Generierungs- und Vergleichsprozess von Virtual DOM entfällt, um den Zweck der Leistungsverbesserung zu erreichen. Konkret führt React automatisch einen flachen Vergleich für uns durch:

if (this._compositeType === CompositeTypes.PureClass) {
    shouldUpdate = !shallowEqual(prevProps, nextProps) || !shallowEqual(inst.state, nextState);
}
Nach dem Login kopieren

Und was macht flachEqual? Es wird verglichen, ob die Länge von Object.keys (state | props) konsistent ist, ob jeder Schlüssel beides hat und ob es sich um eine Referenz handelt, dh nur der Wert der ersten Ebene wird verglichen, was in der Tat sehr flach ist. so tiefe Verschachtelung Die Daten können nicht verglichen werden.

Probleme

In den meisten Fällen können Sie React.PureComponent verwenden, ohne Ihr eigenes ShouldComponentUpdate schreiben zu müssen, das nur einen oberflächlichen Vergleich durchführt. Da beim flachen Vergleich jedoch der Fall einer Attribut- oder Zustands--Mutation ignoriert wird, können Sie ihn derzeit nicht verwenden.

class ListOfWords extends React.PureComponent {
  render() {
    return <p>{this.props.words.join(',')}</p>;
  }
}

class WordAdder extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      words: ['marklar']
    };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    // This section is bad style and causes a bug
    const words = this.state.words;
    words.push('marklar');
    this.setState({words: words});
  }

  render() {
    return (
      <p>
        <button onClick={this.handleClick} />
        <ListOfWords words={this.state.words} />
      </p>
    );
  }
}
Nach dem Login kopieren

In ListOfWords ist this.props.words eine Referenz auf seinen in WordAdder übergebenen Status. Obwohl es in der handleClick-Methode von WordAdder geändert wurde, bleibt seine Referenz für ListOfWords unverändert, was dazu führt, dass sie nicht aktualisiert wird.

Lösung

Wie im obigen Problem zu sehen ist, kann eine Referenz verwendet werden, wenn es sich bei den Daten um unveränderliche Daten handelt. Veränderbare Daten können jedoch nicht per Referenz an PureComponent übergeben werden. Einfach ausgedrückt: Wenn wir die von PureComponent in der äußeren Ebene verwendeten Daten ändern, sollten wir ihnen ein neues Objekt oder eine neue Referenz zuweisen, um sicherzustellen, dass sie erneut gerendert werden können. HandleClick im obigen Beispiel kann beispielsweise wie folgt geändert werden, um die korrekte Darstellung zu bestätigen:

handleClick() {
  this.setState(prevState => ({
    words: prevState.words.concat(['marklar'])
  }));
}

或者

handleClick() {
  this.setState(prevState => ({
    words: [...prevState.words, 'marklar'],
  }));
};

或者针对对象结构:

function updateColorMap(oldObj) {
  return Object.assign({}, oldObj, {key: new value});
}
Nach dem Login kopieren

immutable.js

Immutable.js ist eine weitere Möglichkeit, dieses Problem zu lösen. Es stellt unveränderliche, dauerhafte Sammlungen durch gemeinsame Strukturierung bereit:

  • Unveränderlich: Einmal erstellt, kann eine Sammlung zu einem anderen Zeitpunkt nicht mehr geändert werden.

  • Persistenz: Neue Sammlungen können unter Verwendung der ursprünglichen Sammlung und einer Mutation erstellt werden. Die ursprüngliche Sammlung bleibt verfügbar, nachdem die neue Sammlung erstellt wurde.

  • Strukturfreigabe: Die neue Sammlung wird so weit wie möglich von der Struktur der ursprünglichen Sammlung erstellt, um Kopiervorgänge zu minimieren und die Leistung zu verbessern.

// 常见的js处理
const x = { foo: 'bar' };
const y = x;
y.foo = 'baz';
x === y; // true

// 使用 immutable.js

const SomeRecord = Immutable.Record({ foo: null });
const x = new SomeRecord({ foo: 'bar' });
const y = x.set('foo', 'baz');
x === y; // false
Nach dem Login kopieren

Zusammenfassung

PureComponent Was wirklich funktioniert, ist nur bei einigen reinen Anzeigekomponenten shallowEqual Sie werden im Grunde nicht bestehen können dieses Niveau. Um eine korrekte Wiedergabe während der Verwendung sicherzustellen, beachten Sie außerdem, dass props und state nicht dieselbe Referenz verwenden können.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Der Unterschied zwischen AngularJs und dem häufig verwendeten Angular-Anweisungsschreiben

Das obige ist der detaillierte Inhalt vonEinführung in PureComponent 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)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 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 rufen Sie die Methode der untergeordneten Komponente in der übergeordneten React-Komponente auf So rufen Sie die Methode der untergeordneten Komponente in der übergeordneten React-Komponente auf Dec 27, 2022 pm 07:01 PM

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? Einführung in Debugging-Methoden mit mehreren Tools Wie debugge ich den React-Quellcode? Einführung in Debugging-Methoden mit mehreren Tools Mar 31, 2023 pm 06:54 PM

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!

Detailliertes Verständnis der benutzerdefinierten Hooks von React Detailliertes Verständnis der benutzerdefinierten Hooks von React Apr 20, 2023 pm 06:22 PM

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 So legen Sie die Div-Höhe in React fest Jan 06, 2023 am 10:19 AM

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 React Vite nicht als erste Wahl zum Erstellen von Apps verwendet Warum React Vite nicht als erste Wahl zum Erstellen von Apps verwendet Feb 03, 2023 pm 06:41 PM

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!

7 großartige und praktische React-Komponentenbibliotheken (unter Druck geteilt) 7 großartige und praktische React-Komponentenbibliotheken (unter Druck geteilt) Nov 04, 2022 pm 08:00 PM

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!

10 praktische Tipps zum Schreiben sauberer React-Code 10 praktische Tipps zum Schreiben sauberer React-Code Jan 03, 2023 pm 08:18 PM

In diesem Artikel finden Sie 10 praktische Tipps zum Schreiben von einfacherem React-Code. Ich hoffe, er wird Ihnen hilfreich sein!

[Übersetzung] Refactoring von React-Komponenten mithilfe benutzerdefinierter Hooks [Übersetzung] Refactoring von React-Komponenten mithilfe benutzerdefinierter Hooks Jan 17, 2023 pm 08:13 PM

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.

See all articles