Mi viaje en React comenzó hace cuatro años con componentes funcionales y Hooks. Luego vino 'Siswe, un compañero participante en el bootcamp y nuestro entusiasta residente del componente de clase. Mientras el resto de nosotros colaborábamos en proyectos de equipo con componentes funcionales, 'Siswe se aferraba a los componentes de clase con una lealtad inquebrantable.
Piense en ellos como ladrillos de Lego: puede combinarlos de varias maneras para crear estructuras complejas. Son piezas de código independientes y reutilizables que encapsulan la interfaz de usuario y la lógica.
La reutilización de un componente dentro de otro componente normalmente tiene este aspecto:
import MyComponent from './MyComponent'; function ParentComponent() { return (); }
Los componentes de clase y los componentes funcionales son las dos formas principales de crear componentes en 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 es un componente de clase, creado usando clases de JavaScript que extienden la clase 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
Este, por otro lado, es un componente funcional, escrito como una simple función de JavaScript.
Los componentes de clase administran su propio estado interno usando this.state. Por lo general, esto se inicializa en el constructor, se accede mediante el objeto this.state y se actualiza mediante el método this.setState, como se ve en el bloque de código anterior.
Los componentes funcionales inicialmente no tenían estado. Pero con la introducción de Hooks, obtuvieron la capacidad de gestionar la lógica del estado y del ciclo de vida. Utilizando el gancho useState para administrar el estado, devuelve un par de valores: el estado actual y una función para actualizarlo, como se ve arriba. Esto es suficiente para una gestión estatal sencilla. Para una lógica de estado más compleja que implique múltiples subvalores, o cuando el siguiente estado dependa del anterior, querrás usar useReducer.
Por ejemplo:
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))} />
Aquí, useReducer gestiona múltiples valores de estado y una lógica de actualización compleja de una manera estructurada y fácil de mantener. Los ganchos son exclusivamente para componentes funcionales.
Nunca modifique ni mute directamente el objeto de estado, independientemente del tipo de componente. En su lugar, cree un nuevo objeto con los valores actualizados. Este enfoque ayuda a React a realizar un seguimiento eficiente de los cambios y optimizar los renderizados.
Ejemplo 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)} />
Ejemplo de componente de clase:
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)} />
En ambos ejemplos, estamos actualizando la propiedad de nombre del objeto de usuario mientras preservamos la integridad del objeto original. Esto garantiza que se cree un nuevo objeto de estado, preservando la inmutabilidad y evitando posibles problemas con las actualizaciones de estado. El cumplimiento de esto garantiza un comportamiento predecible, optimizaciones del rendimiento y una depuración más sencilla.
El enfoque funcional generalmente se considera más conciso y legible, y a menudo es suficiente debido a su simplicidad y eficiencia. Sin embargo, los componentes de clase ofrecen más control sobre la gestión del estado y los métodos del ciclo de vida, especialmente cuando se trata de lógica compleja u optimización del rendimiento. Esto significa una mejor estructura para organizar la lógica compleja.
La elección entre componentes de clase y funcionales no siempre es clara, ya que no existe una regla estricta. Evalúe los requisitos de su componente y elija el tipo que mejor se adapte a los requisitos de su proyecto.
¿Con qué componente te gusta más trabajar?
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3