#javascript #reactjs #state #setstate
#javascript #reactjs #состояние #setstate
Вопрос:
Я новичок в React, и у меня есть вопрос относительно передачи функций в состоянии. У меня есть пара «функций сортировки» в моей папке util, которые выглядят следующим образом:
export const sortColdestSummerCountries = (filteredCountries) => {
return filteredCountries.sort(
(a, b) => a.avsummertemp20802099 - b.avsummertemp20802099
);
};
и несколько других:
sortHighestSummerTemp, sortLargestIncreaseHotDays, sortColdestSummerCountries, sortMostColdDays, sortWorstAffectedCountries
которые в значительной степени выглядят похожими. Я использую их для сортировки своих данных по запросам пользователей, и если я sortHighestSummerTemp(filteredCountries)
оборачиваю свои данные, это работает как шарм.
Теперь проблема: поскольку в конечном итоге у меня будет более 10 фильтров, для меня имеет смысл создать глобальный const [queryFilter, setQueryFilter] = useState({ sortHighestSummerTemp});
, который затем реагирует на const onChangeQueryFilter = (e) => { setQueryFilter(e.target.value); };
Тем не менее, при попытке queryFilter (filteredCountries)
терминал показывает мне "queryFilter is not a function"
, когда я его фильтрую? Это все та же функция sortHighestSummerTemp, верно или чего мне здесь не хватает? Правильно ли я суммирую эту проблему?
Надеюсь, это было ясно, и вы понимаете, что я пытаюсь сделать. Может ли кто-нибудь объяснить мне, что происходит и какова наилучшая практика здесь?
ОБНОВЛЕНИЕ: Prateek предложил следующее:
function sortBy(filteredCountries, sortKey) { return [...filteredCountries].sort((a, b) => a[sortKey] - b[sortKey]); } const [queryFilter, setQueryFilter] = useState({ sortMostHotDays, }); const filteredData = sortBy(filteredCountries, sortMostHotDays); console.log(filteredData);
Это не работает, он по-прежнему показывает старые данные (filteredCountries), но фильтрация не работает. У кого-нибудь есть подсказка?
Ответ №1:
1-й подход
- Вы помещаете строку в свое состояние. Может быть, лучше, если вы используете объект с функциями сортировки и используете пользовательский ввод в качестве ключа к объекту функций сортировки
const onChangeQueryFilter = (e) => { setQueryFilter(e.target.value); };
const sortingFns = {
"temp": sortHighestSummerTemp,
"hot": sortLargestIncreaseHotDays,
"summer": sortColdestSummerCountries,
"cold": sortMostColdDays,
.....
}
const sortedData = sortingFns[queryFilter](data);
2-й подход
- Гораздо лучше, если вы передадите параметр сортировки на свою фабрику функций сортировки.
function sortBy(data, sortKey) {
return [...data].sort((a, b) => a[key] - b[key])
}
// the query filter should respond to the key on which you should sort the data.
const [queryFilter, setQueryFilter] = React.useState('');
const filteredData = sortBy(data, queryFilter);
Комментарии:
1. Спасибо за ответ! Позвольте мне углубиться в детали: О 1-м подходе:
TypeError: sortingFns[queryFilter] is not a function
О втором подходе:function sortBy(filteredCountries, sortKey) { return [...filteredCountries].sort((a, b) => a[sortKey] - b[sortKey]); } const [queryFilter, setQueryFilter] = React.useState({ sortHighestSummerTemp, }); const filteredData = sortBy(filteredCountries, queryFilter);
Данные остаются точно такими же, не сортируются. Он не выдает ошибок, но «filteredData» на самом деле ничего не делает прямо сейчас.2. @BridlerShoc можете ли вы создать воспроизводимую проблему в stackblitz? При первом подходе состояние вашего компонента должно отображаться в ключах
sortingFns
. Не храните функции в состоянии. Во втором подходе вы должны передать ключ, по которому данные должны быть отсортированы.3. » Во втором подходе вы должны передать ключ, по которому данные должны быть отсортированы» Что вы имеете в виду под этим? Я не могу решить проблему в stackblitz. В этом мне не хватает навыков, и проблема слишком специфична, чтобы упростить ее для меня. Я мог бы показать вам, что я делаю, если у вас есть разногласия или что-то в этом роде 🙂
4.
function sortBy(filteredCountries, sortKey) { return [...filteredCountries].sort((a, b) => a[sortKey] - b[sortKey]); } const [queryFilter, setQueryFilter] = useState({ sortMostHotDays, }); const filteredData = sortBy(filteredCountries, sortMostHotDays); console.log(filteredData);
Вы это имеете в виду? Поскольку он показывает данные, но фильтрация работает не так, это все то же самое.5. Например, вы хотите выполнить сортировку по «avsummertemp20802099», это должно быть передано ключом сортировки функции sortBy.