Mudanças entre as edições de "React.js: Menus e alternando conteúdos"

De Aulas
Linha 1: Linha 1:
 +
  
  
Linha 32: Linha 33:
 
       <div>
 
       <div>
 
         <h1>Bem-vindo à Página Inicial!</h1>
 
         <h1>Bem-vindo à Página Inicial!</h1>
         <p>Este é o conteúdo da página Home.</p>
+
         <p>Este é o conteúdo da página Home do site {this.props.name}.</p>
 
       </div>
 
       </div>
 
     );
 
     );
Linha 39: Linha 40:
  
 
export default Home;
 
export default Home;
</syntaxhighlight>Lembre-se, o componente pode ser uma função também, o que em alguns casos pode simplificar em termos visuais
+
</syntaxhighlight>Lembre-se, o componente pode ser uma função também, o que em alguns casos pode simplificar em termos visuais. Por exemplo, o código acima pode ser apresentado também da seguinte forma:<syntaxhighlight lang="javascript">
 +
import React from 'react';
 +
 
 +
const Home = ({ name }) => (
 +
  <>
 +
    <h1>Bem-vindo à Página Inicial!</h1>
 +
    <p>Este é o conteúdo da página Home do site {name}.</p>
 +
  </>
 +
);
 +
 
 +
export default Home;
 +
</syntaxhighlight>
  
 
== Conteúdo da Página Sobre ==
 
== Conteúdo da Página Sobre ==
E teremos também o <code>About.js</code>:<syntaxhighlight lang="javascript">
+
E teremos também o <code>About.jsx</code>:<syntaxhighlight lang="javascript">
import React, { Component } from 'react';
+
import React from 'react';
  
class About extends Component {
+
const About = () => (
  render() {
+
  <>
    return (
+
    <h1>Sobre nós</h1>
      <div>
+
    <p>Este é o conteúdo da página About.</p>
        <h1>Sobre nós</h1>
+
  </>
        <p>Este é o conteúdo da página About.</p>
+
);
      </div>
 
    );
 
  }
 
}
 
  
 
export default About;
 
export default About;
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== App.js ==
+
== App.jsx ==
 
Por fim, temos o código do nosso <code>App.js</code> alterado para gerenciar o <code>Navbar</code> (menu) e os conteúdos:<syntaxhighlight lang="javascript">
 
Por fim, temos o código do nosso <code>App.js</code> alterado para gerenciar o <code>Navbar</code> (menu) e os conteúdos:<syntaxhighlight lang="javascript">
import React, { Component } from 'react';
+
import { Component } from 'react';
import './App.css'; // Importando o CSS externo
+
import 'bootstrap/dist/css/bootstrap.min.css';
 
import Home from './Home';
 
import Home from './Home';
 
import About from './About';
 
import About from './About';
Linha 70: Linha 77:
 
   constructor(props) {
 
   constructor(props) {
 
     super(props);
 
     super(props);
     this.state = {
+
    // Como o nome do site não precisamos alterar, então
      content: 'Home',
+
    // não precisa ser state, apenas atributo da classe.
    };
+
    this.siteName = "Meu Site";
 +
    // State para gerenciar qual a página será o conteúdo.
 +
     this.state = { content: 'Home' };
 
   }
 
   }
  
   /* Tratamento do clique do menu para alterar o conteúdo da página.
+
   /*
    Isso deve ser gerenciado por meio de um state.
+
    Tratamento do clique do menu para alterar o conteúdo da
 +
    página. Isso deve ser gerenciado por meio de um state.
 
   */
 
   */
 
   handleMenuClick = (page) => {
 
   handleMenuClick = (page) => {
Linha 82: Linha 92:
 
   };
 
   };
  
   /* Renderizador da Navbar com os ítens do menu. Veja que ao clicar,
+
   /*
    chamamos a função de tratamento do click do menu.
+
    Renderizador da Navbar com os ítens do menu. Veja que ao
 +
    clicar, chamamos a função de tratamento do click do menu.
 +
    Veja que agora estamos usando o bootstrap. Contudo, diferente
 +
    do HTML normal onde usamos class="...", aqui usamos className.
 
   */
 
   */
 
   renderNavbar() {
 
   renderNavbar() {
 
     return (
 
     return (
       <nav className="navbar">
+
       <nav className="navbar navbar-expand-lg navbar-dark bg-dark">
         <ul className="navList">
+
         <div className="container-fluid">
          <li className="navItem" onClick={() => this.handleMenuClick('Home')}>
+
          <a className="navbar-brand" href="#">{this.siteName}</a>
            Início
+
          <button className="navbar-toggler" type="button"
          </li>
+
            data-bs-toggle="collapse" data-bs-target="#navbarNav">
          <li className="navItem" onClick={() => this.handleMenuClick('About')}>
+
            <span className="navbar-toggler-icon"></span>
             Sobre
+
          </button>
           </li>
+
          <div className="collapse navbar-collapse" id="navbarNav">
         </ul>
+
            <ul className="navbar-nav">
 +
              <li className="nav-item">
 +
                <a className="nav-link" href="#"
 +
                onClick={() => this.handleMenuClick('Home')}>Início</a>
 +
              </li>
 +
              <li className="nav-item">
 +
                <a className="nav-link" href="#"
 +
                onClick={() => this.handleMenuClick('About')}>Sobre</a>
 +
              </li>
 +
             </ul>
 +
           </div>
 +
         </div>
 
       </nav>
 
       </nav>
 
     );
 
     );
 
   }
 
   }
  
   /* Renderizamos o conteúdo por meio de um condicional if. Pegamos do state
+
   /*
    qual o ítem que foi clicado e então chamamos a classe específica.
+
    Renderizamos o conteúdo por meio de um condicional if. Pegamos do state
 +
    qual o ítem que foi clicado e então chamamos a classe específica.
 
   */
 
   */
 
   renderContent() {
 
   renderContent() {
 
     const { content } = this.state;
 
     const { content } = this.state;
 
     if (content === 'Home') {
 
     if (content === 'Home') {
       return <Home />;
+
      // Ao chamar Home, passamos o nome do site como parâmetro.
 +
       return <Home name={this.siteName} />;
 
     } else if (content === 'About') {
 
     } else if (content === 'About') {
 
       return <About />;
 
       return <About />;
Linha 112: Linha 138:
 
   }
 
   }
  
   /* Função de renderização da aplicação */
+
   /*
 +
    Aqui construímos nossa aplicação com a estrutura do navbar,
 +
    do conteúdo e do rodapé. O conteúdo será alterado conforme
 +
    o que selecionarmos no menu, ou navbar.
 +
  */
 
   render() {
 
   render() {
 
     return (
 
     return (
 
       <div className="App">
 
       <div className="App">
        {/* Navbar */}
 
 
         {this.renderNavbar()}
 
         {this.renderNavbar()}
  
        {/* Conteúdo dinâmico */}
+
         <div className="container mt-4">
         <div className="content">
 
 
           {this.renderContent()}
 
           {this.renderContent()}
 
         </div>
 
         </div>
  
        {/* Rodapé */}
+
         <footer className="bg-dark text-light text-center py-3 mt-5">
         <footer className="footer">
+
           <p>© 2024 {this.siteName}. Todos os direitos reservados.</p>
           <p>© 2024 MeuSite. Todos os direitos reservados.</p>
 
 
         </footer>
 
         </footer>
 
       </div>
 
       </div>
Linha 134: Linha 161:
  
 
export default App;
 
export default App;
 
 
</syntaxhighlight>
 
</syntaxhighlight>

Edição das 08h48min de 23 de abril de 2025



Afluentes: Desenvolvimento Front-end II

Alterando o Conteúdo

O aplicativo criado com o Vite é muito legal e prático, mas o que é criado é apenas o motor do que vamos querer trabalhar, então pode não ser muito bom esteticamente quando estamos lidando com a identidade visual de uma empresa, organização ou mesmo gosto pessoal. Então, o que vamos fazer aqui é excluir, ou comentar os arquivos CSS usados pelo nosso aplicativo.

No arquivo src/main.jsx, exclua ou comente a linha abaixo

import './index.css'

Podemos criar um CSS customizado na nossa página ou usar um pronto. Basta adicioná-lo com import. Veja que podemos apenas alterar o conteúdo de index.css sem problemas.

Contudo, no nosso caso, vamos usar o Bootstrap para vite no nosso aplicativo.

Primeiro, dentro da pasta raiz do nosso projeto já criado, vamos instalar o Bootstrap da seguinte forma:

npm install bootstrap

E agora podemos adicionar no nosso arquivo do aplicativo, src/App.js o import:

import 'bootstrap/dist/css/bootstrap.min.css';

Pronto! Nossa aplicação agora vai trabalhar com o visual do Bootstrap e sem o CSS básico que vem com o vite, que no nosso caso não ia ficar legal.

Conteúdo da Página Inicial

Agora vamos criar um arquivo JSX para o conteúdo da página inicial. Então, dentro de src crie o arquivo Home.jsx com o seguinte conteúdo:

import React, { Component } from 'react';

class Home extends Component {
  render() {
    return (
      <div>
        <h1>Bem-vindo à Página Inicial!</h1>
        <p>Este é o conteúdo da página Home do site {this.props.name}.</p>
      </div>
    );
  }
}

export default Home;

Lembre-se, o componente pode ser uma função também, o que em alguns casos pode simplificar em termos visuais. Por exemplo, o código acima pode ser apresentado também da seguinte forma:

import React from 'react';

const Home = ({ name }) => (
  <>
    <h1>Bem-vindo à Página Inicial!</h1>
    <p>Este é o conteúdo da página Home do site {name}.</p>
  </>
);

export default Home;

Conteúdo da Página Sobre

E teremos também o About.jsx:

import React from 'react';

const About = () => (
  <>
    <h1>Sobre nós</h1>
    <p>Este é o conteúdo da página About.</p>
  </>
);

export default About;

App.jsx

Por fim, temos o código do nosso App.js alterado para gerenciar o Navbar (menu) e os conteúdos:

import { Component } from 'react';
import 'bootstrap/dist/css/bootstrap.min.css';
import Home from './Home';
import About from './About';

class App extends Component {
  constructor(props) {
    super(props);
    // Como o nome do site não precisamos alterar, então
    // não precisa ser state, apenas atributo da classe.
    this.siteName = "Meu Site";
    // State para gerenciar qual a página será o conteúdo.
    this.state = { content: 'Home' };
  }

  /*
    Tratamento do clique do menu para alterar o conteúdo da
    página. Isso deve ser gerenciado por meio de um state.
  */
  handleMenuClick = (page) => {
    this.setState({ content: page });
  };

  /*
    Renderizador da Navbar com os ítens do menu. Veja que ao
    clicar, chamamos a função de tratamento do click do menu.
    Veja que agora estamos usando o bootstrap. Contudo, diferente
    do HTML normal onde usamos class="...", aqui usamos className.
  */
  renderNavbar() {
    return (
      <nav className="navbar navbar-expand-lg navbar-dark bg-dark">
        <div className="container-fluid">
          <a className="navbar-brand" href="#">{this.siteName}</a>
          <button className="navbar-toggler" type="button"
            data-bs-toggle="collapse" data-bs-target="#navbarNav">
            <span className="navbar-toggler-icon"></span>
          </button>
          <div className="collapse navbar-collapse" id="navbarNav">
            <ul className="navbar-nav">
              <li className="nav-item">
                <a className="nav-link" href="#"
                onClick={() => this.handleMenuClick('Home')}>Início</a>
              </li>
              <li className="nav-item">
                <a className="nav-link" href="#"
                onClick={() => this.handleMenuClick('About')}>Sobre</a>
              </li>
            </ul>
          </div>
        </div>
      </nav>
    );
  }

  /*
    Renderizamos o conteúdo por meio de um condicional if. Pegamos do state
    qual o ítem que foi clicado e então chamamos a classe específica.
  */
  renderContent() {
    const { content } = this.state;
    if (content === 'Home') {
      // Ao chamar Home, passamos o nome do site como parâmetro.
      return <Home name={this.siteName} />;
    } else if (content === 'About') {
      return <About />;
    }
  }

  /*
    Aqui construímos nossa aplicação com a estrutura do navbar,
    do conteúdo e do rodapé. O conteúdo será alterado conforme
    o que selecionarmos no menu, ou navbar.
  */
  render() {
    return (
      <div className="App">
        {this.renderNavbar()}

        <div className="container mt-4">
          {this.renderContent()}
        </div>

        <footer className="bg-dark text-light text-center py-3 mt-5">
          <p>© 2024 {this.siteName}. Todos os direitos reservados.</p>
        </footer>
      </div>
    );
  }
}

export default App;