Maison  >  Article  >  interface Web  >  Une brève discussion sur les méthodes d'obtention de données dans React et leurs avantages et inconvénients

Une brève discussion sur les méthodes d'obtention de données dans React et leurs avantages et inconvénients

青灯夜游
青灯夜游avant
2020-02-19 11:31:462075parcourir

Une brève discussion sur les méthodes d'obtention de données dans React et leurs avantages et inconvénients

Lorsque vous effectuez une opération d'E/S (telle que l'extraction de données), vous envoyez d'abord une requête réseau, puis attendez la réponse, puis enregistrez les données de réponse dans l'état du composant, et enfin rendre.

Dans React, les méthodes de cycle de vie, les Hooks et Suspense sont des moyens d'obtenir des données. Ensuite, nous utiliserons des exemples pour montrer comment les utiliser et expliquer les avantages et les inconvénients de chaque méthode afin que nous puissions mieux écrire du code d'opération asynchrone.

1. Utilisez les méthodes du cycle de vie pour demander des données

L'application Employees.org fait deux choses :

1. entrez dans le programme20employés.
2. Vous pouvez filtrer les employés par conditions de filtrage.

Une brève discussion sur les méthodes dobtention de données dans React et leurs avantages et inconvénients

Avant de mettre en œuvre ces deux exigences, passons en revue les 2 méthodes de cycle de vie des composants de la classe React :

  1. componentDidMount() : Exécuté après le montage du composant
  2. componentDidUpdate(prevProps) : Exécuté lorsque props ou state change

Le composant <employeespage></employeespage> utilise les deux ci-dessus Un cycle de vie La méthode implémente la logique d'acquisition :

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} />;
  }
}

Ouvrez codesandbox pour visualiser le <employeespage></employeespage> processus d'acquisition.

<employeespage></employeespage> dispose d'une méthode asynchrone fetch() pour obtenir des données. Une fois la demande de récupération terminée, utilisez la méthode setState pour mettre à jour employees.

this.fetch() est exécuté dans la méthode de cycle de vie componentDidMount() : il récupère les données de l'employé lors du rendu initial du composant.

Lorsque nos mots-clés seront filtrés, props.query sera mis à jour. Chaque fois que props.query est mis à jour, componentDidUpdate() réexécutera this.fetch().

Bien que les méthodes de cycle de vie soient relativement faciles à maîtriser, les méthodes basées sur les classes ont un code passe-partout qui rend la réutilisabilité difficile.

Avantages

Cette approche est facile à comprendre : componentDidMount() récupère les données sur le premier rendu, et componentDidUpdate() sur props Récupérez à nouveau les données lors de la mise à jour.

Inconvénients

Code passe-partout

Composants basés sur la classe requis Héritez de React.Component, exécutez super(props) dans le constructeur, etc.

ce

L'utilisation du mot-clé this est gênante.

Duplication de code

Le code dans componentDidMount() et componentDidUpdate() est en grande partie dupliqué.

Difficile à réutiliser

La logique d'acquisition d'employés est difficile à réutiliser dans un autre composant.

2. Utilisez Hooks pour obtenir des données

Hooks est un meilleur choix pour obtenir des données basées sur les classes. En tant que fonctions simples, les Hooks n'ont pas besoin d'être hérités comme les composants de classe et sont plus faciles à réutiliser.

Rappel brefuseEffect(callback[, deps]) Crochet. Ce hook est exécuté après le montage callback et est restitué lorsque la dépendance deps change.

Comme le montre l'exemple suivant, utilisez <employeespage></employeespage> dans useEffect() pour obtenir les données des employés :

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} />;
}

Ouvrez codesandbox pour voir comment useEffect() obtient les données.

Vous pouvez voir qu'utiliser des Hooks <employeespage></employeespage> est beaucoup plus simple que d'utiliser des composants de classe.

Dans <employeespage></employeespage> dans un composant de fonction useEffect(fetch, [query]), le rappel fetch est exécuté après le rendu initial. De plus, la méthode query fetch sera également réexécutée lorsque la dépendance
sera mise à jour.

Mais il y a encore place à l'optimisation. Les hooks nous permettent d'extraire la logique d'acquisition d'employés du composant <employeespage></employeespage>, jetons un coup d'œil :

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} />;
}

mentionne la valeur requise de useEmployeesFetch(). Le composant <employeespage></employeespage> n'a pas de logique d'acquisition correspondante et est uniquement responsable du rendu de l'interface.

Mieux encore, useEmployeesFetch() peut être réutilisé dans tout autre composant dont les employés ont besoin.

Avantages

Clair et simple

Les crochets n'ont pas de code passe-partout car ce sont des fonctions normales.

Réutilisabilité

La logique d'acquisition de données implémentée dans Hooks est facile à réutiliser.

Inconvénients

Nécessite des connaissances préalables

Les crochets sont un peu contre-intuitifs, vous devez donc les comprendre avant de les utiliser, les crochets reposent sur des fermetures, alors assurez-vous de bien les comprendre.

必要性

使用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中文网编程入门栏目!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer