**Lodash

Для работы со сложными структурами данных вам может потребоваться использовать такие методы, как сопоставление вложенных данных (маппинг, mapping), использование рекурсивных компонентов для визуализации данных с несколькими уровнями вложенности и оптимизация производительности с помощью таких методов, как React.memo. Также может быть полезно использовать библиотеки, такие как lodash, для управления и преобразования сложных структур данных. Например, функция debounce из библиотеки lodash, полезна для сокращения количества API запросов.

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

  • Вложенные структуры данных, такие как дерево или граф.
  • Большие наборы данных, которые необходимо отображать и обрабатывать в виде таблицы или списка.
  • Структуры данных со многими уровнями вложенности, например, объект JSON с несколькими уровнями вложенных объектов и массивов.
  • Структуры данных, которые постоянно меняются, например, данные в режиме реального времени из прямой трансляции или подключения через веб-сокет.

Lo-Dash — это полноценная замена* для Underscore.js. Lo-dash имеет более высокую производительность, избавлен от некоторых багов underscore и даёт некоторые новые возможности.

  • Поддержка AMD-загрузчиков (RequireJScurl.js, etc.)
  • _.clone поддерживает “глубокое” клонирование
  • _.forEach поддерживает текучий интерфейс и остановку итерирования
  • _.forIn для итерирования по собственным и унаследованным свойствам объектов
  • _.forOwn для итерирования только по собственным свойствам объекта
  • _.isPlainObject проверяет, было ли значение создано с помощью конструктора Object
  • _.lateBind для позднего связывания
  • _.merge — “глубокий” аналог _.extend
  • _.partial для карринга без связывания this
  • _.pick и _.omit принимают аргументы callback и thisArg
  • _.template использует sourceURLs для более простой отладки
  • _.contains_.size_.toArrayи т.д.… принимают и строки тоже

Поддержка индивидуальных сборок позволяет легко создавать облегчённые версии Lo-Dash, содержащие только необходимые вам методы. Также Lo-Dash поддерживает за вас зависимости методов и псевдонимы.

  • Сборка, содержащая всё необходимое для работы Backbone, может быть создана с модификатором backbone.
  lodash backbone

Подробнее: Lo-Dash , Ссылка на методы Lodash, Хватит импортировать JavaScript-пакеты целиком

**Debounce

Результатом декоратора debounce(f, ms) должна быть обёртка, которая передаёт вызов f не более одного раза в ms миллисекунд. Другими словами, когда мы вызываем debounce, это гарантирует, что все остальные вызовы будут игнорироваться в течение ms.

let f = debounce(alert, 1000)
 
f(1) // выполняется немедленно
f(2) // проигнорирован
 
setTimeout(() => f(3), 100) // проигнорирован (прошло только 100 мс)
setTimeout(() => f(4), 1100) // выполняется
setTimeout(() => f(5), 1500) // проигнорирован (прошло только 400 мс от последнего вызова)

Пример написания кастомного хука debounce на React:

import { useState, useEffect } from "react"
 
const useDebounce = (value, delay) => {
  const [debouncedValue, setDebouncedValue] = useState(value)
 
  useEffect(() => {
    const timerId = setTimeout(() => {
      setDebouncedValue(value)
    }, delay)
 
    return () => {
      clearTimeout(timerId)
    }
  }, [value, delay])
 
  return debouncedValue
}
 
// Пример использования
const MyComponent = () => {
  const [inputValue, setInputValue] = useState("")
  const debouncedInputValue = useDebounce(inputValue, 500)
 
  useEffect(() => {
    // Выполнять действия при изменении задержанного значения
    console.log("Debounced value:", debouncedInputValue)
  }, [debouncedInputValue])
 
  const handleChange = (event) => {
    setInputValue(event.target.value)
  }
 
  return (
    <div>
      <input type="text" value={inputValue} onChange={handleChange} />
    </div>
  )
}

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

Подробнее: debounce

**Throttle

Декоратор throttle(f, ms), возвращает обёртку, передавая вызов в f не более одного раза в ms миллисекунд. Те вызовы, которые попадают в период «торможения», игнорируются.

function f(a) {
  console.log(a)
}
 
// f1000 передаёт вызовы f максимум раз в 1000 мс
let f1000 = throttle(f, 1000)
 
f1000(1) // показывает 1
f1000(2) // (ограничение, 1000 мс ещё нет)
f1000(3) // (ограничение, 1000 мс ещё нет)
 
// когда 1000 мс истекли ...
// ...выводим 3, промежуточное значение 2 было проигнорировано

Отличие от debounce – если проигнорированный вызов является последним во время «задержки», то он выполняется в конце.

Пример написания кастомного хука throttle на React:

import { useState, useEffect } from "react"
 
const useThrottle = (value, delay) => {
  const [throttledValue, setThrottledValue] = useState(value)
  const [lastExecTime, setLastExecTime] = useState(Date.now())
 
  useEffect(() => {
    const timerId = setTimeout(() => {
      const now = Date.now()
      const timeSinceLastExec = now - lastExecTime
 
      if (timeSinceLastExec >= delay) {
        setThrottledValue(value)
        setLastExecTime(now)
      }
    }, delay)
 
    return () => {
      clearTimeout(timerId)
    }
  }, [value, delay, lastExecTime])
 
  return throttledValue
}
 
// Пример использования
const MyComponent = () => {
  const [inputValue, setInputValue] = useState("")
  const throttledInputValue = useThrottle(inputValue, 500)
 
  useEffect(() => {
    // Выполнять действия при изменении ограниченного значения
    console.log("Throttled value:", throttledInputValue)
  }, [throttledInputValue])
 
  const handleChange = (event) => {
    setInputValue(event.target.value)
  }
 
  return (
    <div>
      <input type="text" value={inputValue} onChange={handleChange} />
    </div>
  )
}

Обычно используется для ограничения частоты выполнения определенных действий или обработки событий в React-компонентах. Вот несколько распространенных примеров использования useThrottle:

  1. Обработка событий ввода
  2. Оптимизация обновлений компонента
  3. Отправка запросов к API

Назад