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

Меньше – больше; Упростите свой React Code для Super Power Ваши приложения – часть 3

Это третья статья в серии, охватывающей разные стратегии для упрощения вашего Application Application … Теги с JavaScript, React, Tustorial, WebDev.

Это третью статью в серии, охватывающей разные стратегии для упрощения ваших приложений RACT.

Упростите комментарий реагирования

Существует ряд стратегий, которые мы можем предпринять, чтобы упростить наши компоненты, без резкого капитального ремонта нашего кода. Каждая стратегия будет покрыта в другом посте.

  1. Отдельное состояние с отображения, это поможет вашему приложению выравниваться с хорошо установленными правилами MVC
  2. Отложить обработку на услуги и пользовательские крючки
  3. Избегайте перегрузки useffect. и stestate
  4. Определить, если redux & Redux-Saga действительно нужны
  5. Создайте компоненты более высокого порядка для объединения функциональности между компонентами
  6. Сдвиньте вычислительную логику из компонентов в функции помощника, вводят пользовательские крючки
  7. Использовать ленивую погрузку и ленивое поведение, где это возможно

Избегайте перегрузки с использованием использования и устегивания

Useffect и Уместите Мощные инструменты в функциональном арсенале реагирования. Уместите Крюк поддерживает связывание постоянного состояния к компоненту через несколько рендеров, в то время как Useffect похож на ComponentDidmount и ComponentDidupdate Методы жизненного цикла компонентов RACT Class, за исключением того, что функция будет выполняться после того, как рендер будет предан на экран.

Usestate крючок, как и когда его использовать

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

Одно конкретное использование Уместите состоит в том, чтобы установить переходные состояния для компонента, который может быть приведен в действие привлечением и рендеринге асинхронных данных. При загрузке данных мы должны представить временное состояние пользователю и перейти от ранее оказанного состояния в новое состояние.

Мы также можем захватить ввод пользователей в компоненте, и вызвать повторные рендеры компонента, а не родителя, избегая бурения оперения и использованием локального состояния:

// Example from React
function Counter({initialCount}) {
  const [count, setCount] = useState(initialCount);
  return (
    <>
      Count: {count}
      
      
      
    
  );
}

Обновление реактивных изменений в реактивных реакции означает, что мы можем избежать вопросов, где изменения оприза передаются от ребенка к родителю, как это было возможно в более ранних версиях Angularjs. Хотя это хорошо, поддержание состояния на нескольких компонентах в том же родительском компонентах, особенно в тех случаях, когда актуальны переходные данные и обмен сообщениями, могут быть сложной ситуацией.

Одним из таких примеров является получение данных из API, преобразования этих данных и обработка различных сценариев ошибок. В зависимости от того, как представлена обработка ошибок, особенно при использовании статических страниц и статических маршрутов, может быть невозможно настроить данные, которые представлены пользователю.

const [loaded, setLoaded] = useState(false);
const [hasTransformError, setHasTransformError] = useState(false);
const [hasApiFetchError, setHasApiFetchError] = useState(false);
const [hasSomeOtherError, setHasSomeOtherError] = useState(false);

useEffect(async () => {
  try {
    const response = await fetch("/some/api");
    const json = await response.json();
    const transformed = transformer.transformJson(json);
  } catch (e) {
    if (e instanceof TransformerError) {
      setHasTransformError(true);
    } else if (e instanceof ApiError) {
      setHasApiFetchError(true);
    } else {
      setHasSomeOtherError(true);
    }
  }
});

if (hasTransformerError || hasApiFetchError || hasSomeOtherError)
  // Possibly render error to screen, or redirect to hard fail/static error screens

Хотя вышеуказанная модель является примером, это не изящно, ни элегантный способ обработки сценариев ошибок, но для конкретных обстоятельств, таких как получение данных из одной конечной точки API на странице нагрузки, привлечение данных с другой конечной точки API для проверки и публикации данных На другой конечной точке методы обработки различных сценариев ошибок могут быть ограничены при использовании компонентов React.

Установка struestate с исходными данными от вызываемой функции

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

Стоит удержать, что любая ценность, полученная из вычислительной интенсивной функции, предоставляется по умолчанию Callable к Уместите Будет ли Блокируйте пользовательский интерфейс от рендеринга, и именно поэтому это всегда посоветовали положиться на Useffect обеспечить ленивую загрузку данных. В отличие от вызываемой функции, Useffect не будет блокировать UI после рендера.

Ленивый загрузка состояния с использованием

Useffect в сочетании с Уместите является мощным асинхронным инструментом для загрузки, мутации и отображения данных, предоставленных API. Это очень распространенная стратегия, работающая во многих приложениях RACT, и является одной из распространенных причин создания пользовательских крючков.

С нашим предыдущим примером мы создаем компонент под названием Тодос , который выбирает и отображает содержание от API JSON Plactholder. Этот компонент несет ответственность за довольно много – получение данных из API, преобразования, состояния примирения и рендеринга UI.

const Todos = () => {
  const [todos, setTodos] = useState();
  useEffect(async () => {
    const response = await fetch('https://jsonplaceholder.typicode.com/todos/');
    const todos = await response.json();
    setTodos(todos);
  }, []);

  // Render the content of the screen
}

Мы можем перенести много обработки и обработки состояния к пользовательскому крюку и подвергать значения, возвращенные пользовательскими крючками, такими как Тодос :

const useTodos = () => {
  const [todos, setTodos] = React.useState([]);
  React.useEffect(async () => {
    const response = await fetch('https://jsonplaceholder.typicode.com/todos/');
    const todos = await response.json();
    setTimeout(() => {
      setTodos(todos);
    }, 2500);
  }, []);

  return { todos };
}

const Todos: React.FC = () => {
  const { todos } = useTodos();
  return todos.length > 0 ? 

Hello, world! {todos.length} todos!

: }

Наблюдаемые обновления с USESTATE и USEFFECT

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

Очень распространенное использование корпус является пегирование. Учитывая пользователю взаимодействует с кнопкой, мы хотим показать еще один набор записей, поскольку мы пересекаем набор данных.

Когда мы проводим Тебе Кодепен, мы видим три вещи:

  • Мы использовали пользовательский крючок Usetodos Чтобы инкапсулировать нашу получение API, преобразование данных и временное кэширование TODOS
  • А Useffect Крюк звонит Персональный к страница
  • Мы экспортируем два производных значения и SetPage.

Экспорт setpage , мы можем очень легко запускать обновления пользовательского интерфейса и дополнительные данные для получения данных, установив новое значение с помощью setpage :

const TodosPaginate = () => {
  const {todos, page, setPage} = useTodos();
  return (
    

Page: {page}

{ page > 1 ? : null } { page < 10 ? : null }
); }

Пользовательские крючки

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

Это важно, чтобы вспомнить, что пользовательские крючки не должен поддерживать состояние, которое может потребляться по нескольким компонентам. Это так, что приложение ведет себя предсказуемым и надежным моды, и что крючки не злоупотребляют и используются так, как они никогда не были предназначены.

В нашем примере выше мы выставили Тодос Список, Страница номер и setpage , который заставит асинхронную загрузку и перенаправить страницу. В нашем примере кодепена мы также пытались загрузить тот же пользовательский крюк Usetodos на обои Тодос и Тодоспагинальный компонент.

const Todos = () => {
  const {todos, page} = useTodos();
  // ...
}

const TodosPaginate = () => {
  const {todos, page, setPage} = useTodos();
  // ...
}

Ожидаемое поведение здесь может быть одинаковые крючки, которые поделились на нескольких компонентах. Это было бы удобно и здорово, не так ли? Но увы, настоящее поведение вот в том, что крючки объединяются с компонентом, который их вызывает. Дано n Количество компонентов, использующих Usetodos , будет n Количество привязки той же Уместите и Useffect звонки. Это тривиально проверить это – добавить console.log Или просмотрите вкладку Network в вашей консоли, чтобы попробовать его.

Правильный объект реагирования для выставления данных для использования в нескольких компонентах и пользовательских крючках является использование Контекст API Отказ

Контекст API

Контекст API обеспечивает способ передавать данные через дерево реагирования, не прибегая к сверлию. Вы можете реализовать его как можно больше или мало, как вам нравится, и вы можете реализовать его в определенные места.

Данные, содержащиеся в API контекста, считаются глобальными данными и могут использоваться во всем приложении. Данные, которые считаются привилегированными, такими как аутентифицированные пользовательские данные или безопасное cookie, возможно, должны не храниться в контексте. Контекст API отлично подходит для использования с темой, переопределенными, определенным локализованным поведением, такими как pagination или управление макетом страницы.

Мы можем взять наше простое приложение TODOS и сделать его более отзывчивым на навигацию страницы, объявив контекст TODOS и предоставлением его нашим компонентам. Существует одно предупреждение – контекст будет публиковать изменения только при изменении исходных данных. Это обеспечивает однонаправленное общение и распространение. Мы можем определить обработчик для обновления состояния для нас и предоставлять его через контекст Провайдер Отказ

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


  {todos => /* render something based on the context value */}


// Behaves similarly to:
const useTodosContext = () => {
  return { page, todos } = React.useContext(TodosContext);
}

Когда потреблять использование и когда потреблять USELAYOUTEFFECT

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

Не всегда необходимо выполнить Useffect После каждого повторного визуализации, и есть способы смягчить против этого, используя Уместите , УСЭРЕФ или наблюдающие ценности, которые не меняются. Лучший способ применения этих методов – использовать пользовательский крюк, но каждый из этих стратегий все еще выполняет Useffect многократно.

// Using `useState` to maintain execution state for hook
const useCustomHook = (fn) => {
  const [state, setState] = useState({completed: false});
  useEffect(() => {
    // Only execute if state.completed has not been set yet
    if (!state.completed) {
      fn && fn();
      setState({...state, completed: true});
    }
  }, [state.completed]);
}

// Using `useRef` to maintain execution state for hook
const useCustomHook = (fn) => {
  const ref = useRef(false);
  useEffect(() => {
    // Only execute if ref.current is true
    if (!!ref.current) {
      fn && fn(); 
    } else {
      ref.current = true;
    }
  }, [ref.current]);
}

// Only execute this hook once, ever, but this _will_ throw an exhaustive deps warning with eslint!
const useCustomHook = (fn) => {
  useEffect(() => {
    fn && fn();
  }, []);
}

Наличие способности наблюдать на изменяющемся свойстве, ценна для реагирования на конкретные наблюдаемые события, такие как pagination, как описано ранее, или включение RXJS в ваше приложение Отказ

Пока вы, вероятно, используете Useffect Почти во всех случаях для загрузки данных асинхронно и даже мутируют DOM, Uselayouteffect уволен сразу после обновления Дома. Это перед браузером «красает» изменения, предоставляя точку записи, чтобы выполнить дополнительные мутации, прежде чем пользователь сможет даже увидеть изменения. Это чрезвычайно выгодно, когда контент должен быть динамически изменен, или внешние документы DOM загружаются и должны быть мутированы, или стили должны быть изменены.

Потому что крюк пожали синхронно , вычислительно интенсивные функции будет блокировать Визуализация пользовательского интерфейса, приводящая к интерфейсу, которое может казаться отстающим или глюким. Вы должны использовать Uselayouteffect Когда вам нужно мутировать DOM и/или выполнить/вычислить измерения, а Useffect Когда вам не нужно напрямую взаимодействовать с DOM, или мутации асинхронные/наблюдаемые.

Оставайтесь настроиться на следующую статью, когда мы определяем, если redux. и Redux-Saga действительно нужны, и какие другие варианты доступны.

Оригинал: “https://dev.to/jmitchell38488/less-is-more-simplify-your-react-code-to-super-power-your-applications-part-3-2b8g”