Heim  >  Artikel  >  Web-Frontend  >  Eine kurze Diskussion über die Methoden zur Datenbeschaffung in React und ihre Vor- und Nachteile

Eine kurze Diskussion über die Methoden zur Datenbeschaffung in React und ihre Vor- und Nachteile

青灯夜游
青灯夜游nach vorne
2020-02-19 11:31:462080Durchsuche

Eine kurze Diskussion über die Methoden zur Datenbeschaffung in React und ihre Vor- und Nachteile

Beim Durchführen einer E/A-Operation (z. B. Datenextraktion) senden Sie zuerst eine Netzwerkanforderung, warten dann auf die Antwort, speichern dann die Antwortdaten im Status der Komponente und endlich rendern.

In React sind die Lebenszyklusmethoden, Hooks und Suspense Möglichkeiten, Daten abzurufen. Als nächstes werden wir anhand von Beispielen demonstrieren, wie man sie verwendet, und die Vor- und Nachteile jeder Methode erläutern, damit wir asynchronen Operationscode besser schreiben können.

1. Verwenden Sie Lebenszyklusmethoden, um Daten anzufordern

Die Anwendung Employees.org führt zwei Dinge aus:

1. Erhalten Sie sie, sobald Sie sie erhalten Betreten Sie das Programm20 Mitarbeiter.
2. Sie können Mitarbeiter nach Filterbedingungen filtern.

Eine kurze Diskussion über die Methoden zur Datenbeschaffung in React und ihre Vor- und Nachteile

Bevor wir diese beiden Anforderungen implementieren, schauen wir uns die 2 Lebenszyklusmethoden der React-Klassenkomponenten an:

  1. componentDidMount(): Wird ausgeführt, nachdem die Komponente gemountet wurde.
  2. componentDidUpdate(prevProps): Wird ausgeführt, wenn sich props oder state ändert.

Komponente <employeespage></employeespage> verwendet die beiden oben genannten Ein Lebenszyklus Die Methode implementiert die Erfassungslogik:

import EmployeesList from "./EmployeesList";
import { fetchEmployees } from "./fake-fetch";

class EmployeesPage extends Component {
  constructor(props) {
    super(props);
    this.state = { employees: [], isFetching: true };
  }

  componentDidMount() {
    this.fetch();
  }

  componentDidUpdate(prevProps) {
    if (prevProps.query !== this.props.query) {
      this.fetch();
    }
  }

  async fetch() {
    this.setState({ isFetching: true });
    const employees = await fetchEmployees(this.props.query);
    this.setState({ employees, isFetching: false });
  }

  render() {
    const { isFetching, employees } = this.state;
    if (isFetching) {
      return <div>获取员工数据中...</div>;
    }
    return <EmployeesList employees={employees} />;
  }
}

Öffnen Sie codesandbox, um den <employeespage></employeespage> Erfassungsprozess anzuzeigen.

<employeespage></employeespage> verfügt über eine asynchrone Methode fetch() zum Abrufen von Daten. Verwenden Sie die Methode setState, um employees zu aktualisieren, nachdem die Abrufanforderung abgeschlossen ist.

this.fetch() wird in der Lebenszyklusmethode componentDidMount() ausgeführt: Sie ruft die Mitarbeiterdaten ab, wenn die Komponente zum ersten Mal gerendert wird.

Wenn unsere Schlüsselwörter gefiltert werden, wird props.query aktualisiert. Immer wenn props.query aktualisiert wird, wird componentDidUpdate() this.fetch() erneut ausführen.

Während Lebenszyklusmethoden relativ einfach zu beherrschen sind, verfügen klassenbasierte Methoden über Boilerplate-Code, der die Wiederverwendbarkeit erschwert.

Vorteile

Dieser Ansatz ist leicht zu verstehen: componentDidMount() ruft die Daten beim ersten Rendern ab und componentDidUpdate() bei props Daten beim Aktualisieren erneut abrufen.

Nachteile

Boilerplate-Code

Klassenbasierte Komponenten erforderlich React.Component erben, super(props) im Konstruktor ausführen usw.

dieses

Die Verwendung des Schlüsselworts this ist problematisch.

Code-Duplizierung

Der Code in componentDidMount() und componentDidUpdate() ist größtenteils dupliziert.

Schwer wiederzuverwenden

Logik zur Mitarbeiterakquise lässt sich nur schwer in einer anderen Komponente wiederverwenden.

2. Verwenden Sie Hooks, um Daten abzurufen

Hooks ist eine bessere Wahl, um Daten basierend auf Klassen zu erhalten. Als einfache Funktionen müssen Hooks nicht wie Klassenkomponenten vererbt werden und sind einfacher wiederzuverwenden.

Kurze ErinnerunguseEffect(callback[, deps])Hook. Dieser Hook wird nach dem Mounten von callback ausgeführt und erneut gerendert, wenn sich die Abhängigkeit deps ändert.

Wie im folgenden Beispiel gezeigt, verwenden Sie <employeespage></employeespage> in useEffect(), um Mitarbeiterdaten abzurufen:

import EmployeesList from "./EmployeesList";
import { fetchEmployees } from "./fake-fetch";

function EmployeesPage({ query }) {
  const [isFetching, setFetching] = useState(false);
  const [employees, setEmployees] = useState([]);

  useEffect(function fetch() {
    (async function() {
      setFetching(true);
      setEmployees(await fetchEmployees(query));
      setFetching(false);
    })();
  }, [query]);
  
  if (isFetching) {
    return <div>Fetching employees....</div>;
  }
  return <EmployeesList employees={employees} />;
}

Öffnen Sie codesandbox, um zu sehen, wie useEffect() Daten abruft.

Sie sehen, dass die Verwendung von Hooks <employeespage></employeespage> viel einfacher ist als die Verwendung von Klassenkomponenten.

In <employeespage></employeespage> in einer useEffect(fetch, [query])-Funktionskomponente wird der fetch-Callback nach dem ersten Rendern ausgeführt. Darüber hinaus wird die query-Methode fetch auch erneut ausgeführt, wenn die Abhängigkeit
aktualisiert wird.

Aber es gibt noch Raum für Optimierungen. Mithilfe von Hooks können wir die Mitarbeitergewinnungslogik aus der <employeespage></employeespage>-Komponente extrahieren. Werfen wir einen Blick darauf:

import React, { useState } from &#39;react&#39;;

import EmployeesList from "./EmployeesList";
import { fetchEmployees } from "./fake-fetch";

function useEmployeesFetch(query) { // 这行有变化
  const [isFetching, setFetching] = useState(false);
  const [employees, setEmployees] = useState([]);

  useEffect(function fetch {
    (async function() {
      setFetching(true);
      setEmployees(await fetchEmployees(query));
      setFetching(false);
    })();
  }, [query]);

  return [isFetching, employees];
}

function EmployeesPage({ query }) {
  const [employees, isFetching] = useEmployeesFetch(query); // 这行有变化
  
  if (isFetching) {
    return <div>Fetching employees....</div>;
  }
  return <EmployeesList employees={employees} />;
}

erwähnt den erforderlichen Wert aus useEmployeesFetch(). Die Komponente <employeespage></employeespage> verfügt über keine entsprechende Erfassungslogik und ist nur für die Darstellung der Schnittstelle verantwortlich.

Noch besser: useEmployeesFetch() kann in jeder anderen Komponente wiederverwendet werden, die Mitarbeiter benötigt.

Vorteile

Klar und einfach

Hooks haben keinen Boilerplate-Code, da es sich um normale Funktionen handelt.

Wiederverwendbarkeit

Die in Hooks implementierte Datenerfassungslogik ist einfach wiederzuverwenden.

Nachteile

Erfordert Vorkenntnisse

Haken sind etwas kontraintuitiv, daher müssen Sie sie verstehen, bevor Sie sie verwenden. Haken basieren auf Verschlüssen, also stellen Sie sicher, dass Sie sie gut verstehen.

必要性

使用Hooks,仍然必须使用命令式方法来执行数据获取。

3.使用 suspense 获取数据

Suspense 提供了一种声明性方法来异步获取React中的数据。

注意:截至2019年11月,Suspense 处于试验阶段。

<suspense></suspense>包装执行异步操作的组件:

<Suspense fallback={<span>Fetch in progress...</span>}>
  <FetchSomething />
</Suspense>

数据获取时,Suspense将显示fallback中的内容,当获取完数据后,Suspense将使用获取到数据渲染<fetchsomething></fetchsomething>

来看看怎么使用Suspense

import React, { Suspense } from "react";
import EmployeesList from "./EmployeesList";

function EmployeesPage({ resource }) {
  return (
    <Suspense fallback={<h1>Fetching employees....</h1>}>
      <EmployeesFetch resource={resource} />
    </Suspense>
  );
}

function EmployeesFetch({ resource }) {
  const employees = resource.employees.read();
  return <EmployeesList employees={employees} />;
}

打开codesandbox可以查看Suspense如何获取数据。

<employeespage></employeespage>使用Suspense处理组件将获取到数据传递给<employeesfetch></employeesfetch>组件。

<employeesfetch></employeesfetch>中的resource.employees是一个特殊包装的promise,它在背后与Suspense进行通信。这样,Suspense就知道“挂起” <employeesfetch></employeesfetch>的渲染要花多长时间,并且当资源准备就绪时,就开始执行渲染工作。

最大的优点是:Suspense 以声明性和同步的方式处理异步操作。组件没有复杂数据获取逻辑,而是以声明方式使用资源来渲染内容。在组件内部没有生命周期,没有 Hooks,async/await,没有回调:仅展示界面。

优点

声明式

Suspense 以声明的方式在React中执行异步操作。

简单

声明性代码使用起来很简单,这些组件没有复杂的数据获取逻辑。

松耦合与获取实现

使用Suspense的组件看不出如何获取数据:使用 REST 或 GraphQL。Suspense设置一个边界,保护获取细节泄露到组件中。

标准状态

如果请求了多个获取操作,那么Suspense会使用最新的获取请求。

原文:https://dmitripavlutin.com/re...

4.总结

很长一段时间以来,生命周期方法一直是获取数据方式的唯一解决方案。然而,使用它们获取数据会有很多样板代码、重复和可重用性方面的问题。

使用 Hooks 获取数据是更好的选择:更少的样板代码。

Suspense的好处是声明性获取。咱们的组件不会被获取实现细节弄得乱七八糟。Suspense更接近于React本身的声明性本质。

英文原文地址:https://dmitripavlutin.com/react-fetch-lifecycle-methods-hooks-suspense/

为了保证的可读性,本文采用意译而非直译。

更多编程相关内容,请关注php中文网编程入门栏目!

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über die Methoden zur Datenbeschaffung in React und ihre Vor- und Nachteile. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen