Моя команда и я ежедневно активно применяем паттерны FP и реагирующих хуков, хотя иногда мы боремся, как управлять хуками вместе с чистыми функциями.В последнее время мы сталкиваемся с множеством ситуаций, когда «обратный вызов» ловушки должен находиться где-то внутри compose
или другого преобразователя - в данном случае это функция evolve
, например:
const getDefinedActions = R.filter(
R.both(isActionDefined, R.ifElse(hasAfterConfirm, isAfterConfirmDefined, R.T))
)
const translateTitles = R.map(
R.evolve({
title: title => useTranslate()(title)
})
)
export const useActions = R.compose(
translateTitles,
getDefinedActions
)
В приведенном выше примере мы хотим отфильтровать действия на основе некоторых предикатов + добавить переводы, которые требуют использования хука useTranslate
.К сожалению, мы не можем просто написать useTranslate()
там, потому что ловушка должна быть инициализирована после монтирования компонента React.Что было сделано до сих пор в таких ситуациях:
создать функцию ловушки «на лету» и передать ее функции другой рамды.например, { const translate = useTranslate(); return R.compose(..., translate, ...) }
- нам не нравится этот подход, потому что мы не можем включить стиль без точек при этом; /
другой способ - вызвать хук в анонимной функции втак же, как я написал во фрагменте выше.- хотя нам не нужно писать весь функциональный блок и объявлять дополнительную переменную, этот подход нам тоже не нравится, потому что нам все время приходится избыточно записывать передаваемые аргументы: arg => hook()(arg)
Существует ли какой-либо общий подход в FP для решения такого рода проблемы, когда мы должны внедрить функцию, которую нужно лениво оценить, а затем на основе этого результата мы можем провести другие вычисления?Может быть, даже у Ramda
есть функция, которая помогает вводить определенное поведение, поэтому мы можем использовать ее следующим образом:
R.evolve({
title: R.useWith(useTranslate, R.identity) // arg => useTranslate()(R.identity(arg))
})
PS.Я знаю, что в Ramda есть функция useWith
, но она работает по-другому; /
Любая помощь будет высоко оценена!