你好,我有一个问题,因为我决定使用'useReducer‘钩子来处理表单中的多个输入。我的部件如下所示。正如我们所看到的,有一个重复的代码。对于每个输入,我想要修复的是'isValid‘。它是否可能处理这个或这是可以重复这段代码。我不专业,我只是学习反应,你知道,每个人都告诉我枯燥的原则。
const initialReducerValue = {
name: '',
lastName: '',
phoneNumber: '',
city: '',
street: '',
postal: '',
nameIsValid: false,
lastNameIsValid: false,
phoneNumberIsValid: false,
cityIsValid: false,
streetIsValid: false,
postalIsValid: false,
formIsValid: false
}
const OrderForm = () => {
const orderReducer = (state, action) => {
if (action.type === 'HANDLE TEXT CHANGE') {
return {
...state,
[action.field]: action.payload,
}
}
}
const [formState, formDispatch] = useReducer(orderReducer, initialReducerValue)
console.log(formState)
const changeTextHandler = (e) => {
formDispatch({
type: 'HANDLE TEXT CHANGE',
field: e.target.name,
payload: e.target.value
})
}
return (
<div className={styles.orderForm}>
<label htmlFor='name'>Name</label>
<input onChange={changeTextHandler} id="name" name='name' type='text' />
<label htmlFor='lastName'>Last Name</label>
<input onChange={changeTextHandler} id="lastName" name='lastName' type='text' />
<label htmlFor='phoneNumber'>Phone Number</label>
<input onChange={changeTextHandler} id="phoneNumber" name='phoneNumber' type='number' />
<label htmlFor='city'>City</label>
<input onChange={changeTextHandler} id="city" name='city' type='text' />
<label htmlFor='street'>Street</label>
<input onChange={changeTextHandler} id="street" name='street' type='text' />
<label htmlFor='postal'>Postal Code</label>
<input onChange={changeTextHandler} id="postal" name='postal' type='text' />
{<SendOrderButton isValid={formState.isValid} /> }
</div>
)
}发布于 2022-01-14 23:32:42
我将创建一个对象,以便您可以将action.field与其相应的isValid关联起来。您还可以附加一个验证函数。
const map = {
name: { isValidName: 'nameIsValid' },
// ..etc
}在你的减速机里-
const mapValue = map[action.field];
return {
...state,
[action.field]: action.payload,
[mapValue.isValidName]: true,
}而不是true,您可以使用下面这样的验证器函数
[mapValue.isValidName]: mapValue.validator(action.payload)https://stackoverflow.com/questions/70717602
复制相似问题