Napotkałem problem polegający na tym, że muszę przechowywać wartości początkowe obiektu chwili, ale mam pewne problemy z zapobieganiem zmianie mojej zmiennej wraz z oryginalnym obiektem.
Niestety Object.freeze () nie działa, ponieważ moment.js zwraca błąd „Nieprawidłowa data”, gdy próbuję to sformatować.
javascript
object
immutability
momentjs
mutability
Shengbo1618
źródło
źródło
Odpowiedzi:
W NPM jest wtyczka Moment.js o nazwie frozen-moment - możesz użyć
moment().freeze()
zamiastObject.freeze(moment())
.W przeciwnym razie vanilla Moment.js ma
clone
metodę, która powinna pomóc ci uniknąć problemów ze zmiennością, więc możesz zrobić coś takiego:AKTUALIZACJA:
Minęły dwa lata, odkąd napisałem tę odpowiedź. W tym czasie pojawiła się kolejna biblioteka do pracy z datami i zyskała dużą popularność: https://date-fns.org/
Ta biblioteka jest domyślnie niezmienna i jest zgodna z modułową, funkcjonalną architekturą, co oznacza, że lepiej nadaje się do wstrząsania drzewem i tworzenia pakietów po stronie klienta. Jeśli pracujesz nad projektem, który w znacznym stopniu wykorzystuje Webpack po stronie klienta i zauważysz, że Moment.js sprawia problemy z twoją kompilacją, a nawet jeśli zmienność Moment.js powoduje wiele bólu głowy, to powinien
date-fns
spróbować.źródło
moment
zmienną bez jej mutowania: po prostu użyj clone () w ten sposób:zz = moment(); zz.clone().add(3, 'h').toISOString();
date-fns
od jakiegoś czasu, ale od tego czasu musiałem wskoczyć do starszego kodu za pomocą Moment and boy, czy ten post uratował mnie przed wyskoczeniem z okna.dayjs
jest również dobrą alternatywą, ponieważ ma interfejsy API podobne do Moment.js z niezmiennym charakterem. (Od marca 2019 roku brakuje obsługi stref czasowych, ale jest to dość nowa biblioteka i widzę, że prace trwają.)To stare pytanie i przeprosiny za bezwstydną autopromocję, ponieważ nie jest to moim zamiarem, mam tylko nadzieję, że komuś pomoże.
Oprócz tego, co mówi razorbeard (
.clone()
itp.), Stworzyłem moduł NPM, który dołącza niezmienne metody do wszystkiego, co Moment.js jest dostarczane po wyjęciu z pudełka. Celem nie jest przerywanie istniejącego kodu, więc moduł dodaje nowe metody zImmu
dopiskiem do jego nazwy.Każda instancja zwrócona przez chwilę fabryka będzie udekorowana niezmiennymi metodami, np.
moment().startOf()
Będzie miała odpowiedniestartOfImmu()
,add()
będzie miałaaddImmu()
itd. Każda z nich zwraca nowy moment zamiast modyfikować istniejący. Aby z niego skorzystać, wystarczy przejść przezmoment
fabrykę,momentImmutableMethods
aby uzyskać dostęp do nowych niezmiennych metod. Przykład:Jest na NPM pod adresem https://www.npmjs.com/package/moment-immutable-methods
źródło