Einführung in 10 Hooks in React

Einführung in 10 Hooks in React

Was sind React Hooks?

Die offizielle Website von React stellt es folgendermaßen vor: Hook ist eine neue Funktion von React 16.8. Es ermöglicht Ihnen, Status und andere React-Funktionen zu verwenden, ohne Klassen zu schreiben.

Völlig optional können Sie Hooks in einigen Komponenten ausprobieren, ohne vorhandenen Code neu zu schreiben. Sie müssen Hooks jedoch nicht sofort erlernen oder verwenden, wenn Sie nicht möchten.

100 % abwärtskompatible Hooks enthalten keine schwerwiegenden Änderungen.

Jetzt verfügbar: Hook wurde in v16.8.0 veröffentlicht.

Es gibt keine Pläne, Klassen aus React zu entfernen. Mehr über die Evolutionsstrategie für Hooks können Sie im Abschnitt unten auf dieser Seite lesen.

Hooks beeinträchtigen Ihr Verständnis von React-Konzepten nicht. Im Gegenteil, Hooks bieten eine direktere API für bekannte React-Konzepte: Props, State, Context, Refs und Lifecycle. Wie wir später sehen werden, bieten Hooks auch eine leistungsfähigere Möglichkeit, sie zu kombinieren.

Wenn Sie nicht genug über React wissen, empfehle ich Ihnen, zuerst die offizielle React-Dokumentation zu lesen, eine Demo zu schreiben und dann den Artikel zu lesen, da ich nur kurz auf einige der Grundlagen von React eingehen werde.
Offizielle React-Dokumentation https://zh-hans.reactjs.org/docs/hooks-state.html

React bietet derzeit Hooks

Haken verwenden
Verwendungsstatus Setzen und Ändern des Zustands, Ersetzen des ursprünglichen Zustands und des festgelegten Zustands
Effekt verwenden Ersetzen Sie den ursprünglichen Lebenszyklus sowie die zusammengeführte Version von componentDidMount, componentDidUpdate und componentWillUnmount.
useLayoutEffect Wie useEffect, ruft den Effekt jedoch synchron auf.
verwendenMemo Aktualisierungsbedingungen für Komponenten steuern, Methodenausführung entsprechend Statusänderungen steuern, Wertübertragung optimieren
useCallback useMemo optimiert die Wertübertragung, usecallback optimiert die Übertragungsmethode, ob aktualisiert werden soll
useRef Wie der vorherige Verweis, nur prägnanter
Kontext verwenden Kontextgroßvater und -enkel und tiefere Komponentenwertübergabe
verwendenReducer Ersetzen Sie den Reducer im ursprünglichen Redux und verwenden Sie ihn mit useContext
useDebugValue Zeigt die Bezeichnung des benutzerdefinierten Hooks zu Debugzwecken in den React-Entwicklertools an.
useImperativeHandle Ermöglicht Ihnen, den Instanzwert anzupassen, der der übergeordneten Komponente bei Verwendung von „ref“ angezeigt wird.

1.useState

importiere React von „react“;
importiere './App.css';
//Normalerweise schreibe ich eine Klasse, um den Status zu ändern class App extends React.Component {
  Konstruktor (Requisiten) {
    super(Requisiten)
    dieser.Zustand = {
      Hook: „React Hook ist wirklich nützlich“
    }
  }
  changehook = () => {
    dies.setState({
      Hook: „Ich habe den Wert des React-Hooks geändert“
    })
  }
  rendern () {
    const { hook } = dieser.Zustand
    zurückkehren(
         <header className="App-header">
          {Haken}
          <button onClick={this.changehook}>
            Haken ändern
          </button>
        </header>
      )
  }
}
{App} exportieren

//Funktionales Schreiben, Zustandsänderungsfunktion App() {
//Eine Variable namens Hook erstellt. Die Methode Sethook kann diese Variable ändern. Der Anfangswert ist „React Hook ist wirklich nützlich“.
 const [hook, sethook] = useState("React-Hook ist wirklich nützlich");
  zurückkehren ( 
    <header className="App-header">
      {hook}{/**Die Variablen und Methoden hier können auch direkt verwendet werden*/}
      <button onClick={() => sethook("Ich habe den Wert des React-Hooks geändert")}>
        Haken ändern
      </button>
    </header>
  );
}
{App} exportieren

// Pfeilfunktion schreiben, Status ändern export const App = props => {
  const [hook, sethook] = useState("React-Hook ist wirklich nützlich");
  zurückkehren (
    <header className="App-header">
      {Haken}
      <button onClick={() => sethook("Ich habe den Wert des React-Hooks geändert")}>
        Haken ändern
      </button>
    </header>
  );
};

Hinweise zur Verwendung Nachdem Sie die vergleichende Verwendung von useState in der obigen Demo gelesen haben, hat eine kleine Demo eine klarere Struktur, einen prägnanteren Code und ähnelt eher dem Schreiben von JS-Code. Ist es nicht wunderbar, es auf das Projekt anzuwenden?

2.useEffect und useLayoutEffect

useEffect ersetzt den ursprünglichen Lebenszyklus, eine zusammengeführte Version von componentDidMount, componentDidUpdate und componentWillUnmount
useEffect( ()=>{ return ()=>{ } } , [ ])

  • Der erste Parameter ist eine Funktion. Standardmäßig wird sie ausgelöst, wenn das Rendering zum ersten Mal gerendert und aktualisiert wird. Standardmäßig verfügt sie über eine Rückgabefunktion. Die Rückgabe einer Funktion bedeutet, dass etwas getan werden kann, bevor sie zerstört wird.
  • Der zweite Parameter, array[], ist leer, was bedeutet, dass er nur einmal ausgeführt wird und bei einer Aktualisierung nicht ausgelöst wird. Was sind die darin enthaltenen Parameter? UseEffect wird nur ausgeführt, wenn sich die Parameter ändern.
    • useEffect kann mehrfach verwendet und der Reihe nach ausgeführt werden
    • useLayoutEffect erzwingt eine synchrone Ausführung von useeffect und führt zuerst die Funktion innerhalb von useLayoutEffect aus.
importiere React, { useState, useEffect, useLayoutEffect } von „react“;

//Schreiben der Pfeilfunktion, Statusänderung const UseEffect = (props) => {
 //Eine Variable namens Hook erstellt. Die Methode Sethook kann diese Variable ändern. Der Anfangswert ist „React Hook ist wirklich nützlich“.
 const [ hook, sethook ] = useState('React-Hook ist wirklich nützlich');
 const [ name ] = useState('baby');
 zurückkehren (
  <header Klassenname="UseEffect-header">
   <h3>NutzenEffekt</h3>
   <Untergeordneter Hook={Hook} Name={Name} />
   {/**Die obigen Variablen und die folgenden Methoden können auch direkt verwendet werden*/}
   <button onClick={() => sethook('Ich habe den Wert des React-Hooks geändert' + new Date().getTime())}>Hook ändern</button>
  </header>
 );
};

const Child = (Eigenschaften) => {
 const [ neuer Hook, setze neuen Hook ] = useState(props.hook);
 //Dies kann das vorherige componentDidMount ersetzen. Der zweite Parameter ist ein leeres Array, das angibt, dass useEffect nur einmal ausgeführt wirduseEffect(() => {
  console.log('erste Komponente wurde eingebunden');
 }, []);

 //Der zweite Parameter, das Array, ist der Hook. Wenn sich der Hook ändert, wird useEffect ausgelöst. Wenn sich der Hook ändert, wird er zuerst zerstört und dann wird die erste Funktion ausgeführt.
 Effekt verwenden(
  () => {
   setnewhook(props.hook + '222222222');
   console.log('useEffect');
   zurückgeben () => {
    console.log('Komponente wird nicht eingebunden ');
   };
  },
  [ Requisiten.hook ]
 );

 //useLayoutEffect erzwingt eine synchrone Ausführung von useeffect und führt zuerst die Funktion useLayoutEffect innerhalb von useLayoutEffect aus.
  () => {
   console.log('useLayoutEffect');
   zurückgeben () => {
    console.log('useLayoutEffect-Komponente wird nicht eingehängt');
   };
  },
  [ Requisiten.hook ]
 );

 zurückkehren (
  <div>
   <p>{Eigenschaften.name}</p>
   {neuer Hook}
  </div>
 );
};

Standard-UseEffect exportieren;

3.useMemo und useCallback

Sie können alle verwendet werden, um das Rendering von Unterkomponenten zu optimieren oder auf Statusänderungen von Unterkomponenten zu hören, um Ereignisse zu verarbeiten. Dies war zuvor schwierig, da shouldComponentUpdate überwachen kann, ob eine Änderung vorliegt, aber keine anderen externen Methoden steuern kann und nur true und false zurückgeben kann und componentDidUpdate nur nach dem Update ausgeführt werden kann, sodass es schwierig ist, vor dem Rendering etwas zu tun.
useCallback ist noch nicht verfügbar

importiere React, { useState, useMemo } von „react“;

const Child = ({ Alter, Name, Kinder }) => {
    //Wenn useMemo nicht zur Verarbeitung verwendet wird, wird die untergeordnete Komponente einmal gerendert, solange sich der Status der übergeordneten Komponente ändert. Mit useMemo können Sie einen bestimmten Statusnamen überwachen. Wenn sich der Name ändert, führen Sie die erste Funktion in useMemo aus console.log(age, name, children, '11111111');
 Funktion Namensänderung() {
  console.log(Alter, Name, Kinder, '22222222');
  gib Name + „Ändern“ zurück;
    }
     {/** Obwohl auf der offiziellen React-Website steht, dass useCallback und useMemo ähnliche Funktionen haben, weiß ich nicht, wo das Versionsproblem liegt. Diese Methode kann noch nicht verwendet werden. const memoizedCallback = useCallback(
        () => {
            console.log('useCallback')
        },
        [Name],
      );
    Konsole.log(memoizedCallback,'memoizedCallback')
     */}
    //useMemo hat zwei Parameter, genau wie useEffect, der erste Parameter ist eine Funktion, der zweite Parameter ist ein Array, das verwendet wird, um einen Status zu überwachen, der sich nicht ändert const changedname = useMemo(() => namechange(), [ name ]);
 zurückkehren (
  <div Stil={{ Grenze: '1px durchgezogen' }}>
   <p>Kinder: {Kinder}</p>
   <p>Name: {Name}</p>
   <p>geändert: {changedname}</p>
   <p>Alter:{Alter}</p>
  </div>
 );
};

const UseMemo = () => {
    //useState legt den Namen und das Alter fest und verwendet zwei Schaltflächen, um sie zu ändern und an die untergeordnete Komponente zu übergeben. const [ name, setname ] = useState('baby张'); 
 const [ Alter, Setage ] = useState(18);
 zurückkehren (
  <div>
   <Schaltfläche
    beiKlick={() => {
     setname('Baby' + new Date().getTime()); 
    }}
   >
    Namen ändern</button>
   <Schaltfläche
    beiKlick={() => {
     setage('Alter' + neues Datum().getTime());
    }}
   >
    Alter ändern</button>
   <p>
    UseMemo {name}:{age}
   </p>
   <Alter des Kindes={Alter} Name={Name}>
    Kinder von {name}
   </Kind>
  </div>
 );
};

Standard-UseMemo exportieren;

4.useRef

ref ist ähnlich wie das vorherige, useRef erstellt – bindet – verwendet, drei Schritte, siehe Code und Hinweise im Detail

importiere React, { useState, useRef } von „react“;

const UseRef = () => {
 //Hier bindet useState einen Input und verknüpft einen Statusnamen
 const [ name, setname ] = useState('baby');
 const refvalue = useRef(null); //Erstelle zuerst ein leeres useRef
 Funktion addRef() {
  refvalue.current.value = Name; //Weisen Sie diesem Ref einen Wert zu, wenn Sie auf die Schaltfläche klicken // refvalue.current = Name //Wenn es so geschrieben ist, ist der Wert auch dann noch im erstellten Ref vorhanden und kann verwendet werden, wenn der Ref nicht an das DOM gebunden ist console.log(refvalue.current.value);
 }
 zurückkehren (
  <div>
            <Eingabe
                Standardwert={name}
    beiÄnderung={(e) => {
     setname(e.ziel.wert);
                }}
   />
   <button onClick={addRef}>Fügen Sie unten den Namen ein</button>
   <p>Geben Sie mir einen UseRef-Namen:</p>
   <input ref={refvalue} />
  </div>
 );
};

Standard-UseRef exportieren;

5.useContext

Wer schon einmal Kontext verwendet hat, wird ihn auf den ersten Blick verstehen. Die grundlegende Verwendung von useContext ähnelt der des vorherigen Kontexts. Der Code enthält ausführliche Kommentare, die erklären, wie er erstellt, Werte übergeben und verwendet wird.

importiere React, { useState, useContext, createContext } von „react“;

const ContextName = erstelleContext();
//Hier werden zur Vereinfachung des Bloggens die Komponenten Opa und Enkel in eine Datei geschrieben. Normalerweise muss der von der Komponente Opa und der Komponente Enkel erstellte Kontext einzeln eingeführt werden.

const UseContext = () => {
 //Hier erstellt useState einen Status und die Schaltfläche steuert die Änderung const [ name, setname ] = useState('baby张');
 zurückkehren (
  <div>
   <h3>UseContext Opa</h3>
   <Schaltfläche
    beiKlick={() => {
     setname('Baby' + new Date().getTime());
    }}
   >
    Namen ändern</button>
   {/**Dies ist dasselbe wie die Kontextverwendung. Der Anbieter muss den Wert an die untergeordnete Komponente übergeben. Der Wert ist nicht unbedingt ein Parameter*/}}
   <ContextName.Provider-Wert={{ Name: Name, Alter: 18 }}>
    {/**Unterkomponenten, die Variablen verwenden müssen, müssen in die Mitte des Anbieters geschrieben werden, um eine gemeinsame Nutzung zu erreichen*/}
    <Kind />
   </ContextName.Provider>
  </div>
 );
};

const Kind = () => {
 //Erstelle eine Sohnkomponente und führe die Enkelkomponente ein return (
  <div Stil={{ Grenze: '1px durchgezogen' }}>
   Kind
  </div>
 );
};

const KindKind = () => {
 //Erstellen Sie eine Enkelkomponente, akzeptieren Sie den Status der Enkelkomponente und verwenden Sie useContext, um den Wert von ContextName abzurufen, der von der Enkelkomponente erstellt wurde. let childname = useContext(ContextName);
 zurückkehren (
  <div Stil={{ Grenze: '1px durchgezogen' }}>
   KindKind Enkelkind
    {Kindname.Name}:{Kindname.Alter}
   </p>
  </div>
 );
};

Standard-UseContext exportieren;

6.Verwenden Sie Reducer

Der Usereducer gibt hier den Status und den Dispatch zurück, übergibt ihn über den Kontext an die untergeordnete Komponente und ruft dann direkt den Status auf oder löst den Reducer aus. Wir verwenden useReducer häufig mit useContext createContext, um die Wertübertragungs- und Neuzuweisungsvorgänge von reudx zu simulieren.

importiere React, { useState, useReducer, useContext, createContext } von „react“;

// Stroe-Typ und Initialisierungswert initialisieren und Reducer erstellen
const ADD_COUNTER = "ADD_COUNTER";
const initReducer = {
 Anzahl: 0
};
//Normaler Reducer, der die Funktion Reducer (Zustand, Aktion) { schreibt.
 Schalter (Aktion.Typ) {
  Fall ADD_COUNTER:
   return { ...Zustand, Anzahl: Zustand.Anzahl + 1 };
  Standard:
   Rückgabezustand;
 }
}

const CountContext = erstelleContext();
//Im obigen Absatz wird der Status initialisiert und der Reducer erstellt den Kontext. Sie können eine separate Datei schreiben. Hier habe ich es der besseren Verständlichkeit halber in eine Datei eingefügt const UseReducer = () => {
 const [ name, setname ] = useState('baby');
 //Verwenden Sie useReducer in der übergeordneten Komponente. Der erste Parameter ist die Reducer-Funktion und der zweite Parameter ist der Status. Der zurückgegebene Wert ist Status und Dispatch.
 const [Status, Versand] = useReducer (Reducer, initReducer);
 zurückkehren (
  <div>
   Verwenden Sie Reducer
   {/* Hier übergeben wir den Reducer und den Status über den Kontext an die untergeordnete Komponente*/}
   <CountContext.Provider-Wert={{ Status, Dispatch, Name, Setname }}>
    <Kind />
   </CountContext.Provider>
  </div>
 );
};

const Kind = () => {
 // Akzeptieren Sie wie bei der normalen Kontextakzeptanz den Wert der übergeordneten Komponente, lösen Sie den Reduzierer durch Ereignisse usw. aus, um den Redux-Effekt zu erzielen const { state, dispatch, name, setname } = useContext(CountContext);
 Funktion handleclick(Anzahl) {
  dispatch({ Typ: ADD_COUNTER, Anzahl: 17 });
  setname(Anzahl % 2 == 0 ? 'Babybruder' : 'Babybruder');
 }
 zurückkehren (
  <div>
   <p>
    {name} ist dieses Jahr {state.count} Jahre alt</p>
   <button onClick={() => handleclick(state.count)}>Erwachsen</button>
  </div>
 );
};

Standardmäßig UseReducer exportieren;

Anbei die GitHub-Adresse von 10 Hook-Demos. Bitte vergeben Sie einen Stern. Danke!

GitHub-Adresse: https://github.com/babybroherzb/React-Hook

Dies ist das Ende dieses Artikels über die Verwendung von 10 Hooks in React. Weitere relevante Inhalte zu React Hook finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • React Hook: So verwenden Sie State Hook
  • React Hook: So verwenden Sie Effect Hook
  • Reacts Übergang von Klassen zu Hooks
  • Detaillierte Erklärung zu React Hooks
  • Erfahren Sie mehr über React’s Hook

<<:  Der CSS-Stil löst das Problem der Anzeige von Auslassungspunkten, wenn der Text zu lang ist

>>:  Tutorial zur Verwendung von Docker Compose zum Erstellen von Confluence

Artikel empfehlen

Detaillierte Beispiele zur Verwendung der Box-Shadow-Eigenschaft in CSS3

CSS enthält viele Attribute. Manche Attribute wer...

Detaillierte Erläuterung der Komponentenentwicklung des Vue-Dropdown-Menüs

In diesem Artikelbeispiel wird der spezifische Co...

Axios storniert Anfragen und vermeidet doppelte Anfragen

Inhaltsverzeichnis Herkunft Status Quo Anfrage ab...

So erstellen Sie eine PHP+Nginx+Swoole+MySQL+Redis-Umgebung mit Docker

Betriebssystem: Alibaba Cloud ESC-Instanz centos7...

So installieren Sie OpenJDK in Docker und führen das JAR-Paket aus

Bild herunterladen Docker-Pull OpenJDK Erstellen ...

Implementierung der HTML-Befehlszeilenschnittstelle

HTML-Teil Code kopieren Der Code lautet wie folgt:...

Vue implementiert eine kleine Notizblockfunktion

In diesem Artikelbeispiel wird der spezifische Co...

Installation und Konfiguration von MySQL 8.0.15 unter Centos7

In diesem Artikel finden Sie das grafische Tutori...

So ändern Sie die Gruppe, zu der ein Benutzer in Linux gehört

Ändern Sie die Gruppe, zu der ein Benutzer in Lin...

Implementierung der Codeaufteilung von Webpack3+React16

Projekthintergrund Seit kurzem gibt es ein Projek...

Pessimistisches Sperren und optimistisches Sperren in MySQL

In relationalen Datenbanken sind pessimistisches ...

js, css, html bestimmen die verschiedenen Versionen des Browsers

Verwenden Sie reguläre Ausdrücke, um die IE-Browse...