Table des matières
Invariant: s'en tiennez aux faits
Utiliser des objets inchangés
Invariance dans React
Dès la lecture
Maison interface Web tutoriel CSS Comprendre l'immuabilité en JavaScript

Comprendre l'immuabilité en JavaScript

Apr 11, 2025 am 11:47 AM

Comprendre l'immuabilité en JavaScript

Le concept d'invariance en JavaScript peut être confondu avec une réaffectation variable. Les variables déclarées à l'aide let ou var peuvent être réaffectées, mais les variables déclarées par const ne peuvent pas.

Par exemple, attribuez "Kingsley" à une variable nommée firstName :

 Soit FirstName = "Kingsley";
Copier après la connexion

La réaffectation peut être effectuée:

 FirstName = "John";
Copier après la connexion

En effet, let est utilisé. Si vous utilisez const :

 const LastName = "Silas";
Copier après la connexion

Essayer de réaffecter entraînera une erreur:

 LastName = "Doe";
// TypeError: affectation à une variable constante.
Copier après la connexion

Mais ce n'est pas l'immuabilité.

Dans des cadres tels que React, un concept important est d'éviter la modification directe des états et des propriétés (accessoires). L'invariance n'est pas un concept unique de réact, mais un principe important qui réagit des utilisations lorsqu'il traitait des états et des propriétés.

Alors, que signifie l'invariance?

Invariant: s'en tiennez aux faits

Les données inchangées ne peuvent pas modifier sa structure ou les données à l'intérieur. Il attribue la valeur à une variable qui ne peut pas être modifiée, faisant de la valeur une source de vérité dans un sens - comme une princesse embrasse une grenouille et veut qu'elle devienne un beau prince. L'invariance signifie qu'une grenouille sera toujours une grenouille.

Bien que les objets et les tableaux permettent une mutation, cela signifie que la structure des données peut être modifiée. Si nous le disons, embrasser l'une de ces grenouilles pourrait conduire à une transformation qui se transforme en prince.

Par exemple, un objet utilisateur:

 Laissez user = {name: "James Doe", emplacement: "Lagos"};
Copier après la connexion

Créez un nouvel objet newUser :

 Laissez NewUser = utilisateur;
Copier après la connexion

Si le premier utilisateur modifie l'emplacement, il modifiera directement user et affectera newUser :

 user.location = "Abia";
Console.log (NewUser.Location); // "Abia"
Copier après la connexion

Ce n'est peut-être pas le résultat que nous voulons. Cette réaffectation peut avoir des conséquences inattendues.

Utiliser des objets inchangés

Nous devons nous assurer que l'objet n'est pas muté. Si vous souhaitez utiliser une méthode, il doit renvoyer un nouvel objet. Essentiellement, nous avons besoin d'une fonction pure .

Les fonctions pures ont deux caractéristiques:

  1. La valeur de retour dépend du paramètre entrant. Tant que l'entrée reste inchangée, la valeur de retour ne changera pas.
  2. Il ne change pas les choses en dehors de sa portée.

En utilisant Object.assign() , nous pouvons créer une fonction qui ne modifie pas l'objet entrant. Il créera un nouvel objet et copiera les deuxième et troisième paramètres dans l'objet vide passé en tant que premier paramètre, puis renvoie le nouvel objet.

 const updateLocation = (data, newlocation) => {
  return object.assign ({}, data, {emplacement: newlocation});
};
Copier après la connexion

updateLocation() est une fonction pure. Si nous passons dans le premier objet utilisateur, il renvoie un nouvel objet utilisateur avec location ayant une nouvelle valeur.

Une autre façon consiste à utiliser l'opérateur d'extension:

 const updateLocation = (data, newlocation) => {
  return {... data, emplacement: newlocation};
};
Copier après la connexion

Alors, qu'est-ce que cela a à voir avec React?

Invariance dans React

Dans une application React typique, un état est un objet. (Redux utilise des objets invariants comme base du stockage d'applications.) Le processus de coordination de React détermine si un composant doit être rendu, ou s'il nécessite un moyen de suivre les changements.

En d'autres termes, si React ne peut pas déterminer que l'état du composant a changé, il ne saura pas pour mettre à jour le DOM virtuel.

L'application de l'invariance permet de suivre ces changements. Cela permet à React de comparer l'ancien état de l'objet et de son nouvel état et de renvoyer le composant en fonction de cette différence.

C'est pourquoi il n'est généralement pas recommandé de mettre à jour directement l'état de réagir:

 this.state.username = "Jamesdoe";
Copier après la connexion

React ne sera pas sûr si l'état a changé et que le composant ne peut pas être remis.

Immutable.js

Redux suit le principe de l'invariance. Ses réducteurs doivent être des fonctions pures, ils ne devraient donc pas modifier l'état actuel, mais doivent renvoyer un nouvel objet en fonction de l'état actuel et de l'action. Nous utilisons généralement des opérateurs d'extension comme avant, mais nous pouvons utiliser une bibliothèque appelée Immutable.js pour obtenir le même effet.

Bien que le JavaScript pur puisse gérer l'invariance, il peut y avoir des pièges dans le processus. Utilisez Immutable.js pour assurer l'invariance tout en fournissant une API riche avec des performances supérieures. Cet article n'entrera pas dans les détails de tous les détails de l'immuabilité.js, mais nous examinerons un exemple simple qui montre comment l'utiliser dans une application de tâche alimentée par React et Redux.

Tout d'abord, commençons par importer les modules requis et configurer le composant TODO.

 const {list, map} = immuable;
const {fournisseur, connect} = reactredUx;
const {CreateStore} = redux;
Copier après la connexion

Si vous utilisez une machine locale, vous devez installer ces packages:

 NPM Installer Redux React-Redux Immutable
Copier après la connexion

L'instruction d'importation ressemble à ceci:

 import {list, map} à partir de "immuable";
import {fournisseur, connect} à partir de "react-redux";
import {CreateStore} à partir de "redux";
Copier après la connexion

Nous pouvons ensuite procéder à la configuration de notre composant TODO avec quelques balises:

 // ... Code de composant TODO ...
Copier après la connexion

Nous utilisons handleSubmit() pour créer un nouvel élément de tâche. Dans ce cas, l'utilisateur ne créera qu'un nouvel élément de tâche, nous n'avons besoin que d'une seule action:

 // ... Code d'actions ...
Copier après la connexion

La charge utile que nous créons contient l'ID et le texte de l'élément de tâche. Ensuite, nous pouvons procéder à la définition de la fonction de réducteur et à passer l'opération que nous avons créée ci-dessus à la fonction de réducteur:

 // ... code réducteur ...
Copier après la connexion
Copier après la connexion

Nous utiliserons connect pour créer un composant conteneur afin que nous puissions nous connecter au stockage. Ensuite, nous devons passer dans les fonctions mapStateToProps() et mapDispatchToProps() pour se connecter.

 // ... connecter le code ...
Copier après la connexion

Nous utilisons mapStateToProps() pour fournir les données stockées pour le composant. Nous utilisons ensuite mapDispatchToProps() pour rendre le Créateur d'opération à la disposition du composant en tant que propriété.

Dans la fonction de réducteur, nous utilisons List à partir d'immuable.js pour créer l'état initial de l'application.

 // ... code réducteur ...
Copier après la connexion
Copier après la connexion

Considérez List comme un tableau JavaScript, c'est pourquoi nous pouvons utiliser la méthode .push() à state . La valeur utilisée pour mettre à jour l'état est un objet, ce qui indique que Map peut être reconnue comme un objet. De cette façon, il n'est pas nécessaire d'utiliser Object.assign() ou des opérateurs d'extension, car il garantit que l'état actuel ne change pas. Cela semble beaucoup plus concis, surtout lorsque les États sont imbriqués profondément - nous n'avons pas besoin d'utiliser les opérateurs d'extension partout.

L'état inchangé permet au code de déterminer rapidement si un changement s'est produit. Nous n'avons pas besoin de comparer récursivement les données pour déterminer s'il y a eu un changement. Cela dit, il est important de mentionner que vous pouvez rencontrer des problèmes de performance lorsque vous traitez avec de grandes structures de données - il y a un prix pour copier de grands objets de données.

Mais les données doivent être modifiées car sinon il n'y a pas besoin d'un site ou d'une application dynamique. Ce qui est important, c'est comment changer les données. L'invariance fournit la bonne façon de modifier les données d'application (ou l'état). Cela permet de suivre les modifications de l'état et de déterminer les parties de l'application doit être renvoyée en raison de ce changement.

L'apprentissage de l'immuabilité pour la première fois peut être déroutant. Cependant, lorsque l'État mute, vous rencontrerez une erreur qui apparaît, ce qui vous rendra meilleur. C'est généralement le moyen le plus clair de comprendre les besoins et les avantages de l'invariance.

Dès la lecture

  • Invariance dans React et Redux
  • Immutable.js 101 - Cartes et listes
  • Utilisation d'immuable.js avec redux

Notez que puisque le texte d'origine contient un grand nombre de blocs de code, afin de maintenir la pseudo-originalité et d'éviter une répétition excessive, j'ai simplifié la description de certains blocs de code et fait des synonymes et des tw-tweaks de phrase à certaines déclarations. Le format d'image reste le même.

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

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

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)

Travailler avec GraphQL Caching Travailler avec GraphQL Caching Mar 19, 2025 am 09:36 AM

Si vous avez récemment commencé à travailler avec GraphQL ou examiné ses avantages et ses inconvénients, vous avez sans aucun doute entendu des choses comme "GraphQL ne prend pas en charge la mise en cache" ou

Construire une application Ethereum à l'aide de Redwood.js et de la faune Construire une application Ethereum à l'aide de Redwood.js et de la faune Mar 28, 2025 am 09:18 AM

Avec la récente montée du prix du bitcoin sur 20k $ USD, et pour lui, récemment en train de briser 30k, je pensais que cela valait la peine de reprendre une profonde plongeon dans la création d'Ethereum

Créer votre propre bragdoc avec Eleventy Créer votre propre bragdoc avec Eleventy Mar 18, 2025 am 11:23 AM

Quelle que soit le stade dans lequel vous vous trouvez en tant que développeur, les tâches que nous effectuons - qu'elles soient grandes ou petites - ont un impact énorme dans notre croissance personnelle et professionnelle.

Vue 3 Vue 3 Apr 02, 2025 pm 06:32 PM

Il est sorti! Félicitations à l'équipe Vue pour l'avoir fait, je sais que ce fut un effort massif et une longue période à venir. Tous les nouveaux documents aussi.

Pouvez-vous obtenir des valeurs de propriété CSS valides du navigateur? Pouvez-vous obtenir des valeurs de propriété CSS valides du navigateur? Apr 02, 2025 pm 06:17 PM

J'ai eu quelqu'un qui écrivait avec cette question très légitime. Lea vient de bloguer sur la façon dont vous pouvez obtenir les propriétés CSS valides elles-mêmes du navigateur. C'est comme ça.

Un peu sur CI / CD Un peu sur CI / CD Apr 02, 2025 pm 06:21 PM

Je dirais que "Site Web" correspond mieux que "Application mobile" mais j'aime ce cadrage de Max Lynch:

Comparaison des navigateurs pour une conception réactive Comparaison des navigateurs pour une conception réactive Apr 02, 2025 pm 06:25 PM

Il existe un certain nombre de ces applications de bureau où l'objectif montre votre site à différentes dimensions en même temps. Vous pouvez donc, par exemple, écrire

Cartes empilées avec un positionnement collant et une pincée de sass Cartes empilées avec un positionnement collant et une pincée de sass Apr 03, 2025 am 10:30 AM

L'autre jour, j'ai repéré ce morceau particulièrement charmant sur le site Web de Corey Ginnivan où une collection de cartes se cassent les uns sur les autres pendant que vous faites défiler.

See all articles