Contents

Compreender a gestão de estados em aplicações Svelte

A gestão de estados é uma parte importante de todas as aplicações Web modernas. Cada uma das principais estruturas de desenvolvimento web, como React e Vue, tem formas diferentes de lidar com o estado.

O Svelte não escapa ao desafio de gerir o estado, e a biblioteca apresenta várias estratégias para abordar esta questão.

O que é gerenciamento de estado e por que é importante?

No domínio do desenvolvimento Web, o termo “estado” refere-se a informações que representam o estado atual de uma determinada página Web ou dos seus elementos constituintes. Para ilustrar este conceito, considere a criação de um mercado online onde os utilizadores podem procurar mercadorias, adicionar itens seleccionados aos seus carrinhos de compras virtuais e concluir transacções através do processamento de pagamentos.

Para apresentar sempre a quantidade exacta de artigos num ícone de carrinho de compras, independentemente da página Web visualizada, a gestão de estados pode ser uma ferramenta indispensável. Esta abordagem garante que o carrinho ajusta dinamicamente o seu conteúdo em tempo real à medida que os utilizadores adicionam ou removem itens, independentemente da sua localização no sítio Web.

A gestão eficaz do estado desempenha um papel crucial na manutenção da organização e da coerência dos dados nos vários componentes de uma aplicação. Isto contribui, em última análise, para uma experiência de utilizador simplificada e sem falhas que minimiza a confusão e o agravamento.

Gerenciamento de Estado no Svelte

Em essência, pode-se utilizar o sinal de igual (’=’) no Svelte para delinear e modificar uma variável de estado. A título de ilustração, suponha que se deseja que o conteúdo de um elemento h1 reflita uma variável de estado específica; pode-se implementar isso da seguinte forma:

 <script>
let count = 0;
</script>

<h1>
{count}
</h1>

<button on:click={()=>count=count \\+ 1}> Increase Count </button>

O trecho de código fornecido declara uma propriedade nomeada, count , e inicializa seu valor em zero. Além disso, anexa uma instrução que atribui o valor atual de count à etiqueta do elemento HTML. Por fim, um ouvinte de eventos é anexado a um botão, o que permite aos utilizadores aumentar o estado de count quando clicam no referido botão.

via GIPHY

Atualização de uma variável de estado de matriz em Svelte

De facto, examinemos o trecho de código que se segue em pormenor:

 <script>
  let todoList = [
    "Read my books",
    "Eat some foods",
    "Bath the dogs",
    "Take out the garbage",
  ];

  function removeLastItem() {
    todoList.pop();
  }
</script>

<ul>
  {#each todoList as item}
    <li>{item}</li>
  {/each}
</ul>

<button on:click={() => removeLastItem()}> Remove last item</button>

O fragmento de código fornecido estabelece uma correspondência entre a variável de estado “todoList” e uma estrutura de dados de matriz. Ao clicar no botão “Remover último item”, o sistema executa a função “removeLastItem()”, que elimina o elemento mais recente da variável “todoList”.

De facto, se executarmos este código num navegador Web e interagirmos com ele clicando no elemento destinado a eliminar o último item, nenhuma alteração se reflectirá na lista apresentada.

via GIPHY

Para evitar possíveis problemas de desempenho que podem surgir ao utilizar o operador “=” em conjunto com um método de manipulação de array como “.pop()” no contexto de um aplicativo Svelte, é possível empregar uma estratégia alternativa renderizando recursivamente toda a estrutura da lista por meio de um processo conhecido como “reatribuição”. Isto envolve a atualização da referência do objeto de dados original para apontar para si próprio, levando assim a estrutura a reavaliar e atualizar a sua apresentação com base no estado modificado das variáveis associadas.

 function removeLastItem() {
  todoList.pop();
  // Assign the updated array to itself
  todoList = todoList;
 }

Ao executar o código num navegador Web, espera-se que a matriz de estado seja actualizada como pretendido ao clicar no botão designado.

via GIPHY

Gerenciando estado com Svelte Stores

No Svelte, os stores são utilizados para facilitar o compartilhamento de estado entre componentes não conectados através de um sistema reativo. Essencialmente, uma loja é um objeto que pode ser subscrito utilizando o método subscribe , permitindo que os componentes monitorizem as actualizações feitas aos seus dados. Para criar uma loja de leitura e escrita simples, é necessário importar a função writable do módulo JavaScript svelte/store , como demonstrado abaixo:

 import { writeable } from "svelte/store"

Certamente, imagine por um momento que se tem um script store.js que engloba os seguintes conteúdos:

 import { writable } from "svelte/store";

export const todoList = writable([
    "Read my books",
    "Eat some foods",
    "Bath the dogs",
    "Take out the garbage",
    "Water the flowers"
]);

O código fornecido cria uma constante nomeada chamada “todoList” e fornece uma matriz como entrada para um objeto legível. Consequentemente, podemos agora introduzir o domínio de armazenamento em qualquer constituinte que requeira a sua utilidade:

 <script>
import { todoList } from "./store";
</script>

Para aceder a uma instância específica de um objeto dentro de uma classe em Python, podemos utilizar o método __getitem__ ou subscription . Isto permite a recuperação e manipulação direta dos dados desejados sem ter de navegar através de vários níveis de aninhamento na hierarquia de classes.

 let list;

todoList.subscribe((items)=>{
    list = items;
})

A função de retorno de chamada associada ao método subscribe aceita um valor de armazenamento atual como parâmetro de entrada e atribui-o à variável local items . Consequentemente, é possível apresentar cada item da matriz list utilizando a sintaxe fornecida.

 <ul>
  {#each list as item}
    <li>{item}</li>
  {/each}
</ul>

Para modificar o valor de um armazém, pode utilizar o método update() . Este método inclui uma função de retorno de chamada que aceita o valor atual do armazém como entrada e devolve o elemento atualizado que o deve substituir.

 todoList.update((items) => {
  items.pop();
  return items;
});

Criando Stores Somente Leitura no Svelte

Em certas situações, pode ser necessário limitar a capacidade de um componente de modificar dados em um store específico, convertendo sua conexão para o modo somente leitura. Isto pode ser conseguido utilizando a função readable que serve como um modificador de acesso para a interação do componente com o armazém.

 import { readable } from 'svelte/store';

export const todoList = readable([
    "Read my books",
    "Eat some foods",
    "Bath the dogs",
    "Take out the garbage",
    "Water the flowers"
]);

A indisponibilidade do método update() nos valores do armazém só de leitura obriga a evitar certas operações, como a tentativa de modificar o seu conteúdo através do referido método, o que provocaria um erro de execução.

 function removeLastItem() {
  todoList.update((items) => {
    items.pop();
    return items;
  });
}

Usando Stores com a API de Contexto

O Svelte fornece uma API de Contexto, que pode ser utilizada importando a função setContext do módulo ‘svelte’. Isto permite aos programadores criar e gerir valores de contexto nas suas aplicações de forma mais eficiente.

 import {setContext} from "svelte"

Para transferir informações de um componente de nível superior para um componente de nível inferior, uma abordagem comum é utilizar props ou atributos na marcação HTML do componente filho. Isso permite que o componente pai forneça os detalhes e instruções necessários ao componente filho para que ele funcione de forma eficaz.

 // Parent Component
<script>
let age = 42;
</script>

<ChildComponent age={age} />

A utilização da API de contexto permite a comunicação efectiva entre vários componentes de uma aplicação, evitando a necessidade de transmitir dados através de variáveis intermédias. Um mecanismo comparável é fornecido pelo React usando o gancho useContext . Para tornar um valor de contexto reativo no Svelte, é necessário passar o valor de armazenamento correspondente para o contexto.

No componente pai, é possível encontrar uma representação estrutural como a seguinte:

 <script>
  import { writable } from "svelte/store";
  import Component2 from "./Component2.svelte";
  import { setContext } from "svelte";

  let numberInStore = writable(42);
  setContext("age", numberInStore);
</script>

<ChildComponent />
<button on:click={() => $numberInStore\\+\\+}>Increment Number</button>

O trecho de código fornecido mostra uma instância de uma loja sendo passada como argumento para a função setContext junto com uma chave específica, ‘idade’. No âmbito do desenvolvimento do Svelte, é permitido aceder ao valor de uma determinada variável de loja acrescentando um sinal de dólar (’$’) antes da designação da loja.

Um componente filho pode aceder ao valor de contexto fornecido pelo seu componente pai através da utilização da função getContext , que requer a especificação de uma chave apropriada para uma recuperação bem sucedida.

 <script>
  import { getContext } from "svelte";
  let userAge = getContext("age");
</script>

<h1>
    {$userAge}
</h1>

Gerenciamento de estado no Svelte vs. React

O processo de gerenciamento de estado no Svelte é simplificado em comparação com sua contraparte no React, exigindo nada mais do que a utilização de um sinal de igual (=) para definir e atualizar o estado. Isto contrasta com as estruturas de desenvolvimento web, como o React, que necessitam da implementação de funcionalidades como useState e useReducer para resolver desafios básicos de gestão de estado.

A utilização de técnicas avançadas de gestão de estados é um aspeto fundamental no desenvolvimento de software, particularmente no domínio das aplicações Web. Existem vários métodos para facilitar esse esforço, como a implementação da React Context API ou ferramentas externas como Redux e Zustand. No entanto, no que diz respeito ao framework Svelte, ele oferece seus próprios mecanismos internos que efetivamente eliminam a necessidade de suporte adicional por meio de bibliotecas de terceiros. Isso é conseguido aproveitando o poder do Svelte Stores e a incorporação da API de contexto do Svelte.