Apostila - Módulo 3 - Bootcamp Desenvolvedor (A) React
Apostila - Módulo 3 - Bootcamp Desenvolvedor (A) React
Apostila - Módulo 3 - Bootcamp Desenvolvedor (A) React
2021
Módulo 3 – React II
Bootcamp Desenvolvedor(a) React
Danilo Ferreira e Silva
© Copyright do Instituto de Gestão e Tecnologia da Informação.
Todos os direitos reservados.
2.3. Interfaces............................................................................................. 8
2.5. Funções............................................................................................... 9
2.7. Classes.............................................................................................. 10
Capítulo 9. Context................................................................................... 21
10.1. useMemo......................................................................................... 23
Referências 33
npm install
npm start
// Arrays...
const varArrayNumber: number[] = [1, 2, 3];
const varArrayString: string[] = ["a", "b", "c"];
// e Objetos.
const varObjeto: { x: number, y: number } = { x: 1, y: 2 };
2.3. Interfaces
// Outro exemplo, notem que literais podem ser usados como tipos
type Alinhamento = "esquerda" | "direita" | "centro";
let varAlinhamento: Alinhamento = "direita";
2.5. Funções
2.7. Classes
class Retangulo {
altura: number;
largura: number;
calculaArea(): number {
// ...
}
}
3.1. Instalação
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
/>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" />
function App() {
return <Button color="primary">Hello World</Button>;
}
function App() {
const classes = useStyles();
return <Button className={classes.customClass}>Hello World</Button>;
}
function App() {
return (
<BrowserRouter>
<Switch>
<Route path="/rota1">
<Componente1 />
</Route>
<Route path="/rota2">
<Componente2 />
</Route>
<Redirect to={{ pathname: "/rota1" }} />
</Switch>
</BrowserRouter>
);
}
function MeuComponente() {
return (
<div>
<Link to="/rota1" />
</div>
);
}
Uma rota pode ser composta por segmentos dinâmicos, que chamamos de
parâmetros da rota. Por exemplo, podemos definir a rota /calendar/:month, onde
month é um parâmetro.
function MeuComponente() {
const { month } = useParams<{ month: string }>();
}
Em certos casos, pode ser necessário utilizar o hook useHistory para ter
acesso ao objeto history, que permite obter detalhes da rota atual, bem como
function MeuComponente() {
const history = useHistory();
return <button onClick={() => history.push("/outra-rota")}>Navegar</button>;
}
O hook useRef nos permite armazenar um valor que persiste durante toda a
vida de um componente, assim como o useState. A grande diferença entre ambos é
que mudanças no valor de useRef não fazem que o componente seja renderizado
novamente.
Embora o useRef possa ser utilizado para variados propósitos, ele é mais
frequentemente utilizado para armazenar referências a elementos, para que
tenhamos acesso direto ao DOM. No React, todo elemento HTML aceita uma
propriedade ref que pode receber um objeto criado com useRef. Ao renderizar o
componente, a referência ao elemento correspondente do DOM é armazenada no
objeto. O exemplo a seguir demonstra esse comportamento:
function MeuComponente() {
const meuRef = useRef<HTMLInputElement | null>(null);
return (
<div>
<input ref={meuRef} />
<button onClick={() => meuRef.current?.focus()}>Dá foco no campo</button>
</div>
);
}
• useRef recebe como parâmetro o valor inicial. Como não temos acesso
ao elemento input diretamente, precisamos inicializar com o valor null.
• Acessamos o valor armazenado por meio da propriedade current.
• useRef recebe o tipo parametrizado HTMLInputElement ou null. Isso é
necessário, neste caso, pois se omitíssemos o tipo, o compilador
inferiria o tipo como null, visto que esse é o valor inicial.
Por fim, vale ressaltar que useRef também pode ser usado para armazenar
valores arbitrários. Outro tipo de uso comum é utilizá-lo para armazenar um id gerado
para o elemento, de forma que ele persista durante toda a vida do componente.
A API Context nos permite passar valores entre componentes sem precisar
repassá-los via props. Isso é particularmente útil quando precisamos passar valores
do topo da hierarquia de componentes para componentes que estão vários níveis
abaixo. Na aplicação Agenda React, esse foi o caso das informações de usuário
logado, que eram repassadas por vários componentes até chegarem naquele que
realmente as utilizava.
function MeuComponente() {
const auth = useContext(authContext);
return <div>{auth.user.name}</div>;
}
Uma das principais vantagens de utilizar React é que ele cuida da atualização
dos elementos do DOM, enquanto precisamos cuidar apenas que nosso componente
renderize o virtual DOM correto. O React renderiza os componentes sempre que
houver mudanças de estado e, por padrão, todos os componentes descendentes são
renderizados novamente. Normalmente, isso não é um problema, pois o algoritmo de
comparação do virtual DOM é bastante rápido. No entanto, em determinadas
situações, pode ser necessário evitar renderizações desnecessárias ou a execução
de cálculos pesados.
10.1. useMemo
O hook useMemo pode ser usado para computar um valor apenas quando
um conjunto de dependências informado sofrer alguma alteração. Considere o
exemplo a seguir:
function MeuComponente() {
const [valor1] = useState(1);
const [valor2] = useState(2);
const [valor3] = useState(3);
function MeuComponente() {
const [valor1] = useState(1);
const [valor2] = useState(2);
return (
<div>
<Comp1 n={valor1} />
<Comp2 n={valor2} />
</div>
);
}
10.3. useCallback
function MeuComponente() {
const [counter, dispatch] = useReducer(reducer, 0);
return (
<div>
<button onClick={() => dispatch({ type: "increment" })}>Increment</butto
n>
<button onClick={() => dispatch({ type: "reset" })}>Reset</button>
</div>
);
}
É importante ter em mente que funções reducer devem ser puras, ou seja,
não podem ter efeitos colaterais. Além disso, o estado deve ser tratado como um
objeto imutável, devemos apenas retornar o próximo estado sem alterar o atual.
Mais do que apenas uma biblioteca, o Redux estabelece uma arquitetura para
a aplicação, que pode ser resumida em três pontos principais:
Nos componentes React, usamos o estado e a função dispatch por meio dos
hooks useSelector e useDispatch. No entanto, para uso em TypeScript, é
necessário reexportar esses hooks com a tipagem correta, específica para sua
aplicação, o que pode ser feito com o código abaixo.
function App() {
function MyComponent() {
const counter = useAppSelector((state) => state.counter);
const dispatch = useAppDispatch();
return (
<div>
<div>{counter}</div>
<button onClick={() => slice.actions.increment()}>Increment</button>
</div>
);
}