Maison outils de développement composer Étapes détaillées pour encapsuler React Context Composer (partage)

Étapes détaillées pour encapsuler React Context Composer (partage)

Dec 20, 2021 pm 01:57 PM

Cet article est écrit par la colonne tutorielle composer pour vous présenter comment encapsuler un React Context Composer étape par étape. J'espère qu'il sera utile aux amis qui en ont besoin !

Comment encapsuler un React Context Composer étape par étape ?

Motivation

React propose de nombreuses solutions de gestion d'état, telles que Redux, Mobx, Recoil, etc. Jusqu'à présent, je n'ai expérimenté que Redux, et je pense que c'est encore un peu encombrant. Parce que j'écris habituellement beaucoup de Hooks, je préfère utiliser Context Provider avec le hook useContext, ce qui facilite la division et la combinaison d'états. Ici, nous ne discuterons pas des avantages et des inconvénients de chaque solution de gestion d’état, mais nous concentrerons sur un problème d’imbrication multicouche rencontré lors de l’utilisation de Context.

L'image ci-dessous est un code extrait d'un projet taro + react hooks + ts que j'écrivais récemment. J'ai divisé un état global (le but du fractionnement est de réduire le rendu inutile), puis je les ai imbriqués. Cette façon d’écrire me rappelle le sentiment d’être dominé par l’enfer du rappel, ce qui est très inconfortable. J'ai donc pensé à sceller moi-même un composant d'ordre élevé et à « aplatir » la structure en termes d'écriture.

<LoadingContext.Provider value={{ loading, setLoading }}>
  <UserDataContext.Provider value={{ name: "ascodelife", age: 25 }}>
    <ThemeContext.Provider value={"light"}>
    {/* ....more Providers as long as you want */}
    </ThemeContext.Provider>
  </UserDataContext.Provider>
</LoadingContext.Provider>
Copier après la connexion

La solution la plus simple

Ici, j'ai rapidement écrit la première solution, en utilisant réduireRight pour terminer l'imbrication du fournisseur.

La raison pour laquelle réduireRight est utilisé ici au lieu de réduire est que nous sommes plus habitués à l'ordre d'écriture de la couche externe à la couche interne.

// ContextComposer.tsx
import React from &#39;react&#39;;
type IContextComposerProps = {
  contexts: { context: React.Context<any>; value: any }[];
};
const ContextComposer: React.FC<IContextComposerProps> = ({ contexts, children }) => {
  return (
    <>
      {contexts.reduceRight((child, parent) => {
        const { context, value } = parent;
        return <context.Provider value={value}>{child}</context.Provider>;
      }, children)}
    </>
  );
};
export default ContextComposer;
// App.tsx
<ContextComposer
  contexts={[
    { context: ThemeContext, value: "light" },
    { context: UserDataContext, value: { name: "ascodelife", age: 25 } },
    { context: LoadingContext, value: { loading, setLoading } },
  ]}>
    { children }
</ContextComposer>
Copier après la connexion

Après une expérience réelle, j'ai découvert que même si cela peut être utilisé, l'expérience de développement est un peu pire. Le problème est que la valeur transmise lorsque le composant entre dans le paramètre est de type any, ce qui signifie que la vérification de type statique de ts est abandonnée. Lors du passage des paramètres, étant donné que la vérification du type statique ne sera pas effectuée sur la valeur, non seulement il n'y aura pas d'invite de code lors de la saisie du code, mais cela peut également provoquer des erreurs d'exécution de niveau relativement faible. Mauvaise critique !

Un plan de transformation basé sur React.cloneElement()

Afin de transformer la solution ci-dessus, je suis tombé sur une fonction relativement impopulaire mais facile à utiliser - React.cloneElement(). Il n'y a pas beaucoup de points à noter à propos de cette fonction. Jetez principalement un œil à ses trois paramètres d'entrée. Le premier est l'élément parent, le second les accessoires parents et le troisième les paramètres restants... les enfants, à l'exception des éléments parents. premier paramètre. À part cela, toutes les autres valeurs sont facultatives.

Par exemple :

<!-- 调用函数 -->
React.cloneElement(<div/>,{},<span/>);
<!-- 相当于创建了这样一个结构 -->
<div> 
    <span></span>
</div>
Copier après la connexion

Ensuite, commençons la transformation. Le cadre réduireRight reste inchangé. Modifiez le type de paramètre d'entrée et le rappel réduireRight.

// ContextComposer.tsx
import React from &#39;react&#39;;
type IContextComposerProps = {
  contexts: React.ReactElement[];
};
const ContextComposer: React.FC<IContextComposerProps> = ({ contexts, children }) => {
  return (
    <>
      {contexts.reduceRight((child, parent) => {
        return React.cloneElement(parent,{},child);
      }, children)}
    </>
  );
};
export default ContextComposer;
// App.tsx
<ContextComposer
  contexts={[
      <ThemeContext.Provider value={"light"} />,
      <UserDataContext.Provider value={{ name: "ascodelife", age: 25 }} />,
      <LoadingContext.Provider value={{ loading, setLoading }} />,
  ]}>
    { children }
</ContextComposer>
Copier après la connexion

Après la transformation, lorsque nous passons des paramètres, il semble que nous créons réellement un composant (bien sûr, le composant est réellement créé, mais le composant lui-même n'est pas rendu au Dom virtuel, et ce qui est réellement rendu est après en cours de copie). Dans le même temps, le problème de vérification de type statique de valeur sur lequel nous venons de nous concentrer a également été résolu.

astuces : React.cloneElement(parent,{},child) est équivalent à React.cloneElement(parent,{children:child}), savez-vous pourquoi ?

Ressources associées

Le code source a été synchronisé avec github (https://github.com/ascodelife/react-context-provider-composer).

Il a également été emballé dans l'entrepôt npm (https://www.npmjs.com/package/@ascodelife/react-context-provider-composer), bienvenue pour en faire l'expérience.

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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Que fait un compositeur? Que fait un compositeur? Apr 08, 2025 am 12:19 AM

Composer est un outil de gestion des dépendances pour PHP, utilisé pour déclarer, télécharger et gérer les dépendances du projet. 1) Déclarer les dépendances via le fichier composer.json, 2) Installez les dépendances à l'aide de ComposeRenstall Commande, 3) Analyser l'arborescence de dépendance et le télécharger à partir de Packagist, 4) Générez le fichier Autoload.php pour simplifier le chargement automatique, 5) Optimiser l'utilisation inclue à l'aide de ComposerUpdate - Prefer-Dist et ajustement de la configuration Autoload.

À quoi sert un compositeur? À quoi sert un compositeur? Apr 06, 2025 am 12:02 AM

Composer est un outil de gestion des dépendances pour PHP. Les étapes principales de l'utilisation du compositeur comprennent: 1) DÉCLARIER DES DÉPÉLENCES DANS COMPOSER.JSON, tels que "Stripe / Stripe-Php": "^ 7.0"; 2) Exécutez ComposeRrinstall pour télécharger et configurer les dépendances; 3) Gérer les versions et les autoloads via Composer.lock et Autoload.php. Le compositeur simplifie la gestion des dépendances et améliore l'efficacité du projet et la maintenabilité.

Quelle est la différence entre le compositeur et l'orchestrateur? Quelle est la différence entre le compositeur et l'orchestrateur? Apr 02, 2025 pm 02:49 PM

Le compositeur est utilisé pour gérer les dépendances sur les projets PHP, tandis que l'orchestrateur est utilisé pour gérer et coordonner les microservices ou les applications conteneurisées. 1.COMPOSER déclare et gère les dépendances des projets PHP via le fichier composer.json. 2. Orchestrator gère le déploiement et l'extension des services via des fichiers de configuration (tels que les fichiers YAML de Kubernetes), garantissant une haute disponibilité et un équilibrage de charge.

Expertise des compositeurs: ce qui rend quelqu'un de compétence Expertise des compositeurs: ce qui rend quelqu'un de compétence Apr 11, 2025 pm 12:41 PM

Pour devenir compétent lorsque vous utilisez Composer, vous devez maîtriser les compétences suivantes: 1. Compétions dans l'utilisation des fichiers composer.json et composer.

Résolvez le problème de la connexion de la base de données: un cas pratique d'utilisation de la bibliothèque Minii / DB Résolvez le problème de la connexion de la base de données: un cas pratique d'utilisation de la bibliothèque Minii / DB Apr 18, 2025 am 07:09 AM

J'ai rencontré un problème délicat lors du développement d'une petite application: la nécessité d'intégrer rapidement une bibliothèque d'opération de base de données légère. Après avoir essayé plusieurs bibliothèques, j'ai constaté qu'ils avaient trop de fonctionnalités ou ne sont pas très compatibles. Finalement, j'ai trouvé Minii / DB, une version simplifiée basée sur YII2 qui a parfaitement résolu mon problème.

Résoudre les problèmes de mise en cache dans Craft CMS: Utilisation du plug-in Wiejeben / Craft-Laravel-MIX Résoudre les problèmes de mise en cache dans Craft CMS: Utilisation du plug-in Wiejeben / Craft-Laravel-MIX Apr 18, 2025 am 09:24 AM

Lorsque vous développez des sites Web à l'aide de CRAFTCMS, vous rencontrez souvent des problèmes de mise en cache de fichiers de ressources, en particulier lorsque vous mettez fréquemment à mettre à jour les fichiers CSS et JavaScript, les anciennes versions des fichiers peuvent toujours être mises en cache par le navigateur, ce qui fait que les utilisateurs ne voient pas les derniers changements de temps. Ce problème affecte non seulement l'expérience utilisateur, mais augmente également la difficulté du développement et du débogage. Récemment, j'ai rencontré des problèmes similaires dans mon projet, et après une exploration, j'ai trouvé le plugin wiejeben / artist-laravel-mix, qui a parfaitement résolu mon problème de mise en cache.

Améliorer l'efficacité de la sérialisation de l'entité de la doctrine: application de sidus / doctrine serializer-bundle Améliorer l'efficacité de la sérialisation de l'entité de la doctrine: application de sidus / doctrine serializer-bundle Apr 18, 2025 am 11:42 AM

J'ai eu un problème difficile lorsque je travaille sur un projet avec un grand nombre d'entités de doctrine: chaque fois que l'entité est sérialisée et désérialisée, la performance devient très inefficace, entraînant une augmentation significative du temps de réponse du système. J'ai essayé plusieurs méthodes d'optimisation, mais cela ne fonctionne pas bien. Heureusement, en utilisant le SIDUS / Doctrine-Serializer-Bundle, j'ai résolu avec succès ce problème, améliorant considérablement les performances du projet.

Comment construire rapidement des modèles de projet avancés Fecmall à l'aide du compositeur Comment construire rapidement des modèles de projet avancés Fecmall à l'aide du compositeur Apr 18, 2025 am 11:45 AM

Lors du développement d'une plate-forme de commerce électronique, il est crucial de choisir le bon cadre et les bons outils. Récemment, lorsque j'essayais de créer un site Web de commerce électronique riche en fonctionnalités, j'ai rencontré un problème difficile: comment créer rapidement une plate-forme de commerce électronique évolutive et entièrement fonctionnelle. J'ai essayé plusieurs solutions et j'ai fini par choisir le modèle de projet avancé de FECMALL (FECMALL / FBBCBASE-APP-ADVANDAD). En utilisant le compositeur, ce processus devient très simple et efficace. Le compositeur peut être appris par l'adresse suivante: Adresse d'apprentissage

See all articles