Таким образом, конференция «Реагистрация» только что произошла, и так же что-то новое произошло. Крючки случилось! Команда реагирования говорила о неизвестности, ленивой погрузке, одновременном рендеринге и Крючки : D.
Теперь я поговорим о моем любимом крючке упред И как вы его используете.
import React, { useReducer } from 'react';
const initialState = {
loading: false,
count: 0,
};
const reducer = (state, action) => {
switch (action.type) {
case 'increment': {
return { ...state, count: state.count + 1, loading: false };
}
case 'decrement': {
return { ...state, count: state.count - 1, loading: false };
}
case 'loading': {
return { ...state, loading: true };
}
default: {
return state;
}
}
};
const delay = (time = 1500) => {
return new Promise(resolve => {
setTimeout(() => {
resolve(true);
}, time);
});
};
function PokemonInfo() {
const [{ count, loading }, dispatch] = useReducer(reducer, initialState);
const onHandleIncrement = async () => {
dispatch({ type: 'loading' });
await delay(500);
dispatch({ type: 'increment' });
};
const onHandleDecrement = async () => {
dispatch({ type: 'loading' });
await delay(500);
dispatch({ type: 'decrement' });
};
return (
Count {loading ? 'loading..' : count}
);
}
export default PokemonInfo;В моем Pokemoninfo Компонент, у меня есть:
const [{ count, loading }, dispatch] = useReducer(reducer, initialState);Который эквивалентно:
const [state, dispatch] = useReducer(reducer, initialState);
const { count, loading } = state;Так что же const [состояние, (param1, param2) Давайте сначала поговорим о Массив разрушительной который происходит ниже Отказ
const [state, dispatch] = useReducer(initialState);
Вот пример разрушения массива:
let myHeroes = ['Ant man', 'Batman']; // Mixing DC & Marvel :D let [marvelHero, dcHero] = myHeroes; // destructuring array /** * myHeroes[0] == marvelHero => is 'Ant man' * myHeroes[1] == dcHero => is 'Batman' */
Так что метод Успенсер имеет два предмета в своем массиве Государство и отправка Отказ Также Успенсер принимает по двум параметрам: один – редуктор другой – Первоначальное состояние Отказ
В Успенсер Param Редуктор Я прохожу в:
const reducer = (state, action) => {
switch (action.type) {
case 'increment': {
return { ...state, count: state.count + 1, loading: false };
}
case 'decrement': {
return { ...state, count: state.count - 1, loading: false };
}
case 'loading': {
return { ...state, loading: true };
}
default: {
return state;
}
}
};Что это делает, это берет в два аргумента. Одним из них является текущее состояние редуктора, а другой – это действие. Action.type Решит, как он обновит редуктор и вернет новое состояние нам.
Так Если Action.type.
case 'increment': {
return { ...state, count: state.count + 1, loading: false };
}… это вернется государство, которое будет обновляться на +1 и загрузка набора ложь Отказ Также где он говорит State.Count + 1 Здесь Государство на самом деле предыдущее состояние.
В Успенсер Param начальное состояние Я прохожу в:
const initialState = {
loading: false,
count: 0
};Так что, если это начальное состояние, Успенсер Метод возвращает два элемента из массива, Государство и отправлять . Государство Метод – это объект, который имеет две клавиши Счет и загрузка Что я разрушаю в моем разрушенном массиве.
Поэтому я разрушаю массив, а внутри массива я разрушаю объект на первом индексе массива, как ниже.
const [{ count, loading }, dispatch] = useReducer(reducer, initialState);Также у меня есть метод под названием задерживать
// return true after 1500ms in time argument is passed to.
const delay = (time = 1500) => {
return new Promise(resolve => {
setTimeout(() => {
resolve(true);
}, time);
});
};Теперь в моем методе рендера, когда я нажимаю + кнопка
Оннуллиинремент Функция выполняется, что делает следующее:
const onHandleIncrement = async () => {
dispatch({ type: 'loading' });
await delay(500);
dispatch({ type: 'increment' });
};Изначально устанавливает Загрузка true, добавляет задержку 500 мс. а затем увеличивает счетчик. Теперь я знаю, что это не настоящий характер мира, но объясняет точку зрения относительно работы редуктора.
Последнее:
Count {loading ? 'loading..' : count}
Если Загрузка верно, я показываю Количество загрузки .. еще я показываю Счет {значение} Отказ
Вот как это выглядит в интерфейсе:
Я пытался реплицироваться Дэн Абрамов Код, который он продемонстрировал на конференции по реагированию 2018 года. Вот ссылка на Репозиторий кода Отказ Наслаждаться.:)
Оригинал: “https://www.freecodecamp.org/news/hooked-on-hooks-how-to-use-reacts-usereducer-2fe8f486b963/”