Aula 6
React
Renderização Condicional, Re-renderização e Estilização
Renderização Condicional
Renderização condicional em React é o processo de decidir o que exibir na interface do usuário com base em certas condições.
Exemplos de Renderização Condicional
Operador Ternário
const UserGreeting = ({ isLoggedIn }) => {
return (
<div>
{isLoggedIn ? <h1>Welcome back!</h1> : <h1>Please log in.</h1>}
</div>
);
}
Short-circuit Evaluation (`&&`)
const Notification = ({ showNotification }) => {
return (
<div>
{showNotification && <p>You have new messages!</p>}
</div>
);
}
Função que Retorna JSX
const Greeting = ({ isLoggedIn }) => {
const renderGreeting = () => {
if (isLoggedIn) {
return <h1>Welcome back!</h1>;
}
return <h1>Please sign in.</h1>;
}
return <div>{renderGreeting()}</div>;
}
Re-renderização de Componentes
Em React, os componentes re-renderizam quando há alterações no estado, nas props, ou em raros casos, forçando a atualização manualmente.
Alterações no State
const Counter = () => {
const [count, setCount] = React.useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
Alterações nas Props
const Display = ({ message }) => {
return <h1>{message}</h1>;
}
const App = () => {
const [text, setText] = React.useState('Hello');
return (
<div>
<Display message={text} />
<button onClick={() => setText('World')}>Change Message</button>
</div>
);
}
Force Update
const App() => {
const [, forceUpdate] = React.useState(0);
return (
<div>
<button onClick={() => forceUpdate(n => n + 1)}>Force Update</button>
</div>
);
}
Estilização Dinâmica
Estilização dinâmica permite aplicar estilos com base no estado ou nas props do componente.
Styled Components
import styled from 'styled-components';
const Button = styled.button\`
background: \${props => (props.primary ? 'blue' : 'gray')};
color: white;
padding: 10px;
border: none;
border-radius: 5px;
cursor: pointer;
\`;
function App() {
return (
<div>
<Button primary>Primary</Button>
<Button>Secondary</Button>
</div>
);
}
Alternativas ao Styled Components
Emotion
/** @jsxImportSource @emotion/react */
import { css } from '@emotion/react';
const buttonStyle = primary => css\`
background: \${primary ? 'blue' : 'gray'};
color: white;
padding: 10px;
border: none;
border-radius: 5px;
cursor: pointer;
\`;
function Button({ primary, children }) {
return <button css={buttonStyle(primary)}>{children}</button>;
}
Tailwind CSS
const App = () => {
return (
<div>
<button className="bg-blue-500 text-white p-2 rounded">Primary</button>
<button className="bg-gray-500 text-white p-2 rounded">Secondary</button>
</div>
);
}
CSS Modules
/* Button.module.css */
.button {
padding: 10px;
border-radius: 5px;
border: none;
color: white;
}
.primary {
background-color: blue;
}
.secondary {
background-color: gray;
}
import styles from './Button.module.css';
const Button = ({ primary, children }) => {
const className = primary ? styles.primary : styles.secondary;
return <button className={\`\${styles.button} \${className}\`}>{children}</button>;
}
Material-UI
import Button from '@mui/material/Button';
const App = () => {
return (
<div>
<Button variant="contained" color="primary">Primary</Button>
<Button variant="contained" color="secondary">Secondary</Button>
</div>
);
}