// states.svelte.js
export let name = $state("John"); // a state to be shared by multiple components
<!-- Component.svelte -->
<script>
import { name } from "./states.svelte.js";
</script>
<p>Hello, my name is <input type="text" bind:value={name} /></p>
Ao migrar para o svelte5, tento substituir um armazenamento gravável por um $state , mas recebo erro Cannot bind to import (https://svelte.dev/e/constant_binding)
.
Qual é a maneira correta de fazer isso?
Só posso dar a solução, mas não o porquê : ao usar runas para estado compartilhado, elas devem estar em um objeto:
e:
Infelizmente, os documentos não deixam claro que isso é necessário e por quê. Eu também estaria interessado em entender se é uma imposição técnica ou filosófica. Eu sei que observáveis não funcionam bem com valores primitivos, pois são copiados por valor, então pode ser técnico.
Você não pode modificar primitivos e as importações são tratadas como constantes, então o valor precisa ser encapsulado, então você pode modificar a propriedade que contém o valor, por exemplo
Então vincule a
name.current
.(Para referência, veja também o
svelte/reactivity/window
módulo , ele expõe vários primitivos, cada um em um objeto com umacurrent
propriedade para preservar a reatividade.)