Desfazendo e Refazendo Ações com Hooks no React: Um Guia Completo

Aprenda a implementar um Hook personalizado que possibilita desfazer e refazer ações em aplicações React.

Criando um Hook para Desfazer e Refazer Ações no React

No desenvolvimento de aplicações React, muitas vezes nos deparamos com a necessidade de implementar funcionalidades que permitam desfazer ou refazer ações. Isso é especialmente relevante em editores de texto, aplicações de design ou qualquer interface onde as mudanças precisam ser revertidas. Neste guia, vamos explorar como criar um Hook personalizado para gerenciar essas funcionalidades de forma eficiente.

O que são Hooks?

Os Hooks são funções que permitem que você utilize o estado e outros recursos do React sem escrever uma classe. O Hook useState é um dos mais comuns, mas a criação de Hooks personalizados, como o que vamos desenvolver, é uma prática poderosa que pode tornar seu código mais modular e reutilizável.

Estrutura Básica do Hook

Vamos criar um Hook chamado useUndo que irá armazenar um histórico de estados. Começaremos definindo a estrutura básica:

import { useState } from 'react';

const useUndo = (initialValue) => {
    const [past, setPast] = useState([]);
    const [present, setPresent] = useState(initialValue);
    const [future, setFuture] = useState([]);

    const set = (newPresent) => {
        setPast([...past, present]);
        setPresent(newPresent);
        setFuture([]);
    };

    const undo = () => {
        if (past.length === 0) return;
        const previous = past[past.length - 1];
        const newPast = past.slice(0, past.length - 1);
        setPresent(previous);
        setFuture([present, ...future]);
        setPast(newPast);
    };

    const redo = () => {
        if (future.length === 0) return;
        const next = future[0];
        const newFuture = future.slice(1);
        setPast([...past, present]);
        setPresent(next);
        setFuture(newFuture);
    };

    return { present, set, undo, redo };
};

Neste código, estamos utilizando três estados: past, present e future. O past armazena os estados anteriores, present é o estado atual e future mantém os estados que podem ser revertidos para frente. As funções set, undo e redo são responsáveis por atualizar esses estados conforme necessário.

Utilizando o Hook

Agora que temos nosso Hook useUndo pronto, vamos ver como utilizá-lo em um componente. Imagine um simples editor de texto:

import React, { useState } from 'react';
import useUndo from './useUndo';

const TextEditor = () => {
    const { present, set, undo, redo } = useUndo('');

    return (
        <div>
            <textarea
                value={present}
                onChange={(e) => set(e.target.value)}
            />
            <button onClick={undo}>Desfazer</button>
            <button onClick={redo}>Refazer</button>
        </div>
    );
};

Aqui, estamos utilizando o Hook useUndo para gerenciar o estado do nosso editor de texto. O valor atual do texto é armazenado em present, e as funções de desfazer e refazer são ligadas aos respectivos botões.

Explicando o Comportamento

Quando o usuário digita algo no textarea, a função set é chamada, atualizando o estado present e armazenando o valor anterior em past. Se o botão 'Desfazer' for clicado, a função undo é chamada, que retorna ao último estado armazenado em past. Similarmente, ao clicar em 'Refazer', a função redo é acionada, permitindo que o usuário volte para o estado que foi desfeito.

Considerações Finais

Criar um Hook para desfazer e refazer ações no React não apenas melhora a experiência do usuário, mas também adiciona uma camada de controle sobre a manipulação de dados. Esta abordagem modular permite que você reutilize o Hook em diferentes componentes de sua aplicação, promovendo a consistência e a manutenção do código.

Próximos Passos

Depois de ter esse Hook básico funcionando, você pode expandir suas funcionalidades, como adicionar limites no histórico, ou implementar uma versão mais complexa que suporte múltiplos tipos de ações. A prática leva à perfeição, então continue explorando e aprimorando suas habilidades com Hooks!

O gerenciamento do estado em aplicações React pode ser desafiador, especialmente quando se trata de desfazer e refazer ações. O uso de Hooks personalizados, como o useUndo, oferece uma solução elegante e eficiente. Esses Hooks não apenas simplificam a lógica do seu código, mas também melhoram a experiência do usuário, permitindo uma navegação mais intuitiva entre ações realizadas. Aprender a implementar essas funcionalidades é um passo importante para qualquer desenvolvedor que busca criar aplicações React mais robustas e interativas.

Algumas aplicações:

  • Editor de texto com funcionalidades de desfazer/refazer
  • Aplicações de design gráfico
  • Formulários dinâmicos
  • Jogos interativos

Dicas para quem está começando

  • Estude a documentação oficial do React.
  • Pratique criando pequenos projetos.
  • Experimente diferentes Hooks e suas combinações.
  • Participe de comunidades e fóruns para trocar experiências.
  • Não tenha medo de errar, a prática leva ao aprendizado.

Contribuições de Gabriel Nogueira

Compartilhe este tutorial: Como criar um Hook que permite desfazer e refazer ações no React?

Compartilhe este tutorial

Continue aprendendo:

Como criar um Hook personalizado para sincronizar estados entre abas do navegador?

Aprenda a criar um Hook em React que sincroniza estados entre abas do navegador de forma eficaz.

Tutorial anterior

Como criar um Hook para capturar ações do touch em dispositivos móveis?

Guia completo sobre a criação de Hooks em React para capturar eventos de touch em dispositivos móveis.

Próximo tutorial