Несколько месяц назад я работал на фильтрах для мероприятия Hotsale Company Company Company. Перед началом кодирования важно установить общую логику и структуру этого развития. В этой статье вы найдете пример о том, как поднять эту проблему.
Идея состоит в том, что вы можете продолжить следующий шаг (переведите это в код) с помощью выбора инструментов. Несмотря на то, что в будущей статье, возможно, я покажу вам, как превратить эту логику в код с REVECTJS, в качестве ссылки.
Без дальнейших введений, давайте начнем:
Требования
Пользователь может:
- Нанесите фильтры на определенной коллекции продуктов (Hotsale).
- Бесконечная прокрутка на загрузку продуктов.
- Накапливать фильтры в поисках.
- поддерживать фильтры при перезагрузке страницы.
- Передайте URL-адрес другому человеку, и этот человек будет видеть же фильтры.
Проблемы
Основная проблема здесь была первым требованием, поскольку ERP в компании использует собственные фильтры, но они не могут быть применены к определенной коллекции. Итак, это связанное состроить фильтры с нуля.
Решение было для клиента загружать ID
коллекции в заполнителе и Передний конец
Принимает эту датую, чтобы добавить его в качестве параметра в поисках продукта. Это позволит использовать возможность использования фильтров с другими коллекциями (при изменении идентификатора) или нет (оставляя заполнителю пустой).
Другой центральный вопрос состоял в том, чтобы рассмотреть, что в виде видимого URL пользователю могут прийти к параметрам внешним для этого разработки (например, инструменты аналитики или индикаторы закупки) или параметры с неправильными идентификаторами или неправильными или противоречаными значениями (опечатки).
Следовательно, последние три требования включают особое внимание при чтении URL.
Структура данных
Прежде всего, мы должны решить, как сохранить данные наших фильтров. Предположим, у нас есть переменная под названием BodyFilters
Отказ Это может быть массив объектов, где каждый представляет конкретный критерий фильтра, который, в свою очередь, содержит несколько вариантов. Например, критерий фильтра может быть маркой:
var bodyFilters = [ { criterionId: 'brands', criterionName: 'BRANDS:', criterionOptions: [ { id: 'brands-samsung', name: 'Samsung', param: 'fq=B:126' }, {...}, {...}, {...} ] }, {...}, {...}, {...} ];
Важно, чтобы BodyFilters
это массив, чтобы вы могли зацикливаться через него и подать заявку на каждый критерий логики, которая строит свой вид. О том же рассмотрении для Критерииоптионы
Отказ Обратите внимание, что каждый вариант является объектом, который имеет ID
идентифицировать это, а Имя
Это появится на мнении и Param
Это необходимо будет построить URL-адрес и сделать запрос.
Нам также понадобится переменная ActiveFilters
, чья структура будет такой же, как BodyFilters
потому что: 1) мы будем использовать его данные для обновления ActiveFilters
и 2) Мы пересекаем оба массива данных, чтобы определить, какие параметры выбраны (возможно, в представлении они имеют другой цвет или вес шрифта).
Поведение (часть 1)
Во-вторых, мы определяем потомок разработки, когда страница загружает:
- получать
BodyFilters
Конечно, когда страница загружает, первое, что мы хотим сделать, это получить BodyFilters
Отказ В лучшем случае мы можем использовать статические данные, но очень вероятно, что мы должны сделать один или несколько запросов (например, в моем случае, чтобы получить значения брендов, спецификаций и идентификаторов каждого из них , с которым строятся параметры поиска) и анализируют свои данные.
Возможно, BodyFilters
Значение не будет часто варьироваться часто, поэтому мы можем хранить его в кэше и обновлять его при необходимости.
- получать
ActiveFilters
Теперь мы читаем URL и, пересекая данные BodyFilters
Мы определяем, если есть действительные параметры. С этим результатом мы карта BodyFilters
и получить ActiveFilters
(Не забудьте рассмотреть, если есть «ActiveFilters по умолчанию»).
- Создание или обновление URL
Как только мы получили ActiveFilters
Мы можем использовать параметры из каждого выбранного параметра и:
- Создайте URL, чтобы сделать запрос.
- Обновите веб-страницу URL Web Page We
history.replacestate ()
Отказ
Я предлагаю сделать эти URL-адреса как можно более похожими. Затем, как только URL будет делать запрос:
FetchProducts.
И тогда мы используем ответ (возможно, нужно разбирать его), чтобы показать продукты или ошибку, если существует.
Поведение (часть 2)
В-третьих, мы рассмотрим взаимодействия:
HandleFilterClick (CurrentCriite, выделениеop)
Когда пользователь нажимает для выбора или удаления опции фильтра, мы называем эту функцию, которая обновляет ActiveFilters
Отказ Обратите внимание, что нам нужно пройти CurrentCriterion
и Выбратьoption
в качестве параметров, чтобы узнать, какой вариант обновить. И после ActiveFilters
обновляется, повторите шаги 3 и 4.
- Бесконечная прокрутка
Типичная ситуация в том, что в URL-адресе FetchProducts
Запрос, есть поле, которое указывает номер страницы. Например, PageNumber
Отказ Для Бесконечная прокрутка
Нам понадобится еще несколько инструментов:
- Переменная, которая указывает на
PageNumber
, чье значение по умолчанию равно 1. - Функция, которая проверяет, должны ли мы получить продукты следующей страницы. Назовите это
CheckNextPage
Отказ Например, в моих фильтрах в нижней части списка есть кнопка. Я проверяю, находится ли эта кнопка в просмотре просмотра. Если это верно, добавьте +1 доPageNumber
Отказ - Прослушайте событие прокрутки с помощью Debouten и пропустите вышеуказанную функцию.
- Если
PageNumber
Обновления, затем обновите URL-адреса и повторите шаги 3 и 4. - Не забудьте сбросить
PageNumber
до 1, когдаHandleFilterClick
это шаг5.
Наконец, что происходит, когда больше нет продуктов? Как избежать CheckNextPage
Функция добавляет +1 до PageNumber
снова и снова?
- Нам нужно создать логическое значение
IsnextPage
Отказ Этоправда
По умолчанию и каждый раз, когда мы сбрасываем поиск (HandleFilterClick
). Но, еслиFetchProducts
Возвращает успех и пустые продукты, мы устанавливаемIsnextPage
кложь
Отказ - Помните, конечно, использовать этот булевой внутри
CheckNextPage
Отказ Идея это что-то подобное:Если (isnextpage && isbottomoflist) setnextPagePlusone ()
- Далее, как я уже говорил ранее, если
PageNumber
Обновления, затем обновите URL-адреса и повторите шаги 3 и 4.
Заключение
С таким подходом мы впервые определяем структуру данных для BodyFilters
и ActiveFilters
Это состоит из массива объектов, каждый из которых представляет критерий и содержащий массив опций.
Во-вторых, мы суммируем базовую работу фильтра с бесконечной прокрутки в шести ступеньках: первые четыре, связанные с работой при загрузке веб-страницы, а также два других, связанных с взаимодействиями пользователя.
Это не квантовая физика. Тем не менее, важно занимать момент и рассмотреть глобальный взгляд на структуру и логику фильтра перед запуском. Это упростит ваш код и помешает вам вводить лабиринты или мертвые цели.
Будь свободен, чтобы использовать этот подход, улучшить его и построить что-то отличное с ним!