Minha jornada React começou há quatro anos com componentes funcionais e ganchos. Depois veio 'Siswe, um colega participante do bootcamp e nosso entusiasta do componente de classe residente. Enquanto todos nós colaborávamos em projetos de equipe com componentes funcionais, 'Siswe se apegava aos componentes de classe com uma lealdade inabalável.
Pense neles como peças de Lego – você pode combiná-los de várias maneiras para criar estruturas complexas. Eles são pedaços de código independentes e reutilizáveis que encapsulam a interface do usuário e a lógica.
Reutilizar um componente dentro de outro componente normalmente se parece com isto:
import MyComponent from './MyComponent'; function ParentComponent() { return (); }
Componentes de classe e componentes funcionais são as duas principais maneiras de criar componentes no React.
import React, { Component } from 'react'; class Counter extends Component { constructor(props) { super(props); this.state = { count: 0 }; } handleClick = () => { this.setState({ count: this.state.count 1 }); }; render() { return (); } } export default Counter;You clicked {this.state.count} times
Este é um componente de classe, criado usando classes JavaScript que estendem a classe React.Component.
import React, { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); const handleClick = () => { setCount(count 1); }; return (); } export default Counter;You clicked {count} times
Por outro lado, este é um componente funcional, escrito como uma função JavaScript simples.
Os componentes da classe gerenciam seu próprio estado interno usando this.state. Normalmente é inicializado no construtor, acessado usando o objeto this.state e atualizado usando o método this.setState, conforme visto no bloco de código acima.
Os componentes funcionais eram inicialmente sem estado. Mas com a introdução dos Hooks, eles ganharam a capacidade de gerenciar o estado e a lógica do ciclo de vida. Utilizando o gancho useState para gerenciar o estado, ele retorna um par de valores: o estado atual e uma função para atualizá-lo, conforme visto acima. Isso é suficiente para um gerenciamento simples de estado. Para lógica de estado mais complexa envolvendo vários subvalores, ou quando o próximo estado depende do anterior, você deseja usar useReducer.
Por exemplo:
import React, { useReducer } from 'react'; const initialState = { count: 0, step: 1, }; const reducer = (state, action) => { switch (action.type) { case 'increment': return { ...state, count: state.count state.step }; case 'decrement': return { ...state, count: state.count - state.step }; case 'setStep': return { ...state, step: action.payload }; default: throw new Error(); } }; function Counter() { const [state, dispatch] = useReducer(reducer, initialState); const increment = () => dispatch({ type: 'increment' }); const decrement = () => dispatch({ type: 'decrement' }); const setStep = (newStep) => dispatch({ type: 'setStep', payload: newStep }); return (); } export default Counter;Count: {state.count}
Step: {state.step}
setStep(Number(e.target.value))} />
Aqui, useReducer gerencia vários valores de estado e lógica de atualização complexa de uma forma estruturada e sustentável. Os ganchos são exclusivamente para componentes funcionais.
Nunca modifique ou altere diretamente o objeto de estado, independentemente do tipo de componente. Em vez disso, crie um novo objeto com os valores atualizados. Essa abordagem ajuda o React a rastrear alterações com eficiência e otimizar novas renderizações.
Exemplo de componente funcional:
import React, { useState } from 'react'; function UserProfile() { const [user, setUser] = useState({ name: 'Jane Doe', age: 30 }); const handleNameChange = (newName) => { setUser({ ...user, name: newName }); // Create a new object with updated name }; return (); } export default UserProfile;Name: {user.name}
Age: {user.age}
handleNameChange(e.target.value)} />
Exemplo de componente de classe:
import React, { Component } from 'react'; class UserProfile extends Component { state = { user: { name: 'Jane Doe', age: 30 } }; handleNameChange = (newName) => { this.setState(prevState => ({ user: { ...prevState.user, name: newName } // Create a new object with updated name })); }; render() { return (); } } export default UserProfile;Name: {this.state.user.name}
Age: {this.state.user.age}
this.handleNameChange(e.target.value)} />
Em ambos os exemplos, estamos atualizando a propriedade name do objeto user enquanto preservamos a integridade do objeto original. Isto garante que um novo objeto de estado seja criado, preservando a imutabilidade e evitando possíveis problemas com atualizações de estado. A adesão a isso garante comportamento previsível, otimizações de desempenho e depuração mais fácil.
A abordagem funcional é geralmente considerada mais concisa e legível, e muitas vezes é suficiente devido à simplicidade e eficiência. No entanto, os componentes de classe oferecem mais controle sobre o gerenciamento de estado e os métodos de ciclo de vida, especialmente quando se trata de lógica complexa ou otimização de desempenho. Isso significa melhor estrutura para organizar lógica complexa.
A escolha entre componentes de classe e funcionais nem sempre é clara, pois não existe uma regra rígida. Avalie os requisitos do seu componente e escolha o tipo que melhor se alinha aos requisitos do seu projeto.
Com qual componente você mais gosta de trabalhar?
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3