Установка типов на useState
useStat позволяет управлять состоянием в вашем React приложении. Это эквивалент this.stateв компоненте класса.
import * as React from "react";
export const App: React.FC = () => {
const [counter, setCounter] = React.useState<number>(0)
return ( <div className="App">
<h1>Result: { counter }</h1>
<button onClick={() => setCounter(counter + 1)}>+</button>
<button onClick={() => setCounter(counter - 1)}>-</button>
</div>
);
Чтобы установить типы на useState , нужно перейти в <>тип состояния. Вы также можете использовать такой тип объединения, <number | null>если у вас нет начального состояния.
Установка типов на useRef
useRef возвращает изменяемый объект ref , который позволяет получить доступ DOM элементов.
import * as React from "react";
export const App: React.FC = () => {
const myRef = React.useRef<HTMLElement | null>(null)
return (
<main className="App" ref={myRef}>
<h1>My title</h1>
</main>
);
}
Как видите, способ получения useRefтипов такой же, как и у useState. Вам просто нужно передать его в <>- и, если у вас есть аннотации нескольких типов, просто используйте тип объединения.
Установка типов на useContext
useContext позволяет получать доступ и использовать данный контекст в приложении React.
import * as React from "react";
interface IArticle {
id: number
title: string
}
const ArticleContext = React.createContext<IArticle[] | []>([]);
const ArticleProvider: React.FC<React.ReactNode> = ({ children }) => {
const [articles, setArticles] = React.useState<IArticle[] | []>([
{id: 1, title: "post 1" },
{id: 2, title: "post 2" } ]);
return (
<ArticleContext.Provider value={{ articles }}>
{children}
</ArticleContext.Provider>
);
}
const ShowArticles: React.FC = () => {
const { articles } = React.useContext<IArticle[]>(ArticleContext);
return (
<div>
{articles.map((article: IArticle) => (
<p key={article.id}>{article.title}</p>
))}
</div> );
};
export const App: React.FC = () => {
return (
<ArticleProvider>
<h1>My title</h1>
<ShowArticles />
</ArticleProvider>
);
}
Здесь мы начинаем с создания IArticleинтерфейса, который является типом нашего контекста.
Затем мы используем его в createContext()методе для создания нового контекста, а затем инициализируем его []- вы также можете использовать его nullв качестве начального состояния, если хотите.
Теперь можем обрабатывать состояние контекста и устанавливать тип useContext, чтобы ожидать массив типа IArticle в качестве значения.
Установка типов на useReducer
useReducer помогает управлять более сложными состояниями. Это альтернатива useState- но имейте в виду, что они разные.
import * as React from "react";
enum ActionType {
INCREMENT_COUNTER = "INCREMENT_COUNTER", DECREMENT_COUNTER = "DECREMENT_COUNTER"
}
interface IReducer {
type: ActionType; count: number;
}
interface ICounter {
result: number;
}
const initialState: ICounter = {
result: 0
};
const countValue: number = 1;
const reducer: React.Reducer<ICounter, IReducer> = (state, action) => {
switch (action.type) {
case ActionType.INCREMENT_COUNTER:
return { result: state.result + action.count };
case ActionType.DECREMENT_COUNTER:
return { result: state.result - action.count };
default:
return state; }
};
export default function App() {
const [state, dispatch] = React.useReducer<React.Reducer<ICounter, IReducer>>(
reducer,
initialState
);
return (
<div className="App">
<h1>Result: {state.result}</h1>
<button
onClick={() =>
dispatch({ type: ActionType.INCREMENT_COUNTER, count: countValue })
}> +
</button>
<button
onClick={() =>
dispatch({ type: ActionType.DECREMENT_COUNTER, count: countValue })
}> -
</button>
</div>
);
}
Здесь мы начнем с объявления типов действий, которые позволяют обрабатывать счетчик. Затем мы устанавливаем соответственно два типа для функции редуктора и состояния счетчика.
Редуктор ожидает stateтипа ICounterи actionтипа IReducer. Таким образом, счетчик теперь может обрабатываться соответственно.
useReducer принимает функцию редуктора и начальное состояние в качестве аргументов и возвращает два элемента: stateсчетчик и dispatchдействия.
Чтобы установить тип для значений, возвращаемых ueReducer- просто передайте <>тип ваших данных.
После этого счетчик теперь можно увеличивать или уменьшать useReducer.
Установка типов на useMemo
useMemo позволяет запоминать выход данной функции. Он возвращает мемоизированное значение.
const memoizedValue = React.useMemo<string>(() => {
computeExpensiveValue(a, b)
}, [a, b])
Чтобы установить типы useMemo- просто перейдите в <>тип данных, которые вы хотите запомнить.
Здесь хук ожидает stringвозвращаемого значения.
Установка типов на useCallback
useCallback позволяет запоминать функцию , чтобы предотвратить ненужные повторно делает. Он возвращает мемоизированный обратный вызов.
type CallbackType = (...args: string[]) => void
const memoizedCallback = React.useCallback<CallbackType>(() => {
doSomething(a, b);
}, [a, b]);
Здесь мы объявляем CallbackTypeтип, который используется в качестве типа для обратного вызова, который мы хотим запомнить.
Он ожидает получения параметров типа stringи должен возвращать значение типа void.
Затем мы устанавливаем тип useCallback- и если вы передадите неправильный тип обратному вызову или массиву зависимостей, TypeScript будет выдавать ошибку.
0 комментариев
Добавить комментарий