#reactjs #functional-programming #currying #recompose
#reactjs #функциональное программирование #каррирование #перекомпозируйте
Вопрос:
На моей работе мы используем recompose, и мы используем такого рода функции curried, которые мне кажутся чрезмерно сложными и заставляют мой мозг болеть.
Кто-нибудь может объяснить на английском, как это работает?
Спасибо
withStateHandlers(({ readAt, isSender }) => ({ trackVisibility: !isSender amp;amp; !readAt }), {
updateTrackVisibility: () => () => ({
trackVisibility: false,
}),
}),
Я знаю, что readAt и isSender исходят из фрагмента, объявленного выше.
Самая запутанная часть — это функция, которая возвращает другую функцию после updateTrackVisibility
???
Комментарии:
1. withStateHandlers вызывается с двумя параметрами. Первая — это функция, которая принимает два параметра и возвращает новый объект, вторая — это объект со свойством, которое содержит функцию, которая возвращает другую функцию, которая возвращает аналогичный объект. Ни одна из этих функций со стрелками не является необходимой, поэтому, если это поможет вам понять это, вы могли бы заменить их обычными функциями.
2. Шаблон
() =>
указывает либо на отложенное вычисление (так сказать, явное отложенное вычисление), либо на функцию, которая игнорирует свой аргумент.updateTrackVisibility
вероятно, выражает последнее. Однако результирующее значение жестко закодировано, что делает вложенную функцию arrow довольно бесполезной. Я бы предпочел что-то вроде этого:const comp = f => g => x => f(g(x)); const constant = x => _ => x; const constant2 = comp(constant) (constant)
а затемconstant2(false) (true) (true)
выдаетfalse
.3. Плохой код заставит болеть мозг любого. Double
() => () => ...
— это серьезный запах кода . @Kevin B, вы вызываете функцию не с параметрами, вы вызываете функцию с аргументами; аргументы привязаны к параметрам функции.
Ответ №1:
Из recompose API:
withStateHandlers(
initialState: Object | (props: Object) => any,
stateUpdaters: {
[key: string]: (state:Object, props:Object) => (...payload: any[]) => Object
}
)
props
передаются ли реквизиты от родителя (или HOC выше)
state
передается из объекта, созданного в initialState
payload
параметры передаются из того места, где мы запустили функцию (обработчик)
Что означает в вашем коде:
первый параметр — ({ readAt, isSender }) => ({ trackVisibility: !isSender amp;amp; !readAt })
— создайте реквизит с именем trackVisibility (с закодированным значением)
второй параметр — добавьте функцию, которая при запуске делает trackVisibility
значение false
Другой (надуманный) пример:
const enhancer = withStateHandlers(({ title, text, maxChars }) => ({ isLongTitle: title.length > maxChars, text }), {
addText: (state, props) => (text) => ({
text: state.text text,
isLongTitle: state.text.length text.length > props.maxChars
}),
})
const MyComponent = enhancer(props => {
return (
<input onChange={event => props.addText(event.target.value)} />
)
}