Как использовать хук в компоненте класса

Как использовать хук в компоненте класса

5 апреля 2022 г.

Знаете ли вы, что вы можете использовать крючки в компонентах класса?


Ладно, я вру, вроде. Вы не можете использовать хук непосредственно в компоненте класса, но вы можете использовать хук в обернутом функциональном компоненте с помощью render prop для достижения этой цели. .


Прежде чем продолжить, если вы можете преобразовать свой компонент класса в функциональный компонент, отдайте предпочтение этому. Но если по какой-либо причине компонент должен оставаться компонентом класса, этот шаблон прекрасно работает. Скорее всего, вы столкнетесь с этим сценарием при работе над зрелой кодовой базой React.


Прелесть этого шаблона в том, что вы можете создавать новые компоненты как функциональные компоненты, используя хуки. Компоненты класса, которые по какой-либо причине не могут быть обновлены, пользуются той же функциональностью благодаря тонкому уровню совместимости, компоненту-оболочке.


Давайте сначала создадим крючок.


```javascript


импортировать {useEffect, useState} из "реагировать";


функция экспорта useDarkMode() {


// Взято с https://usehooks.com/useDarkMode/


// Чтобы это сохранялось, мы должны использовать localStorage или какой-либо другой тип


// способа сохранения между сессиями.


// см. напр. https://usehooks.com/useLocalStorage/


const [enabledState, setEnabledState] = useState (false);


константа включена = EnabledState;


использоватьЭффект(() => {


const className = "темный режим";


константный элемент = документ.тело;


если (включено) {


element.classList.add (имя класса);


} еще {


element.classList.remove (имя класса);


}, [включено]);


возврат [включено, setEnabledState];


Теперь давайте создадим функциональный компонент, который имеет свойство рендеринга. Обратите внимание, что реквизит не обязательно должен называться «рендеринг» буквально, но он имеет тенденцию передавать свое назначение.


```jsx


// Обычно я бы не назвал компонент как-то так.


// Это просто для того, чтобы показать, что он делает для целей статьи


const UseDarkModeHookWrapperComponent = ({ render }) => {


const [darkMode, setDarkMode] = useDarkMode (false);


// Использует свойство рендеринга, называемое рендерингом, которое будет отображать значение и


// сеттер для пользовательского хука


вернуть рендер (темный режим, установить темный режим);


А теперь давайте используем компонент-оболочку в компоненте класса.


```jsx


экспорт класса по умолчанию Приложение расширяет компонент {


оказывать() {


вернуть (


<UseDarkModeHookWrapperComponent


render={(darkMode, setDarkMode) => {


вернуть (


<дел


стиль = {{


отображение: "сетка",


gridTemplateColumns: "200px",


разрыв: "2рем",


максимальная ширина: "50%",


placeItems: "центр"



Привет



И вуаля! Вы используете свой хук в компоненте класса. Вот [полное приложение в действии] (https://codesandbox.io/s/recursing-haibt-uxgkke).


Если вы хотите увидеть реальный пример, посмотрите не дальше кодовой базы Forem. Вот [хук useMediaQuery] (https://github.com/forem/forem/blob/main/app/javascript/shared/components/useMediaQuery.js), а вот [компонент-оболочка] (https://github. com/forem/forem/blob/main/app/javascript/shared/components/MediaQuery.jsx). Если вы хотите увидеть его в действии, он вызывается в компоненте ReadingList.


Фотография Джейми Маточиньос на Unsplash


Также опубликовано [Здесь] (https://www.iamdeveloper.com/posts/using-a-hook-in-a-class-component-3eh2/)



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE