У меня есть функция с именем filterContactsByValue
. Он каррируется и принимает значение и список контактов, а затем фильтрует список на основе значения и возвращает (новый) отфильтрованный список.
Поскольку этот список часто велик (более 10.000 записей), веб-приложение должно работать на смартфонах, а фильтр учитывает множество значений, поэтому я хочу оптимизировать вычислительные ресурсы. Поэтому я использую useDebounce
, чтобы не вычислять без необходимости.
Я также использовал useCallback
вот так, чтобы запомнить вычисление filteredContacts
:
function FilteredContacts({contacts}) {
const [filterParam, setFilterParam] = useState('');
const [value] = useDebounce(filterParam, 800);
const filterContacts = filterContactsByValue(value.toLowerCase());
// Is this okay? ? ...
const getFilteredContacts = useCallback(() => filterContacts(contacts), [
value
]);
return (
<div className="main">
<SearchBar
value={filterParam}
onChangeText={setFilterParam}
/>
// ... and then this? ?
<ContactList contacts={getFilteredContacts()} />
</div>
);
}
Мне было интересно, нормально ли это, или возвращать такие значения - плохая практика. Если это плохо, почему и как бы вы улучшили его?
Edit:
Функция filterContactsByValue
:
import { any, filter, includes, map, pick, pipe, toLower, values } from 'ramda';
import { stringFields } from './config/constants';
const contactIncludesValue = value =>
pipe(
pick(stringFields),
map(toLower),
values,
any(includes(value))
);
const filterContactsByValue = pipe(
contactIncludesValue,
filter
);