【问题标题】:Is there a way to do not repeat this loop有没有办法不重复这个循环
【发布时间】:2022-01-15 17:39:22
【问题描述】:

我有一个问题,我正在制作 React 应用程序。问题是,在 useEffect 中,每次只有一件事发生变化时,我都会遍历六个项目。如何解决仅更改一个在reducer函数中更改的变量而不是在仅更改一项时循环6个项目的问题,还是可以保留这样的代码?

 const initialReducerValue = {
        name: {
            val: '', 
            isValid: false, 
        },
        lastName: {
            vaL: '',
            isValid: false
        },
        phoneNumber: {
            val: '',
            isValid: false
        },
        city: {
            val: '',
            isValid: false,
        },
        street: {
            val: '',
            isValid: false
        },
        postal: {
            val: '',
            isValid: false
        },
        
    }
    
    const OrderForm = () => {
    
        const orderReducer = (state, action) => {
            if (action.type === 'HANDLE TEXT CHANGE') {
                
                
                return {
                    ...state,
                    [action.field]: {
                        val: action.payload,
                        isValid: true 
                    }
                    
                }
            }
        }
        
    
    
        const [formState, formDispatch] = useReducer(orderReducer, initialReducerValue)
        const [formIsValid, setFormIsValid] = useState(false)
    
        const changeTextHandler = (e) => {
            formDispatch({
                type: 'HANDLE TEXT CHANGE',
                field: e.target.name,
                payload: e.target.value
            })
        }
        
        useEffect(() => {
            const validationArray = []
            for (const key of Object.keys(formState)) {
                validationArray.push(formState[key].isValid)
             }
    
            const isTrue = validationArray.every(item => item)
            setFormIsValid(isTrue)
        }, [formState])

【问题讨论】:

  • 您可以取消验证,使其不会在每次击键时运行。

标签: javascript reactjs


【解决方案1】:

这段代码

const validationArray = []
for (const key of Object.keys(formState)) {
    validationArray.push(formState[key].isValid)
}
    
const isTrue = validationArray.every(item => item)

等价于

const isTrue = Object.values(formState).every(item => item.isValid);

当仅更改一项时,这仍会遍历所有项,但临时数组更少。

对于六个项目,我不会花时间尝试进一步优化此代码,但这是您的选择。

【讨论】:

  • 是的,我会保留它。我正在学习编程,有时我会想太多。
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
相关资源
最近更新 更多