Рубрики
Без рубрики

Зацеплены на крючках : Как использовать Reactionucer ()

Фото Себастьяна Создана / Unsplashso Конференция по реагированию только что произошла и как всегда что-то новое. Крючки случилось! Команда RACT говорила о неизвестности, ленивой погрузке, одновременном рендеринге и крючках: D. Теперь я расскажу о моем любимом крючком и как вы его используете. Импорт реагировать, {userucer} от «реагирования»;

Таким образом, конференция «Реагистрация» только что произошла, и так же что-то новое произошло. Крючки случилось! Команда реагирования говорила о неизвестности, ленивой погрузке, одновременном рендеринге и Крючки : 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/”