J'ai rencontré un problème où je dois stocker les valeurs initiales d'un objet moment mais j'ai du mal à empêcher ma variable de changer avec l'objet d'origine.
Malheureusement, Object.freeze () ne fonctionne pas, car moment.js renvoie une erreur "Date invalide" lorsque j'essaye de formater cela.
javascript
object
immutability
momentjs
mutability
Shengbo1618
la source
la source
Réponses:
Il existe un plugin Moment.js sur NPM appelé Frozen -moment - Vous pouvez utiliser
moment().freeze()
à la place deObject.freeze(moment())
.Sinon, vanilla Moment.js a une
clone
méthode qui devrait vous aider à éviter les problèmes de mutabilité, vous pouvez donc faire quelque chose comme ceci:METTRE À JOUR:
Cela fait deux ans que j'ai écrit cette réponse. À cette époque, une autre bibliothèque pour travailler avec les dates a fait surface et a gagné beaucoup de popularité: https://date-fns.org/
Cette bibliothèque est immuable par défaut et suit une architecture modulaire et fonctionnelle, ce qui signifie qu'elle est mieux adaptée à l'arborescence et au regroupement côté client. Si vous travaillez sur un projet qui utilise largement Webpack côté client et que Moment.js vous pose des problèmes avec votre build, ou même si la mutabilité de Moment.js vous cause beaucoup de maux de tête, alors vous devrait
date-fns
essayer.la source
moment
variable stockée sans la muter: utilisez simplement clone () comme ceci:zz = moment(); zz.clone().add(3, 'h').toISOString();
date-fns
depuis un moment maintenant, mais j'ai depuis dû sauter dans le code hérité en utilisant Moment and boy, est-ce que cet article m'a évité de sauter par une fenêtre.dayjs
est également une bonne alternative car il possède des API similaires à Moment.js avec une nature immuable. (En mars 2019, il ne prend pas en charge le fuseau horaire, mais il s'agit d'une bibliothèque assez récente et je peux observer que le travail est en cours.)C'est une vieille question et des excuses pour l'auto-promotion éhontée car ce n'est pas mon intention, j'espère juste que cela aidera quelqu'un.
En plus de ce que dit razorbeard (
.clone()
etc.), j'ai créé un module NPM qui attache des méthodes immuables à tout ce que Moment.js est livré avec. L'intention n'est pas de casser le code existant afin que le module ajoute de nouvelles méthodes avecImmu
en plus son nom.Chaque instance retournée par moment factory sera décorée avec des méthodes immuables, par exemple
moment().startOf()
aura correspondantstartOfImmu()
,add()
auraaddImmu()
etc. Chacune de ces instances renvoie un nouveau moment plutôt que de modifier l'existant. Pour l'utiliser, il suffit de passermoment
factory àmomentImmutableMethods
pour accéder à de nouvelles méthodes immuables. Exemple:C'est sur NPM à https://www.npmjs.com/package/moment-immutable-methods
la source