Svelte: Almacenar datos sin reactividad cuando el componente modifica los datos y viceversa.
Estoy seguro de que esto es una solución muy fácil, pero tengo un problema en el que configuro una tienda modificable, y es en su mayoría reactiva, excepto cuando un componente cambia los datos, la reactividad en el archivo App no se activa y viceversa. Aquí está el código:
App.svelte:
<script>
import { data } from './store.js'
import Component from './Component.svelte'
let localData
data.subscribe((value) => {
localData = value;
});
</script>
<h2>En App.svelte</h2>
<p>Hola {localData.name}!</p>
<input name="name" type="text" bind:value="{localData.name}">
<p>
{localData.details.number}
</p>
<h2>En Component.svelte</h2>
<component></component>
<code>
Component.svelte:
</code>
<script>
import { data } from './store.js'
let localData
data.subscribe((value) => {
localData = value;
});
</script>
<input type="number" bind:value="{localData.details.number}">
<p>Hola {localData.name}!</p>
<p>{localData.details.number}</p>
<code>
store.js:
</code>
import { writable } from 'svelte/store'
export let data = writable({
name: 'Bob Smith',
details: {
dob: '1982/03/12',
favoriteFoods: ['apples', 'pears', 'bourbon'],
number: 1
},
})
Y, si quieres usarlo en el Svelte REP: https://svelte.dev/repl/164227336d6c4cc29f7ea0a15e89c584?version=3.44.3
davy.ai
Solución
El problema con el código es que la variable
localData
definida tanto enApp.svelte
como enComponent.svelte
solo se actualiza cuando cambiadata
, pero no al revés. Esto significa que silocalData
se actualiza enApp.svelte
, los cambios no se verán reflejados enComponent.svelte
y viceversa.Para solucionar este problema, podemos eliminar las variables locales
localData
y utilizar directamente el almacéndata
tanto enApp.svelte
como enComponent.svelte
.Aquí está el código actualizado de
App.svelte
:Y aquí está el código actualizado de
Component.svelte
:Al utilizar el símbolo
$
antes dedata
, podemos acceder directamente al valor actual del almacén, el cual es reactivo y siempre está actualizado. Esto asegura que cualquier cambio realizado endata
se refleje inmediatamente tanto enApp.svelte
como enComponent.svelte
.Espero que esto ayude. Hazme saber si tienes alguna otra pregunta.