Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

105
Views
Immer: mutar objeto anidado recién creado

Estoy usando immer (a través de createSlice en redux-toolkit ) para administrar el estado en una aplicación redux. He escrito un reductor que toma una carga útil de pistas de música y las agrega a la biblioteca de los usuarios. En parte, este reductor también debe crear entradas de artistas para cada una de las pistas.

 createTracks(draft, action: PayloadAction<{ tracks: Array<ITrack> | ITrack; }>) { ... tracks.forEach((track, index) => { ... // Check to see if artist exists, if not create, if so, add this track let artist = draft.artists[artistId]; if (!artist) { console.log("creating artist", track.artist); draft.artists[artistId] = produce({ name: track.artist, albums: [], id: artistId, tracks: [track.id] }, (artistDraft): IArtist => { console.log("producing the artist"); return artistDraft; }); } else { console.log("updating artist"); draft.artists[artistId].tracks.push(track.id); }

Esto funciona bien para las primeras pistas de cada artista. Sin embargo, cuando immer crea cada nuevo objeto de artista y lo agrega al estado, hace que la matriz de pistas para cada objeto no sea extensible.

 Uncaught TypeError: Cannot add property 1, object is not extensible

es arrojado desde

 draft.artists[artistId].tracks.push(track.id);

Supuse que esto se debe a que no estoy creando correctamente el borrador del artista anidado o redux no admite este comportamiento. Es por eso que cambié de usar un objeto puro a un borrador de inmersión anidado, pero esto no pareció funcionar.

tambien he probado...

 draft.artists[artistId].tracks = [...draft.artists[artistId].tracks, track.id];

... pero en este caso, la propiedad tracks es de solo lectura.

¿Cómo puedo implementar esto sin el error?

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Finalmente rastreé esto. Mis reductores se escribieron correctamente, pero más arriba en la pila estaba importando accidentalmente combineReducers de redux-immer en lugar de redux en sí. redux-immer es una biblioteca para integrar immer en redux.

Esto resultó en ejecutar mi tienda a través de immer dos veces (una vez a través createSlice y otra a través combineReducers ), lo que causó... comportamientos... inesperados, incluido el bloqueo de immer, lo que provocó que los objetos descritos anteriormente se bloquearan.

Seguro que ha sido una forma divertida de pasar las últimas dos semanas.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!