<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Thiago Giammattey - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Thiago Giammattey - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 12 Jul 2026 08:30:03 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/giammacarioca/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como adicionar a funcionalidade de "arrastar e soltar" em React com a biblioteca React Beautiful DnD ]]>
                </title>
                <description>
                    <![CDATA[ Arrastar e soltar (em inglês, "Drag and Drop") é uma técnica de interação comum, que permite que as pessoas possam intuitivamente mudar as coisas de lugar na página. Pode ter a ver com reordenar uma lista ou até mesmo montar um quebra-cabeças. Como podemos adicionar esse tipo de interação ao ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-adicionar-a-funcionalidade-de-arrastar-e-soltar-em-react-com-a-biblioteca-react-beautiful-dnd/</link>
                <guid isPermaLink="false">620123d653557304fa19f724</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Thiago Giammattey ]]>
                </dc:creator>
                <pubDate>Wed, 16 Mar 2022 17:55:26 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/drag-and-drop-1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-add-drag-and-drop-in-react-with-react-beautiful-dnd/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Add Drag and Drop in React with React Beautiful DnD</a>
      </p><p>Arrastar e soltar (em inglês, "Drag and Drop") é uma técnica de interação comum, que permite que as pessoas possam intuitivamente mudar as coisas de lugar na página. Pode ter a ver com reordenar uma lista ou até mesmo montar um quebra-cabeças.</p><p>Como podemos adicionar esse tipo de interação ao construir um aplicação React com a biblioteca React Beautiful DnD?</p><ul><li><a href="https://www.freecodecamp.org/portuguese/news/como-adicionar-a-funcionalidade-de-arrastar-e-soltar-em-react-com-a-biblioteca-react-beautiful-dnd/#o-que-arrastar-e-soltar">O que é arrastar e soltar?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-adicionar-a-funcionalidade-de-arrastar-e-soltar-em-react-com-a-biblioteca-react-beautiful-dnd/#o-que-o-react-beautiful-dnd">O que é o React Beautiful DnD?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-adicionar-a-funcionalidade-de-arrastar-e-soltar-em-react-com-a-biblioteca-react-beautiful-dnd/#o-que-vamos-construir">O que vamos construir?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-adicionar-a-funcionalidade-de-arrastar-e-soltar-em-react-com-a-biblioteca-react-beautiful-dnd/#passo-0-criar-um-novo-projeto-do-react-js">Passo 0: criar um novo projeto do React.js</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-adicionar-a-funcionalidade-de-arrastar-e-soltar-em-react-com-a-biblioteca-react-beautiful-dnd/#passo-1-instalar-o-react-beautiful-dnd">Passo 1: instalar o React Beautiful DnD</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-adicionar-a-funcionalidade-de-arrastar-e-soltar-em-react-com-a-biblioteca-react-beautiful-dnd/#passo-2-permitir-o-arrastar-e-soltar-de-uma-lista-com-o-react-beautiful-dnd">Passo 2: permitir o arrastar e soltar de uma lista com o React Beautiful DnD</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-adicionar-a-funcionalidade-de-arrastar-e-soltar-em-react-com-a-biblioteca-react-beautiful-dnd/#passo-3-salvar-a-nova-ordem-da-lista-ap-s-ter-reordenado-os-itens-com-o-react-beautiful-dnd">Passo 3: salvar a nova ordem da lista após ter reordenado os itens com o React Beautiful DnD</a></li></ul><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/aYZRRyukuIw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><h2 id="o-que-arrastar-e-soltar">O que é arrastar e soltar?</h2><p>Arrastar e soltar é, basicamente, o que o próprio nome indica – uma interação que permite a alguém clicar sobre um item, arrastá-lo e, em seguida, soltá-lo em outro lugar, geralmente causando um efeito colateral no aplicativo.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/react-beautiful-dnd-board.gif" class="kg-image" alt="react-beautiful-dnd-board" width="1200" height="416" loading="lazy"><figcaption>Movimentação dos itens em um quadro</figcaption></figure><p>Esse efeito é bastante comum em aplicativos como listas de tarefas ou painel de gerenciamento de projetos, onde você precisa estabelecer prioridades e criar uma ordem para como as coisas devem ser feitas.</p><p>Embora a técnica de "arrastar e soltar" possa ter alguns casos de uso avançados, nos limitaremos à funcionalidade de lista básica em nosso passo a passo.</p><h2 id="o-que-o-react-beautiful-dnd">O que é o React Beautiful DnD?</h2><p>O React Beautiful DnD é uma biblioteca de arrastar e soltar acessível desenvolvida pela Atlassian. &nbsp;Se você não conhece a Atlassian, eles são a equipe por trás do Jira. Se você não está familiarizado com o Jira, ele é provavelmente a maior ferramenta de gestão ágil na internet atualmente.</p><p>Os objetivos da equipe de desenvolvimento da Atlassian eram fornecer recursos de arrastar e soltar tendo a acessibilidade em mente, além de manter a biblioteca enxuta, com um ótimo desempenho e uma API poderosa.</p><h2 id="o-que-vamos-construir">O que vamos construir?</h2><p>Vamos começar com uma simples lista e adicionar a ela a funcionalidade de arrastar e soltar.</p><p>Neste passo a passo, não perderemos tempo construindo a própria lista. &nbsp;A lista que usaremos é composta de uma tag de lista não ordenada padrão (<code>&lt;ul&gt;</code>) e tags de itens de lista (<code>&lt;li&gt;</code>), com um pouco de CSS para deixá-los parecidos com cartões.</p><p>Vamos nos concentrar em adicionar a funcionalidade de arrastar e soltar para reorganizar a lista usando o React Beautiful DnD.</p><h2 id="passo-0-criar-um-novo-projeto-do-react-js">Passo 0: criar um novo projeto do React.js</h2><p>Para começar, queremos um aplicativo simples, que inclua uma lista de itens. Pode ser um projeto já existente ou um novo projeto usando seu framework preferido, como, por exemplo, o <a href="https://create-react-app.dev/">Create React App</a>.</p><p>Comecei com um novo projeto usando o Create React App e adicionei a ele uma lista simples de personagens de <a href="https://www.tbs.com/shows/final-space">Final Space</a>.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/list-of-final-space-characters-1.jpg" class="kg-image" alt="list-of-final-space-characters-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/03/list-of-final-space-characters-1.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/03/list-of-final-space-characters-1.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2022/03/list-of-final-space-characters-1.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/03/list-of-final-space-characters-1.jpg 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="780" loading="lazy"><figcaption>Lista de personagens de Final Space</figcaption></figure><p>Se você quiser começar do mesmo lugar, pode clonar meu repositório de demonstração na branch específica e começar desde o início comigo.</p><p>Este comando clonará <a href="https://github.com/colbyfayock/my-final-space-characters/tree/part-0-starting-point" rel="noopener noreferrer">a branch específica</a> para começarmos:</p><pre><code>git clone --single-branch --branch part-0-starting-point git@github.com:colbyfayock/my-final-space-characters.git
</code></pre><p>Caso contrário, você pode clonar <a href="https://github.com/colbyfayock/my-final-space-characters" rel="noopener noreferrer">o repositório</a> normalmente e passar direto para a branch <code>part-0-starting-point</code>.</p><p>Se você quiser acompanhar apenas o código, primeiramente, eu criei um array de objetos:</p><pre><code class="language-undefined">const finalSpaceCharacters = [
  {
    id: 'gary',
    name: 'Gary Goodspeed',
    thumb: '/images/gary.png'
  },
  ...
</code></pre><p>Então, eu percorri esses objetos com um laço para criar minha lista:</p><pre><code>&lt;ul className="characters"&gt;
  {finalSpaceCharacters.map(({id, name, thumb}) =&gt; {
    return (
      &lt;li key={id}&gt;
        &lt;div className="characters-thumb"&gt;
          &lt;img src={thumb} alt={`${name} Thumb`} /&gt;
        &lt;/div&gt;
        &lt;p&gt;
          { name }
        &lt;/p&gt;
      &lt;/li&gt;
    );
  })}
&lt;/ul&gt;
</code></pre><p><a href="https://github.com/colbyfayock/my-final-space-characters/commit/8bfa61c32c1bdace7515a93a14427108056f3814">Siga junto comigo pelo commit!</a></p><h2 id="passo-1-instalar-o-react-beautiful-dnd">Passo 1: instalar o React Beautiful DnD</h2><p>O primeiro passo é instalar a biblioteca via npm.</p><p>De dentro do projeto, execute o seguinte comando:</p><pre><code>yarn add react-beautiful-dnd
# or
npm install react-beautiful-dnd --save
</code></pre><p>Isso adicionará a biblioteca ao projeto e estaremos prontos para usá-la na nossa aplicação.</p><h2 id="passo-2-permitir-o-arrastar-e-soltar-de-uma-lista-com-o-react-beautiful-dnd">Passo 2: permitir o arrastar e soltar de uma lista com o React Beautiful DnD</h2><p>Com a biblioteca instalada, nós podemos dar a nossa lista a habilidade de ser arrastada pela página e largada em outro lugar.</p><h3 id="adicionar-o-contexto-de-arrastar-e-soltar-ao-nosso-app">Adicionar o contexto de arrastar e soltar ao nosso app</h3><p>Na parte superior do arquivo, importe <code>DragDropContext</code> da biblioteca com:</p><pre><code class="language-jsx">import { DragDropContext } from 'react-beautiful-dnd';
</code></pre><p><a href="https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/api/drag-drop-context.md">DragDropContext</a> vai dar ao nosso app a habilidade de utilizar a biblioteca. Funciona de maneira parecida à API Context do React, na qual a biblioteca ganha acesso à árvore de componentes.</p><p><em>Observação: se você planeja adicionar a funcionalidade de arrastar e soltar a mais de uma lista, precisa garantir que o DragDropContext englobe todos esses itens, como, por exemplo, a raiz de sua aplicação. Você não pode aninhar o DragDropContext.</em></p><p>Queremos envolver nossa lista com o DragDropContext:</p><pre><code class="language-jsx">&lt;DragDropContext&gt;
  &lt;ul className="characters"&gt;
  ...
&lt;/DragDropContext&gt;
</code></pre><p>Até aqui, nada terá mudado na aplicação e ela deve carregar como antes.</p><h3 id="permitir-arrastar-os-itens-de-nossa-lista">Permitir arrastar os itens de nossa lista</h3><p>Em seguida, queremos criar uma área onde podemos arrastar os itens (em inglês, uma área <em>Droppable</em>). Isso nos permitirá prover uma área específica onde nossos itens poderão ser movidos de lugar dentro desse limite.</p><p>Primeiramente, adicionamos <code>Droppable</code> à importação na parte superior do arquivo:</p><pre><code class="language-js">import { DragDropContext, Droppable } from 'react-beautiful-dnd';
</code></pre><p>Para nosso objetivo, queremos que nossa lista não ordenada inteira (<code>&lt;ul&gt;</code>) fique dentro da nossa "<em>drop zone</em>" (a zona onde soltaremos os itens). Assim, precisamos envolvê-la com esse componente:</p><pre><code class="language-jsx">&lt;DragDropContext&gt;
  &lt;Droppable droppableId="characters"&gt;
    {(provided) =&gt; (
      &lt;ul className="characters"&gt;
        ...
      &lt;/ul&gt;
    )}
  &lt;/Droppable&gt;
&lt;/DragDropContext&gt;
</code></pre><p>Você notará, porém, que envolvemos a lista de um modo um pouco diferente. Primeiro, definimos um <code>droppableId</code> para nosso componente <code>&lt;Droppable&gt;</code>. Isso permite à biblioteca acompanhar essa instância específica entre as interações.</p><p>Também estamos criando uma função diretamente naquele componente, que passa o argumento <code>provided</code> (fornecido, em inglês).</p><p>Observação: essa função pode passar dois argumentos, incluindo um argumento <code>snapshot</code>, mas não o usaremos nesse exemplo.</p><p>O argumento <a href="https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/api/droppable.md#1-provided-droppableprovided"><em>provided</em></a> (texto em inglês) inclui informações e referências ao código de que a biblioteca necessita para funcionar adequadamente.</p><p>Para usá-lo, em nosso elemento de lista, adicionamos o seguinte:</p><pre><code class="language-jsx">&lt;ul className="characters" {...provided.droppableProps} ref={provided.innerRef}&gt;
</code></pre><p>Isso criará uma referência (<code>provided.innerRef</code>) para que a biblioteca acesse o HTML dos elementos da lista. Também aplicará props ao elemento (<code>provided.droppableProps</code>) que permitem a biblioteca para acompanhar os movimentos e o posicionamento.</p><p>Novamente, nesse ponto, ainda não haverá uma funcionalidade perceptível.</p><h3 id="permitir-que-nossos-itens-sejam-arrast-veis">Permitir que nossos itens sejam arrastáveis</h3><p>Agora, vamos para a parte divertida!</p><p>A última parte para permitir arrastar e soltar nossos elementos da lista é envolver cada item da lista com um componente de modo semelhante ao que fizemos com toda a lista.</p><p>Usaremos o componente <a href="https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/api/draggable.md">Draggable</a> (texto do link em inglês), que, mais uma vez, de modo semelhante ao componente Droppable, incluirá uma função na qual passaremos props aos componentes do item de lista.</p><p>Primeiro, precisamos importar Draggable, juntamente com o resto dos componentes.</p><pre><code>import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';
</code></pre><p>Em seguida, dentro de nosso laço, envolvemos o item de lista retornado com o componente <code>&lt;Draggable /&gt;</code> e sua função de nível superior.</p><pre><code class="language-jsx">{finalSpaceCharacters.map(({id, name, thumb}) =&gt; {
  return (
    &lt;Draggable&gt;
      {(provided) =&gt; (
        &lt;li key={id}&gt;
          ...
        &lt;/li&gt;
      )}
    &lt;/Draggable&gt;
</code></pre><p>Como agora temos um novo componente de nível superior em nosso laço, vamos mover a prop <code>key</code> do elemento da lista para Draggable:</p><pre><code class="language-jsx">{finalSpaceCharacters.map(({id, name, thumb}) =&gt; {
  return (
    &lt;Draggable key={id}&gt;
      {(provided) =&gt; (
        &lt;li&gt;
</code></pre><p>Também precisamos definir duas props adicionais em <code>&lt;Draggable&gt;</code>, um <code>draggableId</code> e um <code>index</code>.</p><p>Queremos adicionar esse <code>index</code> (índice, em inglês) como um argumento para nossa função <code>map</code> e incluir essas props ao nosso componente:</p><pre><code class="language-jsx">{finalSpaceCharacters.map(({id, name, thumb}, index) =&gt; {
  return (
    &lt;Draggable key={id} draggableId={id} index={index}&gt;
</code></pre><p>Por fim, precisamos definir algumas props na própria lista de elementos.</p><p>No nosso elemento de lista, adicionaremos essa <code>ref</code> e faremos o <em>spreading</em> das props adicionais do argumento <code>provided</code>:</p><pre><code class="language-jsx">&lt;Draggable key={id} draggableId={id} index={index}&gt;
  {(provided) =&gt; (
    &lt;li ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps}&gt;
</code></pre><p>Depois, se atualizarmos a página e passarmos o mouse por nossos itens da lista, veremos que é possível arrastá-los!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/drag-items-revert-state-1.gif" class="kg-image" alt="drag-items-revert-state-1" width="1200" height="417" loading="lazy"><figcaption>Arrastando itens em uma lista</figcaption></figure><p>Entretanto, você perceberá que, ao começar a mover um item, a parte inferior da página parecerá um pouco estranha. Parece haver uma questão com relação ao vazamento (em inglês, <em>overflowing</em>) dos itens da lista sobre o rodapé.</p><p>Você também perceberá que, no console do desenvolvedor, o React Beautiful DnD está nos passando uma mensagem de aviso, dizendo que está faltando algo, chamado <em>placeholder</em>.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/react-beautiful-dnd-warning-placeholder.jpg" class="kg-image" alt="react-beautiful-dnd-warning-placeholder" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/03/react-beautiful-dnd-warning-placeholder.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/03/react-beautiful-dnd-warning-placeholder.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2022/03/react-beautiful-dnd-warning-placeholder.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/03/react-beautiful-dnd-warning-placeholder.jpg 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="406" loading="lazy"><figcaption>Aviso do console - não foi possível encontrar o placeholder</figcaption></figure><h3 id="adicionar-o-placeholder-do-react-beautiful-dnd">Adicionar o placeholder do React Beautiful DnD</h3><p>Parte dos requisitos do React Beautiful DnD é a adição de um item chamado <em>placeholder</em>.</p><p>Isso é algo fornecido na instalação e é usado para preencher o espaço ocupado anteriormente pelo item que agora estamos arrastando.</p><p>Para adicioná-lo, incluiremos <code>provided.placeholder</code> na parte inferior de nosso componente de lista de nível superior "Droppable" - em nosso caso, na parte inferior do elemento <code>&lt;ul&gt;</code>:</p><pre><code class="language-jsx">&lt;Droppable droppableId="characters"&gt;
  {(provided) =&gt; (
    &lt;ul className="characters" {...provided.droppableProps} ref={provided.innerRef}&gt;
      ...
      {provided.placeholder}
    &lt;/ul&gt;
  )}
&lt;/Droppable&gt;
</code></pre><p>Agora, se começarmos a arrastar os itens em nosso navegador, veremos que o fluxo da página não terá mais problemas e que o conteúdo ficará onde deve estar!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/drag-items-revert-fixed-spacing.gif" class="kg-image" alt="drag-items-revert-fixed-spacing" width="1200" height="417" loading="lazy"><figcaption>Arrastando os itens após consertar a questão do espaçamento</figcaption></figure><p>O último problema, no entanto, está no fato de, ao mover algum dos itens, ele não permanecer no lugar em que o soltamos. Como, então, salvar a ordem dos nossos itens?</p><p><a href="https://github.com/colbyfayock/my-final-space-characters/commit/5ec5ee6c3e7de5b67a8fd46fdfbf157312bc8c00">Siga junto comigo pelo commit!</a></p><h2 id="passo-3-salvar-a-nova-ordem-da-lista-ap-s-ter-reordenado-os-itens-com-o-react-beautiful-dnd">Passo 3: salvar a nova ordem da lista após ter reordenado os itens com o React Beautiful DnD</h2><p>Quando movemos nossos itens, eles permanecem onde estão por uma fração de segundo e, assim que o React Beautiful DnD termina de fazer seu trabalho, a árvore de componentes renderizará novamente.</p><p>Depois da nova renderização dos componentes, os itens retornam ao mesmo lugar onde estavam, pois nunca foram salvos como estavam fora da memória do DnD.</p><p>Para resolver isso, o <code>DragDropContext</code> recebe uma prop <code>onDragEnd</code>, que nos permitirá disparar uma função após termos concluído o processo de arrastar. A função passa argumentos que incluem a nova ordem dos nossos itens para podermos atualizar nosso estado para o próximo ciclo de renderização.</p><h3 id="salvar-nossos-itens-da-lista-no-state">Salvar nossos itens da lista no state</h3><p>Primeiro, vamos armazenar nossos itens no <em>state</em>, para termos algo para atualizar entre os ciclos.</p><p>Na parte superior do arquivo, adicionamos <code>useState</code> ao import do React:</p><pre><code>import React, { useState } from 'react';
</code></pre><p>Em seguida, criaremos nosso state usando nossa lista de itens padrão.</p><p>Adicione o seguinte à parte superior do nosso componente App:</p><pre><code class="language-js">const [characters, updateCharacters] = useState(finalSpaceCharacters);
</code></pre><p>Como atualizaremos nosso novo state, <code>characters</code>, fornecendo nossos itens da lista e sua ordem, queremos substituir o array que mapeamos inicialmente por nosso novo state:</p><pre><code class="language-jsx">&lt;ul className="characters" {...provided.droppableProps} ref={provided.innerRef}&gt;
  {characters(({id, name, thumb}, index) =&gt; {
</code></pre><p>Se salvarmos e atualizarmos nossa página, nada deve mudar!</p><h3 id="atualizar-o-state-ao-arrastar-os-itens">Atualizar o state ao arrastar os itens</h3><p>Agora que temos nosso state, podemos atualizar o state sempre que itens da lista forem arrastados.</p><p>O componente <code>DragDropContext</code> que adicionamos à nossa página recebe uma prop <code>onDragEnd</code>. Conforme o nome diz (ao final do processo de arrastar, em inglês), essa prop disparará uma função sempre que alguém parar de arrastar um item na lista.</p><p>Vamos adicionar uma função <code>handleOnDragEnd</code> como nossa prop:</p><pre><code>&lt;DragDropContext onDragEnd={handleOnDragEnd}&gt;
</code></pre><p>Em seguida, precisamos que aquela função exista de fato.</p><p>Podemos definir uma função em nosso state:</p><pre><code class="language-js">function handleOnDragEnd(result) {
}
</code></pre><p>Nossa função recebe um argumento chamado <code>result</code>.</p><p>Se adicionarmos <code>console.log(result)</code> à função e movermos um item em nossa lista, veremos que ela inclui detalhes sobre o que deve ser o state atualizado após nossa ação de movimentação.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/react-beautiful-dnd-ondragend-result.jpg" class="kg-image" alt="react-beautiful-dnd-ondragend-result" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/03/react-beautiful-dnd-ondragend-result.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/03/react-beautiful-dnd-ondragend-result.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2022/03/react-beautiful-dnd-ondragend-result.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/03/react-beautiful-dnd-ondragend-result.jpg 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="441" loading="lazy"><figcaption>Resultado após arrastar o item</figcaption></figure><p>Especificamente, queremos usar o valor de <code>index</code> nas propriedades <code>destination</code> e <code>source</code>, que nos informam o índice do item que está sendo movido e qual deve ser o novo índice daquele item no array de itens.</p><p>Usando-o, adicionamos o seguinte à nossa função:</p><pre><code class="language-js">const items = Array.from(characters);
const [reorderedItem] = items.splice(result.source.index, 1);
items.splice(result.destination.index, 0, reorderedItem);

updateCharacters(items);
</code></pre><p>O que estamos fazendo é:</p><ul><li>Criar uma cópia de nosso array <code>characters</code></li><li>Usar o valor <code>source.index</code> para encontrar nosso item do novo array e removê-lo usando o método <code>splice</code></li><li>O resultado é desestruturado, assim, temos um novo objeto <code>reorderedItem</code>, que é o nosso item arrastado</li><li>Usar o <code>destination.index</code> para adicionar o item novamente no array, mas em seu novo local, usando <code>splice</code> novamente</li><li>Por fim, atualizar o state <code>characters</code> com a função <code>updateCharacters</code>. Agora, após salvar nossa função, podemos mover nossos personagens e eles são salvos no novo local!</li></ul><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/drag-drop-save-state.gif" class="kg-image" alt="drag-drop-save-state" width="1200" height="416" loading="lazy"><figcaption>Arrastando um item com o state salvo</figcaption></figure><h3 id="evitando-o-erro-de-arrastar-para-fora-dos-limites">Evitando o erro de arrastar para fora dos limites</h3><p>Uma pequena questão a resolver com nossa implementação é o que ocorre quando o item não é arrastado exatamente para dentro do contêiner definido. Quando isso ocorre, temos um erro.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/drag-out-of-container-error.gif" class="kg-image" alt="drag-out-of-container-error" width="1200" height="416" loading="lazy"><figcaption>Erro ao arrastar o item para fora do contêiner</figcaption></figure><p>O problema é que, ao fazermos isso, não temos um local de destino.</p><p>Para evitar isso, podemos simplesmente adicionar uma instrução acima do código que move nosso item para verificar se o destino existe. Se não existir, saímos da função:</p><pre><code class="language-js">function handleOnDragEnd(result) {
  if (!result.destination) return;
</code></pre><p>Se recarregarmos a página e tentarmos arrastar nosso item para fora do contêiner novamente, ele retornará ao local original sem o erro!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/drag-out-of-container-snap-back.gif" class="kg-image" alt="drag-out-of-container-snap-back" width="1200" height="416" loading="lazy"><figcaption>O item retorna ao local de origem quando arrastado para fora do contêiner</figcaption></figure><p><a href="https://github.com/colbyfayock/my-final-space-characters/commit/ad4f4733a974a27f5a2cfc8e366c2390809b74ca">Siga junto comigo pelo commit!</a></p><h2 id="o-que-mais-podemos-fazer-com-o-react-beautiful-dnd">O que mais podemos fazer com o React Beautiful DnD?</h2><h3 id="estilos-personalizados-ao-arrastar-e-soltar">Estilos personalizados ao arrastar e soltar</h3><p>Ao mover os itens, o DnD fornecerá um snapshot do state dado. Com essas informações, podemos aplicar estilos personalizados, de modo que, quando movermos nossos itens, poderemos mostrar um state ativo para a lista, para o item que movemos, ou ambos!</p><p><a href="https://react-beautiful-dnd.netlify.app/?path=/story/single-vertical-list--basic">https://react-beautiful-dnd.netlify.app/?path=/story/single-vertical-list--basic</a></p><h3 id="arrastar-entre-listas-diferentes">Arrastar entre listas diferentes</h3><p>Se você já usou o Trello anteriormente, ou uma ferramenta semelhante, deve estar familiarizado com o conceito de colunas diferentes entre as quais você pode arrastar cartões, de modo a priorizar e organizar suas tarefas e ideias.</p><p>Esta biblioteca permite a você fazer isso, dando a capacidade de arrastar e soltar itens de uma área dentro da qual um item pode ser arrastado para outra área do mesmo tipo.</p><p><a href="https://react-beautiful-dnd.netlify.app/?path=/story/multiple-vertical-lists--stress-test">https://react-beautiful-dnd.netlify.app/?path=/story/multiple-vertical-lists--stress-test</a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
