Artigo original: How to Pass Data and Events Between Components in React

Se você está tentando implementar operações de CRUD usando endpoints de API, pode se dar conta de que é mais difícil do que você imagina gerenciar dados entre vários componentes.

Talvez você tenha um modal, mas queira acioná-lo a partir de um componente diferente.

Saber como lidar com esses cenários pode ser problemático.

Neste tutorial, mostrarei a você como fazer isso.

Como passar dados entre um componente pai e um componente filho

Primeiro, vamos passar os dados entre um componente pai e um componente filho.

Para começar, você precisa criar dois componentes, um pai e um filho.

import React from 'react'

export default function Parent() {
  return (
    <div>
      
    </div>
  )
}
Parent.js (o componente pai)
import React from 'react'

export default function Child() {
    return (
        <div>
            
        </div>
    )
}
Child.js (o componente filho)

Em seguida, importe o componente filho no componente pai e retorne-o.

import React from 'react'
import Child from './Child';

export default function Parent() {
  return (
    <div>
      <Child/>
    </div>
  )
}
Chame o componente filho no componente pai

Em seguida, crie uma função e um botão para disparar aquela função. Além disso, crie um estado usando o hook useState para gerenciar os dados.

import React from 'react'
import Child from './Child';
import { Button } from 'semantic-ui-react';
import { useState } from 'react';
import './App.css';

export default function Parent() {
  const [data, setData] = useState('');
  
  const parentToChild = () => {
    setData("Estes são os dados que vão do componente pai para o componente filho.");
  }
  return (
    <div className="App">
      <Child/>
      
      <div>
        <Button primary onClick={() => parentToChild()}>Clique no pai</Button>
      </div>
    </div>
  )
}

Como você pode ver aqui, estamos chamando a função parentToChild no clique do botão Clique no pai. Quando o botão Clique no pai é clicado, Ele armazenará "Estes são os dados que vão do componente pai para o componente filho." na variável data.

Agora, vamos passar o estado desses dados nos nossos componentes filhos. Você pode fazer isso usando props.

Passe os dados como props quando estiver chamando o componente filho assim:

<Child parentToChild={data}/>
Parent.js

Aqui, estamos passando os dados no componente filho como data.

data são os dados que temos de passar. parentToChild é o nome do prop.

Em seguida, é hora de capturar os dados no componente filho. É muito simples.

Aqui, pode haver dois casos.

Caso 1: Se estiver usando um componente funcional, obtenha parentToChild nos parâmetros.

import React from 'react'

export default function Child({parentToChild}) {
    return (
        <div>
            {parentToChild}
        </div>
    )
}
Componente funcional em React

Caso 2: Se estiver usando um componente de classe, use this.props.parentToChild.

import React, { Component } from 'react'

export default class Child extends Component {
    render() {
        return (
            <div>
                {this.props.parentToChild}
            </div>
        )
    }
}
Componente de classe em React

Seja como for, você terá os mesmos resultados:

Screenshot-2021-06-06-132836
Texto exibido: "Estes são os dados que vão do componente pai para o componente filho." - Texto do botão: "Clique no pai"

Quando clicamos no botão Click Parent (Clique no pai), veremos os dados como resultado na tela.

import React from 'react'
import Child from './Child';
import { Button } from 'semantic-ui-react';
import { useState } from 'react';
import './App.css';

export default function Parent() {
  const [data, setData] = useState('');
  
  const parentToChild = () => {
    setData("Estes são os dados que vão do componente pai para o componente filho.");
  }
  return (
    <div className="App">
      <Child parentToChild={data}/>
      
      <div className="child">
        <Button primary onClick={() => parentToChild()}>Clique no pai</Button>
      </div>
    </div>
  )
}

Acima, você vê o código completo para o Componente pai.

Como passar dados entre um componente filho e um componente pai

Isso já é um pouco mais complicado.

Primeiro, você precisa criar uma função no componente pai chamada childToParent e um estado vazio chamado data.

const [data, setData] = useState('');

const childToParent = () => {
   
}
Componente pai

Em seguida, passe a função childToParent como prop para o componente filho.

<Child childToParent={childToParent}/>
Passando childToParent para o componente filho.

Agora, em nosso componente filho, aceite essa chamada de função como props e atribua-a em um evento onClick.

Além disso, declare um estado que contenha alguns dados na forma de uma string ou um número.

Passe os dados na função parentToChild como parâmetros.

import React from 'react'
import { Button } from 'semantic-ui-react';

export default function Child({childToParent}) {
    const data = "Estes são os dados do componente filho para o componente pai."
    return (
        <div>
            <Button primary onClick={() => childToParent(data)}>Clique no filho</Button>
        </div>
    )
}
Componente filho

Em seguida, no componente pai, aceite esses dados na função childToParent como parâmetro. Depois, defina data usando o hook useState.

import './App.css';
import { useState } from 'react';
import Child from './Child';

function Parent() {
  const [data, setData] = useState('');
  
  const childToParent = (childdata) => {
    setData(childdata);
  }

  return (
    <div className="App">
      <div>
        <Child/>
      </div>
    </div>
  );
}

export default Parent;
Componente pai

Em seguida, mostre a variável data na função de retorno.

import './App.css';
import { useState } from 'react';
import Child from './Child';

function Parent() {
  const [data, setData] = useState('');
  
  const childToParent = (childdata) => {
    setData(childdata);
  }

  return (
    <div className="App">
     {data}
      <div>
        <Child childToParent={childToParent}/>
      </div>
    </div>
  );
}

export default Parent;
Componente pai

Os dados do filho sobrescreverão os do pai quando o botão Clique no filho for clicado.

Screenshot-2021-06-06-134803
Texto exibido: "Estes são os dados que vão do componente filho para o componente pai." - Texto do botão: "Clique no filho"

Agora, você pode passar dados de filho para pai e de pai para filho como um profissional.

Você também pode passar eventos, como onClick ou OnChange

Simplesmente chame um método alert na função childToParent e passe aquela função como uma prop para o componente filho.

import './App.css';
import Child from './Child';

function Parent() {
  const childToParent = () => {
    alert("Este é um alerta do componente filho")
  }

  return (
    <div className="App">
      <div className="child">
        <Child childToParent={childToParent}/>
      </div>
    </div>
  );
}

export default Parent;
Componente pai

No componente filho, aceite a função childToParent como uma prop. Em seguida, atribua-a a um evento onClick em um botão.

import React from 'react'
import { Button } from 'semantic-ui-react';

export default function Child({childToParent}) {
    return (
        <div>
            <Button primary onClick={() => childToParent()}>Clique no filho</Button>
        </div>
    )
}
Componente filho

Sua função no componente pai será chamada quando você clicar no botão no componente filho e você verá o alerta:

Screenshot-2021-06-06-140405
Texto exibido no alerta: "Este é um alerta do componente filho." - Texto do botão: "Clique no filho"

É isso!

Você pode encontrar o código no Github se quiser experimentar um pouco mais.

Por hoje é só, pessoal. Bom aprendizado.