Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

175
Visualizações
¿Por qué mi esbelto bloque {#each} no es reactivo?

Básicamente, estoy jugando con Svelte tratando de activar una aplicación rápida, los detalles de la aplicación no son importantes, pero básicamente alberga un montón de sitios integrados. ver ejemplo aquí y para la replicabilidad:

https://svelte.dev/repl/6f3484554ef8489b9a5960487a0a1f95?version=3.47.0

Mi problema es que cuando agrego una nueva URL y título a la lista de sitios, el bloque {#each} que crea las vistas incrustadas no se actualiza para reflejar el nuevo estado de la lista, aunque la lista se actualiza claramente en el salida de la consola. ¿Tiene algo que ver con el alcance o es un problema de Svelte de no activar la reactividad en las reasignaciones de accesorios de los componentes?

Actualización: algunos sitios no permiten la incrustación, así que use https://wikipedia.org como un sitio seguro para realizar pruebas.


si reemplaza una URL codificada en la lista de sitios con la dirección wiki, debería funcionar bien. básicamente quiero que aparezca una nueva ventana ya que el bloque {#each} crea un nuevo componente SiteView

about 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Hay varios problemas con su código, el primero es que no propaga los cambios realizados en la matriz de sites a la aplicación principal, debe usar bind: para mantener las dos matrices sincronizadas.

 <InputBar bind:sites {site} />

La segunda es que está modificando un objeto cuando agrega un nuevo sitio y luego agrega ese objeto a la matriz, este siempre será el mismo objeto, por lo que si lo cambia, los sitios agregados anteriormente también cambiarán. Puede resolver esto distribuyendo el nuevo objeto en la matriz en su lugar:

 function add() { sites = sites.concat({...site}); console.log(sites)} // or alternatively function add() { sites = [...sites, {...site}]; console.log(sites); }

Dicho esto, la aplicación no es muy "Svelte" , ya que mezcla responsabilidades y expone datos a componentes que no necesitan esos datos. Por ejemplo, ¿por qué la barra de entrada necesita saber acerca de los sitios actuales? Sería mucho mejor que la barra de entrada fuera solo eso, una barra de entrada. Cuando el usuario hace clic en 'agregar', genera un evento que dice 'algo se ha agregado' y restablece los campos. Luego, el padre es responsable de agregarlo a la matriz. Esto hará que la solución sea más flexible. Si lo hace, verá que tampoco hay razón para tener una variable de 'sitio' en el nivel superior (o incluso tener ese objeto, solo puede tener dos campos)

 <script> import { createEventDispatcher } from 'svelte' let url = '' let title = '' const dispatch = createEventDispatcher() function add() { dispatch('add', { url, title }) url = '' title = '' } </script> <div class="rounded"> <p>Enter a site to stream:</p> <input type="text" placeholder="www.example.com" bind:value={url}> <br> <input type="text" placeholder="example" bind:value={title}> <button on:click={add}>add</button> </div>
 <InputBar on:add={(ev) => sites = [...sites, ev.detail]} />

En una nota final, para agregar cosas al encabezado del html, use <svelte:head> en su lugar.

about 4 years ago · Santiago Trujillo Relatório

0

Si desea cambiar un valor de otro componente, debe bind la propiedad; de lo contrario, la relación es unidireccional (del componente principal al secundario).

 <InputBar bind:sites {site}/>
about 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda