Artigo original: React Functional Components, Props, and JSX – React.js Tutorial for Beginners

O React é uma das bibliotecas mais populares do JavaScript para a criação de interfaces de usuário.

Se você quer se tornar um desenvolvedor de front-end ou encontrar um emprego como desenvolvedor para a web, você provavelmente vai se beneficiar aprendendo React em detalhes.

Nesta publicação, você aprenderá alguns conceitos básicos sobre o React, como a criação de componentes, a sintaxe do JSX e props. Se você tem pouca ou nenhuma experiência com o React, este artigo é para você.

Para começar, é assim que você instala o React (texto do autor, em inglês - se quiser ver os passos de instalação em português, a documentação do React já está traduzida 😀).

O que é o JSX?

A primeira coisa que você perceberá após instalar seu primeiro projeto em React é que uma função em JavaScript retorna código em HTML:

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
      </header>
    </div>
  );
}

Essa é uma extensão de sintaxe especial e válida para o React, chamada JSX (JavaScript XML). Normalmente, em projetos relacionados ao front-end, mantemos o código em HTML, CSS e JavaScript em arquivos separados. No React, porém, isso funciona de um modo um pouco diferente.

Nos projetos em React, não criamos arquivos em HTML separados, pois o JSX nos permite escrever uma combinação de HTML e JavaScript em um mesmo arquivo, como no exemplo acima. Você pode, no entanto, separar seu CSS em outro arquivo.

No começo, o JSX pode parecer um pouco estranho, mas não se preocupe. Você vai se acostumar.

O JSX é muito prático, pois podemos executar qualquer código em JavaScript (lógica, funções, variáveis e assim por diante) dentro do HTML diretamente usando chaves { }, da seguinte maneira:

function App() {
  const text = 'Hello World';
  
  return (
    <div className="App">
      <p> {text} </p>
    </div>
  );
}

Além disso, você pode atribuir tags HTML às variáveis em JavaScript:

const message = <h1>React is cool!</h1>;

Ou ainda retornar HTML dentro da lógica do JavaScript (como nos casos de instruções if-else):

render() {
    if(true) {
        return <p>YES</p>;
    } else {
        return <p>NO</p>;
    }
}

Não vou entrar em mais detalhes sobre o JSX, mas não se esqueça de levar em conta as seguintes regras ao escrever em JSX:

  • Tags de HTML e de componentes devem ser sempre fechadas < />
  • Alguns atributos mudam de nome, como “class”, que vira “className” (pois class faz referência às classes em JavaScript), “tabindex” se torna “tabIndex” e deve ser escrito em camelCase, e assim por diante
  • Não podemos retornar mais de um elemento HTML por vez, então, não se esqueça de envolver todos os elementos em um elemento pai, como uma div:
return (
  <div>
    <p>Hello</p>
    <p>World</p>
  </div>
);
  • ou, como alternativa, entre tags vazias (os chamados React Fragments):
return (
  <>
    <p>Hello</p>
    <p>World</p>
  </>
);

Você também pode assistir meu vídeo React Tutorial for Beginners para obter mais informações (em inglês):

O que são componentes de classe e funcionais?

Após se acostumar com a sintaxe do JSX, a próxima etapa é entender a estrutura baseada em componentes do React.

Se você revisitar o código de exemplo no começo do artigo, verá que o código em JSX está sendo retornado por uma função. Mas a função App( ) não é uma função comum. Ela é, de fato, um componente. Mas o que é um componente?

O que é um componente?

Um componente é um bloco de código reutilizável e independente, que divide a interface do usuário em partes menores. Por exemplo, se estivéssemos criando a UI do Twitter com React:

twit
Os componentes da newsfeed do Twitter

Em vez de criar toda a UI em um único arquivo, podemos (e devemos) dividir todas as seções (marcadas em vermelho na imagem acima) em partes menores independentes. Em outras palavras, esses são os componentes.

O React tem dois tipos de componentes: funcional e de classes. Vamos examinar os dois agora em detalhes.

Componentes funcionais

O primeiro tipo de componente do React, e o tipo que é recomendado, é o componente funcional. Um componente funcional, basicamente, é uma função em JavaScript/ES6 que retorna um elemento do React (JSX). De acordo com a documentação oficial do React, a função abaixo é um componente funcional válido:

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

Como alternativa, você pode criar um componente funcional com a definição por arrow function:

const Welcome = (props) => { 
  return <h1>Hello, {props.name}</h1>; 
}
Essa função é um componente do React válido, pois ele aceita um único  argumento de objeto "props" (palavra que significa "propriedades") com dados e retorna um elemento do React. — reactjs.org

Para conseguir usar um componente mais tarde, você precisa, primeiramente exportá-lo de modo a importá-lo em outro lugar:

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

export default Welcome;

Depois da importação, você pode chamar o componente, como no exemplo a seguir:

import Welcome from './Welcome';

function App() { 
  return (
    <div className="App">
      <Welcome />
    </div>
  );
}

Desse modo, um componente funcional em React:

  • é uma função em JavaScript/ES6
  • deve retornar um elemento em React (JSX)
  • sempre começa com letra maiúscula (convenção dos nomes)
  • aceita props como parâmetro, se necessário

O que são componentes de classe?

O segundo tipo de componente é o componente de classe. Os componentes de classe são classes do ES6 que retornam JSX. Abaixo, vemos a mesma função Welcome, dessa vez retornada como um componente de classe:

class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

Diferentemente dos componentes funcionais, os componentes de classe precisam ter um método render( ) adicional para retornar o JSX.

Por que usar componentes de classe?

Costumamos usar componentes de classe por causa do "state" (estado). Nas versões anteriores do React (versão anteriores à 16.8), não era possível usar o estado dentro de componentes funcionais.

Assim, precisávamos de componentes funcionais somente para renderizar a UI, e usávamos componentes de classe para o gerenciamento dos dados e algumas operações adicionais (como métodos do ciclo de vida).

Isso mudou com a introdução dos React Hooks. Agora, também podemos usar estados em componentes funcionais (tratarei de estado e dos hooks em um artigo posterior - não se preocupe com eles no momento).

Um componente de classe:

  • é uma classe do ES6, que será um componente quando fizer o ‘extends’ de um componente do React.
  • aceita Props (no construtor), se necessário
  • deve ter um método render( ) para retornar o JSX

O que são as props no React?

Outro conceito importante dos componentes é a forma como se comunicam. O React tem um objeto especial, chamado de prop (que significa propriedade), que usamos para transportar dados de um componente para o outro.

Mas cuidado – as props transportam dados apenas em uma direção (somente do elemento pai para os elementos filhos). Não é possível com as props passar dados do elemento filho para o pai, nem para componentes de mesmo nível.

Vamos revisitar a função App( ) acima para ver como passar dados com as props.

Primeiro, precisamos definir uma prop no componente Welcome e atribuir um valor a ela:

import Welcome from './Welcome';

function App() { 
  return (
    <div className="App">
      <Welcome name="John"/>
      <Welcome name="Mary"/>
      <Welcome name="Alex"/>
    </div>
  );
}

As props são valores personalizados e tornam os componentes mais dinâmicos. Como o componente Welcome é o elemento filho aqui, precisamos definir as props em seu pai (App), para podermos passar os valores e obter o resultado simplesmente acessando a prop "name":

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}
props

As props no React são muito úteis

Assim, os desenvolvedores em React usam as props para passar dados. Elas são muito úteis para isso. E quanto ao gerenciamento dos dados? As props são usadas para a passagem dos dados, mas não para sua manipulação. Tratarei do gerenciamento dos dados em React em artigos futuros aqui no freeCodeCamp.

Enquanto isso, se quiser aprender mais sobre desenvolvimento para a web e em React, inscreva-se no canal do YouTube do autor (em inglês).

Obrigado pela leitura!