Функция импорта против превращения его в пользовательский хук - PullRequest
0 голосов
/ 04 июля 2019

У меня есть ProductSearchContainer.js файл, который он слишком долго обрабатывает и поддерживает.

За что он отвечает:

  • Выполнение сетевых запросов для получения списка продуктов
  • Фильтр, который перечисляет значения фильтров, которые он получает из строки запроса URL, и обновляет состояние с помощью нового FilterList
  • . Он также содержит функции для имитации длины товаров в каждом фильтре, прежде чем щелкнуть по нему.Например: цветной фильтр с Black (5) , указывающим, что вы получите 5 товаров, если вы нажмете Black .
  • Среди других функций

Файл становился слишком большим (более 600 строк), и я решил переместить некоторые кусочки логики в другие файлы.

Для каждой категории фильтров (марка, цена, рейтинг и т. Д.), Которые у меня естьдве функции:

  • 1 для применения активных фильтров (получить массив list и activeFilters, и он возвращает отфильтрованный список для этих фильтров.
  • 1 для имитацииследующая длина фильтра (как я объяснил выше на примере цветов)

Примечание: Ниже вы увидите, что они полагаются на переменную состояния activePriceFilters, но не вызываютлюбой React Hook в их исполнении.


OPTION # 1

Моей первой мыслью было превратиться в кастомный хук. Так я и сделал. И это работает (см. фрагмент ниже).

function usePriceFilter(activePriceFilters) {

  function applyPriceFilter(list, activePriceFilters) {
    console.log('I will get a list and return it filtered by activePriceFilters');
  }

  function simulateNextPriceFilter(list, someTestPriceFilter) {
    console.log('I will get a list and return the length of the filtered list by price');
  }

  return [applyPriceFilter,simulateNextPriceFilter];

}

И я потребляю, выполняя:

const [applyPriceFilter,simulateNextPriceFilter] = usePriceFilter(activePriceFilters)

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

из React DOCS:

Пользовательский хук - это функция JavaScript, имя которой начинаетсяс помощью «use», и это может вызвать другие Hooks.


OPTION # 2

Но я думаю, я также мог бы превратиться в обычный .js файл, экспортируйте обе функции и просто выполните обычный импорт для них.Например:

import {applyPriceFilter,simulateNextPriceFilter} from './priceFilterHelpers


ВОПРОС:

Есть ли разница в функциональности или производительности между двумя подходами?Стоит ли мне отдавать предпочтение 1 вместо другого?

Я думаю, что пользовательские хуки более читабельны, но есть ли что-то еще, что я получаю, делая это?

function App() {

  const [activePriceFilters,setActivePriceFilters] = React.useState(['10to20','50+']);

  const [applyPriceFilter, simulateNextPriceFilter] = usePriceFilter(activePriceFilters);

  return(
    <React.Fragment>
      <button onClick={applyPriceFilter}>Apply Price Filters</button>
      <button onClick={simulateNextPriceFilter}>Simulate Price Filter</button>
    </React.Fragment>
  );

}

function usePriceFilter(activePriceFilters) {

  function applyPriceFilter(list, activePriceFilters) {
    console.log('I will get a list and return it filtered by activePriceFilters');
  }

  function simulateNextPriceFilter(list, someTestPriceFilter) {
    console.log('I will get a list and return the length of the filtered list by price');
  }

  return [applyPriceFilter,simulateNextPriceFilter];

}


ReactDOM.render(<App/>, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>

<div id="root"/>

1 Ответ

1 голос
/ 04 июля 2019

Ваш вариант # 2, теоретически, будет работать лучше, потому что вы (вероятно) напишите его так, что эти две функции нужно будет создать только один раз.В пользовательской версии ловушек две функции и массив, в котором они хранятся, будут создаваться при каждом рендеринге.

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

Так что все дело в том, какой код вы и читатели своего кода находите более разборчивым.Я лично падаю на боку крючков.

...