предисловие
В этой статье не будетReact
Содержание конкретных приложений является лишь некоторым дляhooks
По сравнению с предыдущим компонентом класса, дляhooks
собственное мышление.
Автор присоединился к текущей компании в августе этого года, из первоначальнойvue
Перевести вReact
. Поскольку у компании все еще есть несколько старых проектов, она не полностью инвестировала в раннюю стадию.React
проект находится в разработке. С октября я участвовал в процессе строительства нового проекта на уровне компании от 0 до 1, что также является моим первымReact
проект. мы полны объятийhooks
Да, во время разработки этого проекта я также написал много кастомныхhooks
метод, который включает в себя несколько общих функциональных компонентов, которые можно считать опытнымиReact
конкретные приложения.
На ранней стадии разработки проекта у меня всегда были сомнения, я узнал, прежде чем приступить к работеReact
Фактически, в то время многие учебники использовали метод компонентов класса, который редко можно увидеть.hooks
соответствующие учебники. Когда я пишу демонстрации во время обучения, я также использую метод написания компонентов класса, но сейчас все больше и больше команд начинают полностью охватыватьhooks
,hooks
Каковы преимущества? Ниже я представлю некоторые из своих собственных размышлений и идей.
Разница между компонентами класса и компонентами функций
Обратите внимание,类组件
а такжеhooks
, эти две вещи на самом деле не являются одним и тем же понятием.hooks
Просто набор инструментов для расширения функциональности функциональных компонентов. Настоящее сравнение должно быть类组件
а также函数组件
.
Давайте сначала посмотрим类组件
а также函数组件
разница.
Различия в написании кода
Это самое интуитивное отличие, код другой. Я случайным образом перечисляю несколько очень распространенных примеров, эти характеристики находятся в函数组件
Нет в.
- Компонент класса, как следует из названия, представляет собой класс, который необходимо наследовать.
Class
. - Компоненты класса могут напрямую определять состояние
- Компоненты класса имеют методы жизненного цикла
- Компоненты класса могут использовать это для получения экземпляра компонента.
Различия в ментальных моделях
Это самая большая разница между двумя компонентами, сДэн эту статьюв словах.
Функциональные компоненты фиксируют значения, используемые для рендеринга.
Приводим пример из статьи
function ProfilePage(props) {
const showMessage = () => {
alert('成功关注 ' + props.user);
};
const handleClick = () => {
setTimeout(showMessage, 3000);
};
return (
<button onClick={handleClick}>关注</button>
);
}
class ProfilePage extends React.Component {
showMessage = () => {
alert('成功关注 ' + this.props.user);
};
handleClick = () => {
setTimeout(this.showMessage, 3000);
};
render() {
return <button onClick={this.handleClick}>关注</button>;
}
}
мы используем类组件
так же как函数组件
Реализована та же логика. Оба компонента получатprops.user
свойство, мы нажимаем кнопку, через 3 секунды он будетalert
Сообщение об успешном переходе.
Если изначально было переданоprops
Значение{ user: '帅wowo' }
, затем нажимаем кнопку «следовать», в течение 3 секунд входящийprops
Значение изменилось и стало{ user: '丑wowo' }
. Эти два компонента будутalert
Что не так?
Студенты с опытом, безусловно, смогут легко ответить на него.
// 函数组件会打印
'成功关注 帅wowo'
// 类组件会打印
'成功关注 丑wowo'
Почему это так?(Обратите внимание, что этот пример аналогиченReact
Фреймворк не имеет ничего общего, простоjs
Основные функции, которые вы используете в любомjs
можно воспроизвести в написанном коде)
существуетReact
в компоненте класса ,props
Хотя без изменений,ноthis
всегда переменный. Когда запускается асинхронное событие, оно получаетprops
илиstate
Всегда в курсе. Конечно, у нас есть решение.
Например, мы можем переопределить данные, чтобы сохранить `props
handleClick = () => {
const {user} = this.props;
setTimeout(() => this.showMessage(user), 3000);
};
Но этот метод слишком громоздок, а данные различных определений весьма неизящны.
Или пишите события для функции рендераrender
середина
class ProfilePage extends React.Component {
render() {
const props = this.props;
const showMessage = () => {
alert('成功关注 ' + props.user);
};
const handleClick = () => {
setTimeout(showMessage, 3000);
};
return <button onClick={handleClick}>关注</button>;
}
}
Этот метод фактически является принципом функциональных компонентов,props
После изменения, хотя компонент перерисовывается, старыйprops
Сохранил замыканием, а потом распечатал.
Я так много написал, просто чтобы продемонстрировать это предложение,Функциональные компоненты фиксируют значения, используемые для рендеринга.
Почему мы используем функциональные компоненты + хуки
Многим может показаться, что это не нужно, они думают, что то, что официально выпущено, можно использовать как есть, и это очень легко написать, так зачем заморачиваться?
Что касается этого момента, я думаю, что самое важное — это изучить мышление больших парней, почему вы хотите сделатьhooks
Приходить? Это определенно исправить некоторые проблемы в исходном процессе разработки.React
Идеи команды на уровне дизайна могут в определенной степени отражать лучшие отраслевые практики в области проектирования фреймворков.
Далее я перечислю несколько, которые, по моему мнению,类组件
несколько болевых точек. (Хорошее и плохое сравниваются, эти болевые точки сравниваются только с函数组件+hooks而言
, технология постоянно развивается, и итерация технологии это нормальная тенденция)
1. Написание функциональных компонентов проще и гибче.
В функциональных компонентах нам не нужно наследоватьclass
Объектам не нужно запоминать эти жизненные циклы, не нужно определять данные в фиксированномstate
середина. Функции — это первоклассные граждане в js, а функциональное программирование позволяет нам более гибко организовывать код.
2. Компоненты класса имеют свои недостатки
Один на самом деле написан в разделе выше, если нам нужны данные, которые следуют только за представлением, мы не можем использовать их напрямую.props
илиstate
.
Другой наиболее распространен, т.React
, если мы определяем метод, мы должны использоватьbind
Или стрелочная функция для ограничения этого методаthis
объем .
Хотя мы можем решить эти две проблемы, по сути, мы решаем их с помощью практики кодирования.类组件
собственные недостатки.
Но в функциональной сборке у нас не будет этой проблемы, через путь закрытия,Во время рендеринга компонентprops
а такжеstate
не изменился, а сам переданный метод уже ограничен областью действия.
3. Логика разбросана и ее трудно использовать повторно
Эта болевая точка на самом делеvue2
точно такой же,React
компоненты класса иvue2
Модель развития похожа.
Я возьму йогурт, чтобы поговорить оvue2
а такжеvue3
Изображение разницы в качестве примера
Разные цвета здесь на самом деле разные логики.Эту диаграмму можно разделить на четыре части: данные, методы событий, жизненный цикл и шаблоны.
Мы видим, что логика фактически разбросана по компоненту класса, возьмемReact
Например, данные должны быть определены вstate
Затем вам нужно написать соответствующие методы событий, затем инициализировать логику в жизненном цикле, обработать при обновлении компонента и, наконец, записать в шаблонjsx
.
Если мы будем поддерживать этот код, это будет очень болезненно.Чтобы просмотреть логику, мы должны прокручивать вверх и вниз, чтобы узнать их соответствующие данные, методы, жизненные циклы и шаблоны.
И код таким образом,сложно повторно использовать, абстрагируя повторяющуюся логику, с которой мы столкнулисьmixin
,HOC & render-props
. Оба этих метода имеют самую большую проблему, т.props
Источник недостаточно ясен.mixin
Не говоря уже о том, что это все слезы, мы можем найти их только одну за другой.HOC
При многих уровнях вложенности может быть трудно определить источник, иHOC
Стоимость обучения относительно высока, и это не очень удобно для новичков.(Эта часть отжата мной.vue2
Используется для разработкиmixin
а такжеHOC
написано из моего опыта, т.к.React
новичок и не сталкивалсяReact
изmixin
а такжеHOC
Это вне эпохи логики, так что если есть проблема с написанием, пожалуйста, укажите на это. Наконец, вздох,React
использоватьHOC
Но это так удобно!)
Но если мы используемhooks
, я до сих пор использую одинvue3
Объясняется схема составного API в Китае, после чего следует использованиеhooks
Результаты аналогичны.
Каждая часть логики представляет собой единое целое, очень четкое. И вы можете извлечь всю эту логику, просто обратившись к этому компоненту.
Излишне говорить о повторном использовании логики, кто это сейчас?React
В проекте не так много настроекhooks
какие.
4.хуки больше соответствуют базовой концепции React
Философия дизайна ReactСтатья 1
Одна из основных идей React заключается в том, что одни и те же входные параметры должны давать одинаковые выходные данные. Короче говоря, это должна быть простая чистая функция.
Мы можем взять в качестве примера разницу в ментальных моделях, упомянутую ранее, где мы переходим вprops
параметр{ user: '帅wowo' }
, мы хотим, чтобы все события, связанные с этим параметром, сильно зависели от этих данных. это не должно быть похоже类组件
Опять же, переданные параметры не соответствуют полученному результату.
Но функциональные компоненты могут это сделать, повторите приведенное выше предложение,Во время рендеринга компонентprops
а такжеstate
не изменился.
Недостатки крючков.
Говоря о технологии, мы не можем быть слишком односторонними, мы должны придерживаться диалектического мышления и рационального анализа. выше много сказаноhooks
достоинства, но все же есть недостатки.
1. Относительно большая умственная нагрузка
Также из-за приведенного выше предложения,Во время рендеринга компонентprops
а такжеstate
не изменился. Эта особенность приводит к闭包陷阱
Сейчас это одна из самых распространенных проблем в нашей разработке. Мы всегда должны обращать внимание на то,hooks
Добавлены необходимые зависимости. При инкапсуляции некоторых компонентов с относительно сложными функциямиuseEffect
Устранение проблем дублирования рендеринга иногда может быть сложным и непростым в отладке.
Эта функция函数组件
Это также принесет много хлопот при выполнении оптимизации производительности, потому что каждый разprops
а такжеstate
Изменения в данных вызовут函数组件
Рендеринг всего в . нам нужно пройтиmemo
,useMemo
,useCallback
Эти методы вручную уменьшаютrender
. Когда компонент имеет сложную структуру и много вложенных компонентов, также возникает головная боль при решении проблемы зависимостей. Конкретный контент по оптимизации производительности вы можете найти в моей предыдущей статье.
Обучение, которое эти точки приносят разработчикамhooks
По сравнению с стоимостью类组件
будет больше.
2. Необходимость в более строгих спецификациях разработки
Как мы только что сказали, функциональное программирование может дать нам большую гибкость, и эта гибкость является обоюдоострым мечом в разработке. Это может помочь нам лучше решить некоторые сложные требования, но это не очень хорошо в проекте совместной разработки с несколькими людьми.
Для некоторых крупномасштабных проектов самым важным должна быть спецификация программирования,eslint
Спецификация синтаксиса может быть ограничена, но она не может ограничивать спецификацию наших требований к реализации.Один человек, одностильный код — это катастрофа для проекта.При последующем сопровождении разделение публичных методов принесет большие неприятности.
Поэтому разработчикам необходимо сформулировать конкретное техническое задание на разработку и строго соблюдать его при разработке.
компоненты класса 3.hooks и не могут полностью заменить
Хотя у нас многоhooks
способ улучшить函数组件
функция. НапримерuseState
может позволить函数组件
Сохраняйте собственные данные. имеютuseEffect
может в какой-то степени компенсировать函数组件
Недостатков жизненного цикла нет.
Уведомление:useEffect
Он не предназначен для замены жизненного цикла, он просто предоставляет метод, подобный жизненному циклу. Эти два понятия по существу несопоставимы.
Чтобы узнать больше, вы можете прочитать этот блог Дэна,A Complete Guide to useEffect, это может помочь вам лучше понятьhooks
серединаuseEffect
.
Однако мы до сих пор не можемhooks
полностью заменить компоненты класса.(главным образом потому, что часть жизненного цикла не может быть заменена)
НапримерcomponentDidCatch
Этот жизненный цикл получения ошибок компонентов определенно будет наблюдаться в большинстве проектов. Существуют и другие жизненные циклы, которые вам все еще могут понадобиться в некоторых особых сценариях.
Итак, в течение определенного периода времени,hooks
все еще будет следовать类组件
сосуществовать.
Суммировать
Все больше и больше компаний и команд уже полностью освоилиhooks
, теперь поговорим об использованииhooks
Не имеет значения, стоит ли доход по сравнению с усилиями.Большая тенденция указала вам направление.Официальная версия, недавно выпущенная в этом году.vue3
также заимствовалhooks
, что позволяет разработчикам организовывать логический код в виде составного API. Тенденция идет, и вы должны идти в ногу с ней.
спасибо, лайк
Спасибо, что прочитали. Если вы считаете, что эта статья была вам полезна, поставьте лайк и поддержите ее, спасибо.