Мое путешествие по React началось четыре года назад с функциональных компонентов и хуков. Затем появился Сисве, один из участников учебного курса и наш постоянный энтузиаст компонентов. В то время как остальные из нас работали над командными проектами с функциональными компонентами, «Сисве с непоколебимой преданностью цеплялся за классовые компоненты».
Думайте о них как о кубиках Lego: вы можете комбинировать их по-разному, создавая сложные конструкции. Это независимые и многократно используемые фрагменты кода, инкапсулирующие пользовательский интерфейс и логику.
Повторное использование компонента внутри другого компонента обычно выглядит так:
import MyComponent from './MyComponent'; function ParentComponent() { return (); }
Компоненты класса и функциональные компоненты — два основных способа создания компонентов в 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
Это компонент класса, созданный с использованием классов JavaScript, расширяющих класс 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
С другой стороны, это функциональный компонент, написанный как простая функция JavaScript.
Компоненты класса управляют своим внутренним состоянием с помощью this.state. Обычно он инициализируется в конструкторе, доступ к нему осуществляется с помощью объекта this.state и обновляется с помощью метода this.setState, как показано в блоке кода выше.
Функциональные компоненты изначально не имели состояния. Но с появлением хуков они получили возможность управлять логикой состояний и жизненного цикла. Используя хук useState для управления состоянием, он возвращает пару значений: текущее состояние и функцию для его обновления, как показано выше. Этого достаточно для простого управления состоянием. Для более сложной логики состояния, включающей несколько подзначений, или когда следующее состояние зависит от предыдущего, вы можете использовать useReducer.
Например:
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))} />
Здесь useReducer управляет несколькими значениями состояния и сложной логикой обновления структурированным и удобным в обслуживании способом. Хуки предназначены исключительно для функциональных компонентов.
Никогда напрямую не изменяйте и не мутируйте объект состояния, независимо от типа компонента. Вместо этого создайте новый объект с обновленными значениями. Такой подход помогает React эффективно отслеживать изменения и оптимизировать повторный рендеринг.
Пример функционального компонента:
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)} />
Пример компонента класса:
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)} />
В обоих примерах мы обновляем свойство name объекта пользователя, сохраняя при этом целостность исходного объекта. Это гарантирует создание нового объекта состояния, сохраняя неизменность и предотвращая потенциальные проблемы с обновлениями состояния. Соблюдение этого правила обеспечивает предсказуемое поведение, оптимизацию производительности и упрощение отладки.
Функциональный подход обычно считается более кратким и читабельным, и его часто бывает достаточно из-за простоты и эффективности. Однако компоненты классов обеспечивают больший контроль над методами управления состоянием и жизненным циклом, особенно при работе со сложной логикой или оптимизацией производительности. Это означает лучшую структуру для организации сложной логики.
Выбор между классовыми и функциональными компонентами не всегда однозначен, так как не существует строгого правила. Оцените требования вашего компонента и выберите тот тип, который лучше всего соответствует требованиям вашего проекта.
С каким компонентом вам больше нравится работать?
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3