首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何缩短useReducer

如何缩短useReducer
EN

Stack Overflow用户
提问于 2022-01-14 23:25:17
回答 1查看 28关注 0票数 1

你好,我有一个问题,因为我决定使用'useReducer‘钩子来处理表单中的多个输入。我的部件如下所示。正如我们所看到的,有一个重复的代码。对于每个输入,我想要修复的是'isValid‘。它是否可能处理这个或这是可以重复这段代码。我不专业,我只是学习反应,你知道,每个人都告诉我枯燥的原则。

代码语言:javascript
复制
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>

        
    )
}
EN

回答 1

Stack Overflow用户

发布于 2022-01-14 23:32:42

我将创建一个对象,以便您可以将action.field与其相应的isValid关联起来。您还可以附加一个验证函数。

代码语言:javascript
复制
const map = {
  name: { isValidName: 'nameIsValid' },
  // ..etc
}

在你的减速机里-

代码语言:javascript
复制
const mapValue = map[action.field];
return {
  ...state,
  [action.field]: action.payload,
  [mapValue.isValidName]: true,
}

而不是true,您可以使用下面这样的验证器函数

代码语言:javascript
复制
[mapValue.isValidName]: mapValue.validator(action.payload)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70717602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档