<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Marcus Vinicius</title>
    <description>The latest articles on Forem by Marcus Vinicius (@5ucr4m).</description>
    <link>https://forem.com/5ucr4m</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F605382%2Fef43a0a2-edfe-4ed4-9891-ffeab68903d8.jpg</url>
      <title>Forem: Marcus Vinicius</title>
      <link>https://forem.com/5ucr4m</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/5ucr4m"/>
    <language>en</language>
    <item>
      <title>Micro Frontends: Um guia completo</title>
      <dc:creator>Marcus Vinicius</dc:creator>
      <pubDate>Sun, 16 Apr 2023 14:07:00 +0000</pubDate>
      <link>https://forem.com/5ucr4m/micro-frontends-um-guia-completo-1ahp</link>
      <guid>https://forem.com/5ucr4m/micro-frontends-um-guia-completo-1ahp</guid>
      <description>&lt;p&gt;Micro frontends é uma abordagem arquitetônica para desenvolver aplicações web que divide a interface do usuário (frontend) em componentes menores e independentes. Neste artigo, vamos explorar os fundamentos dos micro frontends e como criar sua primeira aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Fundamentos
&lt;/h2&gt;

&lt;p&gt;Antes de começar a desenvolver sua primeira aplicação, é importante entender os conceitos fundamentais dos micro frontends:&lt;/p&gt;

&lt;p&gt;Componentes independentes: Cada componente é desenvolvido, testado e implantado de forma independente, permitindo que as equipes trabalhem em paralelo sem interferir no trabalho umas das outras.&lt;br&gt;
Escalabilidade: Micro frontends são projetados para lidar com o crescimento do projeto e a complexidade do código.&lt;br&gt;
Flexibilidade tecnológica: Diferentes componentes podem usar diferentes tecnologias, frameworks e bibliotecas, facilitando a experimentação e adoção de novas tecnologias.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Sua primeira aplicação
&lt;/h2&gt;

&lt;p&gt;2.1 UI Frameworks&lt;br&gt;
Escolha os frameworks de UI que você deseja usar em seus micro frontends, como React, Vue, Angular, Svelte, etc. Você pode usar diferentes frameworks para diferentes componentes ou combinar componentes de um mesmo framework.&lt;/p&gt;

&lt;p&gt;2.2 Root config&lt;br&gt;
A configuração raiz (root config) é o ponto de entrada da aplicação. Ela é responsável por carregar e gerenciar os micro frontends, definindo a lógica de montagem e desmontagem dos componentes.&lt;/p&gt;

&lt;p&gt;2.3 Routing&lt;br&gt;
O roteamento é um aspecto importante dos micro frontends, pois determina quais componentes serão exibidos com base na URL atual. Você pode usar soluções de roteamento específicas do framework ou um roteador independente, como o single-spa-router.&lt;/p&gt;

&lt;p&gt;2.4 CSS&lt;br&gt;
Para manter o isolamento entre os micro frontends, é importante gerenciar o CSS de forma eficiente. Algumas abordagens incluem o uso de CSS-in-JS, CSS Modules, ou a adoção de convenções de nomenclatura como BEM para evitar conflitos de estilo.&lt;/p&gt;

&lt;p&gt;2.5 Layout&lt;br&gt;
O layout da aplicação é responsável pela organização e posicionamento dos micro frontends na tela. Você pode criar um componente de layout dedicado ou utilizar uma biblioteca de layout como CSS Grid, Flexbox ou Bootstrap para organizar os componentes na página.&lt;/p&gt;

&lt;p&gt;2.6 Shared dependencies&lt;br&gt;
As dependências compartilhadas são bibliotecas ou recursos usados por vários micro frontends. É importante gerenciá-las de forma eficiente para evitar duplicação de código e garantir uma experiência consistente. Algumas soluções incluem o uso de um gerenciador de pacotes como Yarn ou NPM, ou a configuração de importações externas no Webpack.&lt;/p&gt;

&lt;p&gt;2.7 Compartilhando componentes, lógica e estado&lt;br&gt;
É possível compartilhar componentes, lógica e estado entre os micro frontends. Isso pode ser feito através de uma biblioteca compartilhada, ou utilizando uma solução de gerenciamento de estado global, como Redux ou Vuex.&lt;/p&gt;

&lt;p&gt;2.8 Desenvolvimento local&lt;br&gt;
O desenvolvimento local é uma parte crucial da criação de micro frontends, pois permite que as equipes trabalhem em seus componentes de forma independente e vejam as mudanças em tempo real.&lt;/p&gt;

&lt;p&gt;2.9 CLI&lt;br&gt;
A interface de linha de comando (CLI) é uma ferramenta útil para automatizar tarefas comuns no desenvolvimento de micro frontends, como criar projetos, executar testes e implantar componentes. Algumas soluções, como single-spa, fornecem sua própria CLI, enquanto outras podem ser construídas usando ferramentas populares como Yarn ou NPM scripts.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Implementando sua primeira aplicação micro frontend
&lt;/h2&gt;

&lt;p&gt;Agora que você conhece os fundamentos dos micro frontends, é hora de criar sua primeira aplicação. Siga estas etapas para começar:&lt;/p&gt;

&lt;p&gt;Planeje os componentes e escolha os frameworks de UI e outras tecnologias a serem usadas.&lt;br&gt;
Configure a aplicação principal (root config) e registre os micro frontends.&lt;br&gt;
Crie os micro frontends e configure suas dependências, roteamento e estilos.&lt;br&gt;
Adicione um componente de layout e organize os micro frontends na página.&lt;br&gt;
Gerencie as dependências compartilhadas e compartilhe componentes, lógica e estado quando necessário.&lt;br&gt;
Configure o ambiente de desenvolvimento local e use uma CLI para automatizar tarefas comuns.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Conclusão
&lt;/h2&gt;

&lt;p&gt;Os micro frontends são uma abordagem arquitetônica poderosa que permite dividir a interface do usuário em componentes menores e independentes. Ao seguir os fundamentos e as etapas descritas neste artigo, você pode criar aplicações escaláveis e flexíveis que são mais fáceis de manter e desenvolver.&lt;/p&gt;

&lt;p&gt;Lembre-se de que a adoção dos micro frontends também apresenta desafios, como a complexidade adicional na coordenação e comunicação entre os componentes e a necessidade de gerenciar várias dependências. Portanto, é fundamental considerar os prós e contras dessa abordagem antes de adotá-la em seu projeto.&lt;/p&gt;

&lt;p&gt;Na próxima etapa, vamos criar nosso primeiro projeto de micro frontend com dois componentes em React, um componente em Vue e um componente em Angular. Isso nos permitirá explorar a interoperabilidade entre diferentes frameworks e aprimorar nossa compreensão de como os micro frontends funcionam na prática. Através dessa experiência prática, você poderá avaliar melhor se os micro frontends são a escolha certa para seu projeto e sua equipe.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>react</category>
      <category>vue</category>
    </item>
    <item>
      <title>React 18 - Batching updates e Selective Rendering</title>
      <dc:creator>Marcus Vinicius</dc:creator>
      <pubDate>Sat, 01 Apr 2023 14:41:16 +0000</pubDate>
      <link>https://forem.com/5ucr4m/react-18-batching-updates-e-selective-rendering-1b1o</link>
      <guid>https://forem.com/5ucr4m/react-18-batching-updates-e-selective-rendering-1b1o</guid>
      <description>&lt;p&gt;No React 18, a estratégia de "batching updates" foi aprimorada para tornar o processo de renderização e atualização de componentes ainda mais eficiente e otimizado. O "batching updates" é uma técnica usada pelo React para agrupar várias atualizações de estado em uma única renderização, reduzindo o número total de renderizações e melhorando o desempenho da aplicação.&lt;/p&gt;

&lt;p&gt;Nas versões anteriores do React, o "batching updates" ocorria principalmente dentro de manipuladores de eventos e funções do ciclo de vida dos componentes. No entanto, fora desses contextos, o React não conseguia agrupar as atualizações, o que resultava em várias renderizações e possíveis problemas de desempenho.&lt;/p&gt;

&lt;p&gt;No React 18, a estratégia de "batching updates" foi aprimorada e agora é aplicada em todos os contextos, independentemente de onde as atualizações de estado são acionadas. Isso significa que, mesmo se você estiver atualizando o estado fora de um manipulador de eventos ou de uma função do ciclo de vida, o React irá agrupar as atualizações automaticamente, resultando em um processo de renderização mais eficiente.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo simples que ilustra o "batching updates":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useState, useEffect } from "react";

function App() {
  const [count, setCount] = useState(0);
  const [text, setText] = useState("");

  useEffect(() =&amp;gt; {
    const interval = setInterval(() =&amp;gt; {
      // Ambas as atualizações de estado serão agrupadas automaticamente
      setCount((prevCount) =&amp;gt; prevCount + 1);
      setText((prevText) =&amp;gt; prevText + ".");
    }, 1000);

    return () =&amp;gt; clearInterval(interval);
  }, []);

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;Contador: {count}&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;Texto: {text}&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, criamos um componente App que atualiza duas variáveis de estado (count e text) a cada segundo usando um intervalo. No React 18, mesmo que as atualizações de estado ocorram fora de um manipulador de eventos ou função do ciclo de vida, elas são agrupadas automaticamente, resultando em apenas uma renderização.&lt;/p&gt;

&lt;p&gt;Isso é especialmente benéfico em cenários onde várias atualizações de estado ocorrem em rápida sucessão ou simultaneamente, como em casos de carregamento de dados, atualizações em tempo real ou animações complexas. O "batching updates" aprimorado no React 18 garante um processo de renderização mais eficiente e otimizado, melhorando o desempenho da aplicação e proporcionando uma experiência de usuário mais fluida e responsiva.&lt;/p&gt;

&lt;p&gt;O "batching updates" aprimorado no React 18 também é compatível com a API de Transitions (&lt;a href="https://dev.to/5ucr4m/react-18-transitions-3ljh"&gt;expliquei nesse artigo&lt;/a&gt;), permitindo que você gerencie animações e transições de forma mais eficiente em conjunto com as atualizações de estado agrupadas. Isso resulta em uma maior capacidade de resposta da interface do usuário e em um melhor desempenho geral da aplicação.&lt;/p&gt;

&lt;p&gt;É importante notar que, embora o "batching updates" aprimorado no React 18 seja automático na maioria dos casos, você ainda pode usar a função ReactDOM.unstable_batchedUpdates para forçar o agrupamento de atualizações de estado em casos muito específicos. No entanto, essa função deve ser usada com cautela e somente quando estritamente necessário, pois o uso indevido pode levar a comportamentos inesperados ou problemas de desempenho.&lt;/p&gt;

&lt;p&gt;Em resumo, o aprimoramento do "batching updates" no React 18 garante uma renderização mais eficiente e otimizada em todos os contextos, independentemente de onde as atualizações de estado ocorram. Isso melhora o desempenho geral das aplicações e proporciona uma experiência de usuário mais fluida e responsiva. Como desenvolvedor, você pode se beneficiar dessa melhoria simplesmente atualizando para o React 18 e aproveitando os novos recursos e melhorias sem a necessidade de mudanças significativas no seu código.&lt;/p&gt;

&lt;p&gt;Falando um pouco agora sobre a Selective Rendering, é uma técnica de otimização no React que envolve a escolha consciente de quais partes da aplicação devem ser atualizadas e renderizadas em resposta a uma mudança de estado. Isso pode melhorar significativamente o desempenho da aplicação e a experiência do usuário, especialmente em casos de atualizações frequentes ou complexas.&lt;/p&gt;

&lt;p&gt;No React 18, a Selective Rendering pode ser alcançada usando a API de Transitions e o conceito de "priorização de renderização" que foi introduzido com a nova versão.&lt;/p&gt;

&lt;p&gt;Com a priorização de renderização, você pode controlar quais atualizações de estado são consideradas de alta prioridade e quais são de baixa prioridade, permitindo que o React adie atualizações de baixa prioridade se necessário. Isso é especialmente útil em cenários onde há várias atualizações ocorrendo simultaneamente ou em rápida sucessão.&lt;/p&gt;

&lt;p&gt;Para implementar a Selective Rendering no React 18, você pode usar o hook useTransition. O useTransition permite que você controle e priorize a renderização de componentes e atualizações de estado, ajudando a criar experiências de usuário mais suaves e responsivas.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo básico de como usar o useTransition para implementar a Selective Rendering:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useState, useTransition } from "react";

function App() {
  const [data, setData] = useState(null);
  const [background, setBackground] = useState("#fff");
  const [startTransition, isPending] = useTransition();

  const fetchData = async () =&amp;gt; {
    startTransition(() =&amp;gt; {
      setData(null);
    });

    const response = await fetch("/api/data");
    const result = await response.json();

    startTransition(() =&amp;gt; {
      setData(result);
    });
  };

  const changeBackground = () =&amp;gt; {
    setBackground((prevBackground) =&amp;gt; (prevBackground === "#fff" ? "#f0f0f0" : "#fff"));
  };

  return (
    &amp;lt;div style={{ background }}&amp;gt;
      &amp;lt;button onClick={fetchData}&amp;gt;Carregar dados&amp;lt;/button&amp;gt;
      {isPending &amp;amp;&amp;amp; &amp;lt;p&amp;gt;Carregando...&amp;lt;/p&amp;gt;}
      {data &amp;amp;&amp;amp; &amp;lt;div&amp;gt;{JSON.stringify(data)}&amp;lt;/div&amp;gt;}
      &amp;lt;button onClick={changeBackground}&amp;gt;Alterar plano de fundo&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, a função fetchData é chamada quando o usuário clica no botão "Carregar dados". A transição é iniciada com a função startTransition e, enquanto a transição estiver ativa, o componente exibirá "Carregando...". Quando a transição terminar e os dados forem carregados, o componente exibirá os dados na tela.&lt;/p&gt;

&lt;p&gt;A função changeBackground é chamada quando o usuário clica no botão "Alterar plano de fundo". Embora essa atualização de estado não esteja usando o useTransition, ela ainda será renderizada de forma eficiente devido à priorização de renderização introduzida no React 18.&lt;/p&gt;

&lt;p&gt;A Selective Rendering no React 18 permite que os desenvolvedores criem experiências de usuário mais fluidas e otimizadas, oferecendo maior controle sobre o processo de renderização e atualização dos componentes.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>React 18 - Transitions</title>
      <dc:creator>Marcus Vinicius</dc:creator>
      <pubDate>Mon, 27 Mar 2023 13:11:56 +0000</pubDate>
      <link>https://forem.com/5ucr4m/react-18-transitions-3ljh</link>
      <guid>https://forem.com/5ucr4m/react-18-transitions-3ljh</guid>
      <description>&lt;p&gt;No React 18, foi introduzido um novo recurso chamado Transitions. Transitions é uma API que permite aos desenvolvedores gerenciar animações e transições durante as renderizações, de forma a evitar que o usuário perceba interrupções ou atrasos ao interagir com a interface.&lt;/p&gt;

&lt;p&gt;As Transitions do React 18 ajudam a criar experiências de usuário mais suaves e responsivas, permitindo que os desenvolvedores controlem e priorizem a renderização de componentes e atualizações de estado. Isso é especialmente útil quando há muitas mudanças no DOM, como em casos de carregamento de dados, atualizações em tempo real ou animações complexas.&lt;/p&gt;

&lt;p&gt;A API de Transitions introduz o hook useTransition, que pode ser usado para definir e controlar uma transição. O useTransition retorna um array com dois elementos: o primeiro é uma função que pode ser usada para iniciar uma transição, e o segundo é um booleano que indica se a transição está ativa ou não.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo básico de como usar o useTransition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useState, useTransition } from "react";

function App() {
  const [data, setData] = useState(null);
  const [startTransition, isPending] = useTransition();

  const fetchData = async () =&amp;gt; {
    startTransition(() =&amp;gt; {
      setData(null);
    });

    const response = await fetch("/api/data");
    const result = await response.json();

    startTransition(() =&amp;gt; {
      setData(result);
    });
  };

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;button onClick={fetchData}&amp;gt;Carregar dados&amp;lt;/button&amp;gt;
      {isPending &amp;amp;&amp;amp; &amp;lt;p&amp;gt;Carregando...&amp;lt;/p&amp;gt;}
      {data &amp;amp;&amp;amp; &amp;lt;div&amp;gt;{JSON.stringify(data)}&amp;lt;/div&amp;gt;}
    &amp;lt;/div&amp;gt;
  );
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, a função fetchData é chamada quando o usuário clica no botão "Carregar dados". A transição é iniciada com a função startTransition e, enquanto a transição estiver ativa, o componente exibirá "Carregando...". Quando a transição terminar e os dados forem carregados, o componente exibirá os dados na tela.&lt;/p&gt;

&lt;p&gt;As Transitions no React 18 permitem que os desenvolvedores criem experiências de usuário mais fluidas e otimizadas, oferecendo maior controle sobre o processo de renderização e atualização dos componentes.&lt;/p&gt;

&lt;p&gt;Vamos criar um exemplo mais complexo usando Transitions no React 18 para gerenciar a exibição de uma lista de itens com animações de entrada e saída. Para isso, utilizaremos a biblioteca react-spring para criar as animações.&lt;/p&gt;

&lt;p&gt;Criaremos o componente AnimatedList:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useState, useTransition } from "react";
import { useTransition as useSpringTransition, animated } from "react-spring";

function AnimatedList() {
  const [items, setItems] = useState([]);
  const [inputValue, setInputValue] = useState("");
  const [startTransition, isPending] = useTransition();

  const transitions = useSpringTransition(items, {
    from: { opacity: 0, transform: "translate3d(0, -40px, 0)" },
    enter: { opacity: 1, transform: "translate3d(0, 0, 0)" },
    leave: { opacity: 0, transform: "translate3d(0, -40px, 0)" },
    config: { duration: 300 },
  });

  const addItem = () =&amp;gt; {
    startTransition(() =&amp;gt; {
      setItems((prevItems) =&amp;gt; [...prevItems, inputValue]);
      setInputValue("");
    });
  };

  const removeItem = (index) =&amp;gt; {
    startTransition(() =&amp;gt; {
      setItems((prevItems) =&amp;gt; prevItems.filter((_, i) =&amp;gt; i !== index));
    });
  };

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;input
        type="text"
        value={inputValue}
        onChange={(e) =&amp;gt; setInputValue(e.target.value)}
        disabled={isPending}
      /&amp;gt;
      &amp;lt;button onClick={addItem} disabled={isPending}&amp;gt;
        Adicionar item
      &amp;lt;/button&amp;gt;
      &amp;lt;ul&amp;gt;
        {transitions((style, item, _, index) =&amp;gt; (
          &amp;lt;animated.li key={item} style={style} onClick={() =&amp;gt; removeItem(index)}&amp;gt;
            {item}
          &amp;lt;/animated.li&amp;gt;
        ))}
      &amp;lt;/ul&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default AnimatedList;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, criamos um componente AnimatedList que permite adicionar e remover itens com animações suaves de entrada e saída. A lista é gerenciada usando o estado items, e as transições são criadas usando a API useTransition do React 18 e a API useTransition do react-spring.&lt;/p&gt;

&lt;p&gt;Ao clicar no botão "Adicionar item", a função addItem é chamada e inicia uma transição para adicionar o item à lista. Da mesma forma, ao clicar em um item da lista, a função removeItem é chamada para iniciar uma transição e remover o item. Enquanto a transição estiver ativa, o input e o botão são desabilitados para evitar interações adicionais.&lt;/p&gt;

&lt;p&gt;As animações de entrada e saída são definidas no objeto de configuração passado para a função useSpringTransition. Neste caso, os itens da lista são animados com uma mudança de opacidade e uma transformação de posição no eixo Y.&lt;/p&gt;

&lt;p&gt;Esse exemplo demonstra como combinar as Transitions do React 18 com animações CSS usando a biblioteca react-spring para criar experiências de usuário mais fluidas e interativas.&lt;/p&gt;

&lt;p&gt;Vamos criar o mesmo exemplo usando a biblioteca framer-motion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useState, useTransition } from "react";
import { AnimatePresence, motion } from "framer-motion";

function FramerMotionList() {
  const [items, setItems] = useState([]);
  const [inputValue, setInputValue] = useState("");
  const [startTransition, isPending] = useTransition();

  const addItem = () =&amp;gt; {
    startTransition(() =&amp;gt; {
      setItems((prevItems) =&amp;gt; [...prevItems, inputValue]);
      setInputValue("");
    });
  };

  const removeItem = (index) =&amp;gt; {
    startTransition(() =&amp;gt; {
      setItems((prevItems) =&amp;gt; prevItems.filter((_, i) =&amp;gt; i !== index));
    });
  };

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;input
        type="text"
        value={inputValue}
        onChange={(e) =&amp;gt; setInputValue(e.target.value)}
        disabled={isPending}
      /&amp;gt;
      &amp;lt;button onClick={addItem} disabled={isPending}&amp;gt;
        Adicionar item
      &amp;lt;/button&amp;gt;
      &amp;lt;ul&amp;gt;
        &amp;lt;AnimatePresence&amp;gt;
          {items.map((item, index) =&amp;gt; (
            &amp;lt;motion.li
              key={item}
              initial={{ opacity: 0, y: -20 }}
              animate={{ opacity: 1, y: 0 }}
              exit={{ opacity: 0, y: -20 }}
              transition={{ duration: 0.3 }}
              onClick={() =&amp;gt; removeItem(index)}
            &amp;gt;
              {item}
            &amp;lt;/motion.li&amp;gt;
          ))}
        &amp;lt;/AnimatePresence&amp;gt;
      &amp;lt;/ul&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default FramerMotionList;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, criamos um componente FramerMotionList que permite adicionar e remover itens com animações suaves de entrada e saída. A lista é gerenciada usando o estado items, e as transições são criadas usando a API useTransition do React 18 e a API AnimatePresence e motion do framer-motion.&lt;/p&gt;

&lt;p&gt;Ao clicar no botão "Adicionar item", a função addItem é chamada e inicia uma transição para adicionar o item à lista. Da mesma forma, ao clicar em um item da lista, a função removeItem é chamada para iniciar uma transição e remover o item. Enquanto a transição estiver ativa, o input e o botão são desabilitados para evitar interações adicionais.&lt;/p&gt;

&lt;p&gt;As animações de entrada e saída são definidas nos objetos initial, animate e exit dos componentes motion.li. Neste caso, os itens da lista são animados com uma mudança de opacidade e uma transformação de posição no eixo Y.&lt;/p&gt;

&lt;p&gt;Esse exemplo demonstra como combinar as Transitions do React 18 com animações CSS usando a biblioteca framer-motion para criar experiências de usuário mais fluidas e interativas.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>news</category>
    </item>
  </channel>
</rss>
