web-dev-qa-db-fra.com

Comment définir plusieurs champs à la fois dans Immutable.js Record?

En regardant this , je pense que immuable. Record est la structure de données pour représenter les "objets immuables en javascript", mais je souhaite mettre à jour plusieurs champs à la fois sans créer plusieurs objets appelant un ensemble à chaque fois.

Je veux faire quelque chose comme ça

class LoginContext extends Immutable.Record(
{ logged : false, loading: false, error: false, user: null}){
}

var loginContext = new LoginContext()

var anotherContext = loginContext.set({'logged':'true', 'error':'false'})

I read que vous ne pouvez pas transmettre d'objet à Record.set () pour la cohérence de l'API:

Cohérence avec les autres utilisations de set à la fois dans cette bibliothèque et dans ES6. Les ensembles Map and Set ne peuvent pas accepter un objet, car leurs clés peuvent être n'importe quoi, pas seulement des chaînes. Les enregistrements doivent avoir des chaînes, mais il était important de maintenir la cohérence de l'API.

Et je sais que je pourrais utiliser:

var anotherContext = loginContext.withMutations(function (record) {  
  record.set('logged','true').set('error','true'); 
});

Il y a une autre façon ou j'utilise mal Record?

53
gabrielgiussi

Personnellement, je préfère la syntaxe de fusion, cela semble plus naturel:

const newContent = oldContext.merge({
    "logged": true, 
    "error": false
});

Si vous faisiez quelque chose de très complexe, peut-être que la version transitoire serait meilleure, mais je ne peux tout simplement pas imaginer où.

Cela signifie également que vous pouvez utiliser mergeDeep si nécessaire.

48
Chris

Pour répondre à votre question initiale, nous utiliserons .withMutations()

Voici un extrait de la documentation:

L'application d'une mutation pour créer un nouvel objet immuable entraîne une surcharge, ce qui peut entraîner une pénalité de performance mineure. Si vous devez appliquer localement une série de mutations avant de revenir, Immutable vous permet de créer une copie temporaire temporaire (transitoire) d'une collection et d'appliquer un lot de mutations de manière performante à l'aide de withMutations. En fait, c'est exactement comme cela que Immutable applique les mutations complexes elles-mêmes.

Donc, vous pouvez écrire quelque chose le long des lignes:

loginContext.withMutations((ctx) => {
    ctx.set('logged', true).set('error', false)
});

En plus de cela, je pensais que Records pouvait également être utilisé avec la notation JS ordinaire.

Bonne chance!

24
RemEmber

Pourquoi ne pas simplement enchaîner plusieurs ensembles? Ainsi:

ImmutableObj.set('key', 'value')
.set('key2', 'value2')
.set('key3', 'value3'); 
14
James111

Vous devriez faire certaines choses différemment. Premièrement, n’étendez pas Immutable.Record mais utilisez le constructeur:

var LoginContext = Immutable.Record({
  logged:false,
  loading:false,
  user: null  
}, 'LoginContext');

Ceci retourne une classe que vous pouvez instancier avec un objet:

var anotherContext = new LoginContext({logged:true, error:false});
1
MattW.