Do not speak Portuguese? Translate this site with Google or Bing Translator
Novidades do React 19

Posted on: September 10, 2024 10:18 AM

Posted by: Renato

Categories: reactjs react

Views: 166

Novidades do React 19

Texto de: Marlliton Souza

Introdução

Recentemente, foi anunciado o React 19 RC, uma versão Release Candidate que traz várias melhorias e novidades para uma das tecnologias de desenvolvimento frontend mais populares do mercado, e neste artigo falaremos de algumas dessas novidades.

Ações (actions)

As actions nos permitem ouvir eventos disparados pelo usuário, seja um click, ou um envio de formulário e simplificam o gerenciamento de estados e mutação de dados que acontece em função desse evento.

Dessa forma podemos automatizar processos como lidar com estados pendentes e estados de erros, de forma mais eficiente. O que deixa nosso código mais limpo. Por exemplo, imagine que você está fazendo o envio de formulário de forma tradicional no React, provavelmente, você terá um código parecido com esse:

function Form() {
  const [nome, setNome] = useState("");
  const [erro, setErro] = useState(null);
  const [carregando, setCarregando] = useState(false);

  const submeter = async () => {
    setCarregando(true);
    const erro = await enviarNome(nome);
    setCarregando(false);
    if (erro) {
      setErro(erro);
      return;
    }
    redirect("/path");
  };

  return (
    <div>
      <input value={nome} onChange={valor => setNome(valor.target.value)} />
      <button onClick={submeter} disabled={carregando}>
        Enviar
      </button>
      {erro && <p>{erro}</p>}
    </div>
  );
} 

Com o uso das actions, podemos automatizar, por exemplo, o estado de carregamento da aplicação usando useTransition:

function Form() {
  const [nome, setNome] = useState("");
  const [erro, setErro] = useState(null);
  const [isPending, startTransition] = useTransition();

  const submeter = () => {
    startTransition(async () => {
      const erro = await enviarNome(nome);
      if (erro) {
        setErro(erro);
        return;
      } 
      redirect("/path");
    })
  };

  return (
    <div>
      <input value={nome} onChange={(event) => setNome(event.target.value)} />
      <button onClick={submeter} disabled={isPending}>
        Enviar
      </button>
      {erro && <p>{erro}</p>}
    </div>
  );
} 

Com o uso do useTransition não precisamos mais manipular estados de carregamento manualmente com o uso de estados, basta usarmos já que o isPending será true quando a transação começa e false automaticamente quando ela termina com erro ou sucesso. Isso permite que a interface se mantenha interativa mesmo enquanto os dados estiverem sendo alterados.

Novo hook useActionState

O React 19 também introduziu o suporte para o useActionState que é um hook que pode ser usado para gerenciar formulários automaticamente.

O useActionState aceita uma função, que é chamada de action (ação), e retorna uma ação encapsulada que pode ser passada para o seu formulário. Essa ação irá gerenciar os estados possíveis do form de uma forma simples, o que permite que possamos gerenciar estados de erro e carregamento com facilidade.

import { redirect } from "next/navigation";
import { useActionState } from "react";

export default function Form() {
  const [error, submitAction, isPending] = useActionState(
    async (estadoAnterior, formData) => {
      const error = await enviarNome(formData.get("nome"));
      if (error) {
        return error;
      }
      redirect("/path");
      return null;
    },
    null,
  );

  return (
    <form action={submitAction}>
      <input type="text" name="nome" />
      <button type="submit" disabled={isPending}>Enviar</button>
      {error && <p>{error}</p>}
    </form>
  );
} 

Nova API: use

De forma tradicional, sempre usamos estados (useState) e efeitos colaterais (useEffect) para lidar com requisições assíncronas. Usando a nova API use podemos descartar o uso de useState e useEffect para lidar com esse tipo de requisições.

Basta passar a promessa para o método use e ele mesmo se encarregará de fazer a suspensão dos componentes e quando o resultado da promessa chegar ele já se encarrega de “liberar” o uso dos dados que poderão ser renderizados em seguida.

import { Suspense, use } from "react";

function Posts({ promessa }: { promessa: Promise<string[]> }) {
  const res = use(promessa);
  return <div>{res.map(post => post)}</div>;
}

export default function Home() {
  const promessa = new Promise<string[]>(resolve => {
    setInterval(() => resolve(["Post 1", "Post 2", "Post 3", "Post 4"]), 2000);
  });

  return (
    <div>
      <Suspense fallback={<div>carregando...</div>}>
        <Posts promessa={promessa} />
      </Suspense>
    </div>
  );
} 

Também é possível ler contextos inteiros com essa nova API, o que dispensa o uso do hook useContext:

import { use } from "react";
import TemaContext from "./TemaContext";

export default function Home({ children }) {
  const tema = use(TemaContext);
  return (
    <div
      style={{
        color: tema.cor,
      }}
    >
      {children}
    </div>
  );
} 

Melhorias do React 19

Agora, você pode passar referencias (ref) usando as props, ou seja, não é mais necessário fazer uso do forwardRef. Antes, para fazermos uso das refs em componentes, nós faríamos assim:

const Input = forwardRef<HTMLInputElement, InputProps>(
    ({ className, children ...rest }, ref) => {
        
        return (
            <input ref={ref} className={className} {...rest}>{children}</input>
        )
    },
)

Input.displayName = 'Input'

//...
<Input ref={ref} /> 

Então, apesar da complexidade para iniciante de entender e utilizar o forwardRef tínhamos que declarar o displayName, caso contrário o React não saberia o nome do componente. Agora, basta passar a ref por props, como qualquer outra propriedade React:

function Input({placeholder, ref}) {
  return <input placeholder={placeholder} ref={ref} />
}

//...
<Input ref={ref} /> 

Contexto como provedor

Agora, não precisamos mais utilizar <Context.Provider> para criar provedores de contexto em nossa aplicação, basta envolver a aplicação com o contexto, sem precisar chamar o provider:

const TemaContext = createContext('');

function App({children}) {
  return (
    <TemaContext value="dark">
      {children}
    </TemaContext>
  );  
} 

Resumo

O React 19 trouxe muitas novidades, como a adição de novos hooks e melhorias na API, que nos ajudarão a criar aplicações mais leves e performáticas. Além das novidades abordadas neste artigo, existem várias outras melhorias e adições feitas ao React 19 que você pode conferir clicando aqui.

- https://blog.formacao.dev/todas-as-novidades-do-react-19/

2

Share

Donate to Site


About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

OUTROS (16) Variados (109) PHP (133) Laravel (171) Black Hat (3) front-end (29) linux (114) postgresql (39) Docker (28) rest (5) soap (1) webservice (6) October (1) CMS (2) node (7) backend (13) ubuntu (56) devops (25) nodejs (5) npm (3) nvm (1) git (8) firefox (1) react (7) reactnative (5) collections (1) javascript (7) reactjs (8) yarn (0) adb (1) Solid (2) blade (3) models (1) controllers (0) log (1) html (2) hardware (3) aws (14) Transcribe (2) transcription (1) google (4) ibm (1) nuance (1) PHP Swoole (5) mysql (31) macox (4) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (3) imagick (2) ec2 (1) sw (1) websocket (2) markdown (1) ckeditor (1) tecnologia (14) faceapp (1) eloquent (14) query (4) sql (40) ddd (3) nginx (9) apache (4) certbot (1) lets-encrypt (3) debian (12) liquid (1) magento (2) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (2) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (4) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (2) binaural (1) mysqli (3) database (42) windows (6) vala (1) json (2) oracle (1) mariadb (4) dev (12) webdev (24) s3 (4) storage (1) kitematic (1) gnome (2) web (2) intel (3) piada (1) cron (2) dba (18) lumen (1) ffmpeg (2) android (2) aplicativo (1) fedora (2) shell (4) bash (3) script (3) lider (1) htm (1) csv (1) dropbox (1) db (3) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (1) biologia (1) programming (22) performance (3) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (3) microg (1) iode (1) ssh (3) zsh (2) terminal (3) dracula (1) spaceship (1) mac (2) idiomas (1) laptop (2) developer (37) api (5) data (1) matematica (1) seguranca (2) 100DaysOfCode (9) hotfix (1) documentation (1) laravelphp (10) RabbitMQ (3) Elasticsearch (1) redis (2) Raspberry (4) Padrao de design (4) JQuery (1) angularjs (4) Dicas (43) Kubernetes (3) vscode (2) backup (1) angular (3) servers (2) pipelines (1) AppSec (1) DevSecOps (4) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (2) jwt (5) security (2) translate (1) kube (2) iot (1) politica (2) bolsonaro (1) flow (1) podcast (1) Brasil (1) containers (3) traefik (1) networking (1) host (1) POO (2) microservices (2) bug (1) cqrs (1) arquitetura (3) Architecture (4) sail (3) militar (1) artigo (1) economia (1) forcas armadas (1) ffaa (1) autenticacao (2) autorizacao (2) authentication (4) authorization (3) NoCookies (1) wsl (4) memcached (1) macos (2) unix (2) kali-linux (1) linux-tools (5) apple (1) noticias (2) composer (1) rancher (1) k8s (1) escopos (1) orm (1) jenkins (4) github (5) gitlab (3) queue (1) Passwordless (1) sonarqube (1) phpswoole (1) laraveloctane (1) Swoole (1) Swoole (1) octane (1) Structurizr (1) Diagramas (1) c4 (1) c4-models (1) compactar (1) compression (1) messaging (1) restfull (1) eventdrive (1) services (1) http (1) Monolith (1) microservice (1) historia (1) educacao (1) cavalotroia (1) OOD (0) odd (1) chatgpt (1) openai (3) vicuna (1) llama (1) gpt (1) transformers (1) pytorch (1) tensorflow (1) akitando (1) ia (1) nvidia (1) agi (1) guard (1) multiple_authen (2) rpi (1) auth (1) auth (1) livros (2) ElonMusk (2) Oh My Zsh (1) Manjaro (1) BigLinux (2) ArchLinux (1) Migration (1) Error (1) Monitor (1) Filament (1) LaravelFilament (1) replication (1) phpfpm (1) cache (1) vpn (1) l2tp (1) zorin-os (1) optimization (1) scheduling (1) monitoring (2) linkedin (1) community (1) inteligencia-artificial (2) wsl2 (1) maps (1) API_KEY_GOOGLE_MAPS (1) repmgr (1) altadisponibilidade (1) banco (1) modelagemdedados (1) inteligenciadedados (4) governancadedados (1) bancodedados (2) Observability (1) picpay (1) ecommerce (1) Curisidades (1) Samurai (1) KubeCon (1) GitOps (1) Axios (1) Fetch (1) Deepin (1) vue (4) nuxt (1) PKCE (1) Oauth2 (2) webhook (1) TypeScript (1) tailwind (1) gource (2)

New Articles



Get Latest Updates by Email