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

143
Views
Rendimiento esbelto: derivado de tiendas personalizadas de arreglos

Estoy haciendo un clon de Trello en Svelte usando tiendas personalizadas y derivadas. Esbeltos relojes de reactividad para la asignación , por lo que necesito reasignar mis almacenes de matriz, pero noté que las tiendas derivadas de matrices escribibles recalculan toda la matriz. Seguramente puedo tener más rendimiento aquí, especialmente si solo se actualiza un único valor de matriz.

 // The store in question, edited for terseness const cards = writeable([]); // adding to the card somewhere in code cards.update((cards) => (cards = [...cards, card])); // the derived store, that loops through all cards (because of reduce) // this groups the card by its listId const cardsGroupedByList = derived(cards, ($cards) => { return $cards.reduce((list, card) => { console.log('recalculating cards'); const data = list.get(card.listId) || []; return list.set(card.listId, [...data, card]); }, new Map()); });

En la consola, cardsGroupedByList imprimirá n veces, pero Svelte solo muestra el componente correspondiente una vez, por lo que esto es puramente manipulación de datos. ¿Hay una mejor manera de hacer esto?

Aquí hay un Svelte REPL en funcionamiento con múltiples listas y tarjetas.

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

0

Una posible solución es tener 2 tiendas personalizadas. Solo se actualiza una vez, pero definitivamente pierde la elegancia de una tienda derivada.

 // cards now need their set and add methods modified // otherwise I risk my group running out of sync export const cards = (() => { const { subscribe, set, update } = writable<Card[]>([]); return { subscribe, set: (cards: Card[]) => { cardsGroupedByList.set(cards); // set the group, reduce once set(cards); }, add: (card: Card) => { cardsGroupedByList.update(card); // add to the group update((cards) => (cards = [...cards, card])); }, }; })(); // groupBy becomes a custom store that retains internal state // run the risk of the group becoming out of sync with cards // could have issues when the card moves -- would need to add/remove or recalc export const cardsGroupedByList = (() => { const init = new Map(); const { subscribe, set, update } = writable(init); function groupBy(groups, card) { console.log('calculating groups'); // same console log, only happens once const data = groups.get(card.listId) || []; return groups.set(card.listId, [...data, card]); } return { subscribe, set: (cards: Card[]) => set(cards.reduce(groupBy, init)), update: (card) => { update((groups) => groupBy(groups, card)); }, }; })();
about 4 years ago · Juan Pablo Isaza Report

0

En su caso de uso específico, no necesita crear una tienda adicional y simplemente puede reducir en el script de la aplicación :)

App.esbelta

 <script> import { cards } from './card-store.js'; import Card from './Card.svelte'; import CardForm from './CardForm.svelte'; let cardsList $: cardsList = $cards.reduce((acc, card) => { acc[card.listId] = acc[card.listId] || [] acc[card.listId].push(card) return acc }, {}) </script> {#each [1,2,3] as idx} <h2>List: {idx}</h2> <ul> {#each cardsList[idx] as card} <Card {...card} /> {/each} </ul> <CardForm listId={idx} /> {/each}

Y elimine la entrada cardsGroupedByList de la tienda de tarjetas

editar: no estoy seguro de que esto sea muy diferente de lo que haces, ya que la estructura se vuelve a calcular cada vez de todos modos: /

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!