Является ли этот пользовательский крючок для управления фильтрами с URLSearchParams в next.js 13+ идиоматической и масштJavascript

Форум по Javascript
Ответить Пред. темаСлед. тема
Anonymous
 Является ли этот пользовательский крючок для управления фильтрами с URLSearchParams в next.js 13+ идиоматической и масшт

Сообщение Anonymous »

Я работаю над системой фильтрации в приложении Next.js 13+ (приложение маршрутизатор). Я нашел крючок в другом проекте, улучшил его для моих нужд, и, похоже, он работает хорошо-но у меня все еще есть некоторые опасения по поводу его правильности, производительности и долгосрочной обслуживаемости < /p>
о том, что я не уверен: < /p>
Я использую Usememo и Usecallback? Object.Fromentries (SearchParams)?import { useRouter, useSearchParams } from "next/navigation";
import { useMemo, useCallback } from "react";

const identity = (value) => value;
const toggle = (list, value) => list.includes(value) ? list.filter((item) => item !== value) : [...list, value];

export const useSearchParamsApi = () => {
const router = useRouter();
const searchParams = useSearchParams();

const record = useMemo(
() => Object.fromEntries(searchParams),
[searchParams]
);

const replace = useCallback(
(value, params) => {
router.replace(`?${new URLSearchParams(value)}`, {
scroll: false,
...params,
});
},
[router]
);

const update = useCallback(
(value, params) => {
const next = { ...record, ...value };

if (!("page" in value)) {
next.page = "1";
}

const cleaned = Object.fromEntries(
Object.entries(next).filter(
([_, v]) => v !== undefined && v !== null && v !== ""
)
);

replace(cleaned, params);
},
[replace, record]
);

return { record, searchParams, replace, update };
};

export function useFiltersQuery() {
const { record, update, replace, searchParams } = useSearchParamsApi();

const valueFilter = (name, fallback, deserialize = identity) => ({
value: useMemo(() => {
return record[name] ? deserialize(record[name]) : fallback;
}, [record, name]),

update: useCallback(
(next) => update({ [name]: String(next) }),
[name, update]
),

remove: useCallback(() => update({ [name]: undefined }), [name, update]),
hasFilter: searchParams.has(name),
});

const arrayFilter = (name, defaultValue = []) => {
const field = valueFilter(name, defaultValue, (v) => v.split(","));

return {
...field,
toggle: useCallback(
(value) => field.update(toggle(field.value, value)),
[field.value, field.update]
),
};
};

const clearFilter = useCallback(
(key, params) => {
update(
{
[key]: undefined,
page: "1",
},
params
);
},
[update]
);

const resetFilters = useCallback(
(params) => {
replace({}, params);
},
[replace]
);

return {
record,
valueFilter,
arrayFilter,
clearFilter,
resetFilters,
};
}

< /code>
Что я попробовал и что я ожидал: < /p>
Я использовал этот крюк на нескольких фильтрованных страницах - например, каталог компаний, где в URL хранятся такие фильтры, такие категории, языки и тип услуг. Это работает как и ожидалось: < /p>
Фильтры отображаются в пользовательском интерфейсе и синхронизированы с URL. декларативное решение для обработки фильтров без местного государства. Похоже, он работает хорошо, но мне бы хотелось отзыв о:
может ли это вызвать проблемы в будущем,
и есть ли какие-либо анти-паттерны, которые я могу отсутствовать.

Подробнее здесь: https://stackoverflow.com/questions/796 ... -js-13-idi
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Javascript»