为了重用表单字段,我在项目中构造了一个简单的钩子。
我要做的是:
找到一种方法,自动将参数传递给回调函数数组的函数引用
如果只考虑一个参数,这就相当简单了。考虑以下功能:
checkMinValue = (input: number) => input > 42 ? '' : `Must be bigger than 42`
钩子定义了以下方式
import { useState, ChangeEvent } from 'react'
type Field = {
value: any,
errors: string[],
}
type CheckFunction = (...args: any[]) => string
const invokeMap = (input: any, checkFunctions: CheckFunction[]) => (
checkFunctions.map(callback => callback(input)).filter(e => e !== '')
)
const useField = (value: any, checkFunctions: CheckFunction[]) => {
const initialValue: Field = {
value,
errors: invokeMap(value, checkFunctions),
}
const [field, setField] = useState<Field>(initialValue)
const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
setField({
value,
errors: invokeMap(value, checkFunctions)
})
}
return [field, handleChange]
}
所以在实际的代码中,你会有类似的东西
const [age, handleAgeChange] = useField(12, [checkMinValue])
上面的代码片段就像一个魅力(尽管在实际代码中它显然更健壮,但这应该足以描绘画面(
问题出现的地方:
我想不出一种方法可以以某种方式将参数传递给函数引用。
因此,假设我想使checkMinValue
函数更加动态。
checkMinValue = (input: number, min: number) => input >= min ? '' : `Must be bigger than ${min}`
问题是,我不能再简单地传递参数,因为这只会导致调用,
例如。useField(8, [checkMinValue('//... nothign to pass here, 8)])
显然是无稽之谈。
我想对它进行curry处理,只传递函数引用,但这就留下了一个问题,那就是我必须基本上将自己限制在x个curry数量,这取决于我需要多少个参数。实际上,为每个函数声明一个单独的curry比简单地声明事件处理程序和其他东西而不是使用钩子更浪费时间。
有没有什么方法可以合理地解决这个问题,或者这是不可能的?
您可以编写一个接受输入参数并返回函数的函数。举个例子,你可以做:
checkMinValue = (min) => (input: number) => input >= min ? '' : `Must be bigger than ${min}`
现在,当您调用checkMinValue(8(时,它会返回一个您可以传递的函数