Javascript 反应挂钩-我应该使用';useState';对于不变的状态?

Javascript 反应挂钩-我应该使用';useState';对于不变的状态?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,当我最初学习React组件时,我总是被告知将所有内容都放在这个.state中。无论是经常更新的数据还是从不更新的数据 然而,随着React钩子的实现,即使状态不会更新,我也不确定应该使用useState的频率 让我给你举一个我的一些表单逻辑的例子: const FormAuth = props => { //Frequently updates const [validInput, setValidInput] = useState({ isComplete

当我最初学习React组件时,我总是被告知将所有内容都放在
这个.state中。无论是经常更新的数据还是从不更新的数据

然而,随着React钩子的实现,即使状态不会更新,我也不确定应该使用
useState
的频率

让我给你举一个我的一些表单逻辑的例子:

const FormAuth = props => {
    //Frequently updates
    const [validInput, setValidInput] = useState({
        isCompletedForm: Boolean,
        firstName: Boolean,
        lastName: Boolean,
        email: Boolean,
        password: Boolean,
        confirmPassword: Boolean
    });

    // Never updates
    const [formSchema, setFormSchema] = useState({
        firstName: Joi.string().required(),
        lastName: Joi.string().required(),
        email: Joi.string().required().email().regex(emailRegex),
        password: Joi.string().required().regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[#$^+=!*()@%&?.]).{8,30}$/),
        confirmPassword: Joi.string().required()
    })

    // Never updates
    const [inputRef, setInputRef] = useState({
        firstNameRef: React.createRef(),
        lastNameRef: React.createRef(),
        emailRef: React.createRef(),
        passwordRef: React.createRef(),
        confirmPasswordRef: React.createRef()
    });

    // render some JSX
}
这里我有三个州。第一个状态是布尔值,表示输入是否良好。第二种状态是永远不会更新的formSchema。最后,第三种状态是每个输入的参考,也永远不会更新

我的问题是:对于
validInputs
只有一个状态更合理,因为它经常更新,然后对于
formSchema
inputRef
使用普通javascript创建一个const对象?还是一切都应该像以前那样进入状态


在我看来,如果状态要更新,那么只使用
useState
会更有意义,但我正在尝试了解钩子前进的正确约定。

您应该只需要在以下情况下使用状态:

  • 它控制某种类型的(如
    输入
    选择
    textarea
    等)
  • 它控制着一些需要处理的数据(如待办事项列表,需要创建、读取、更新和删除一些项目——对于同构应用程序也是如此,其中一些数据在发送到后端存储之前需要在前端处理)
  • 它用于某种类型,其中DOM需要随着UI更改而重新呈现(如
    isLoading
    布尔值,当
    为true
    时显示微调器,但当
    为false
    时显示某种布局)
如果您的状态(无论它是什么):需要跨多个组件重用,是静态的,并且不以任何方式更新DOM(如ref、字段级验证函数或某种静态项列表),那么就没有理由将其弄乱

简单地说,不管它是类组件还是带有钩子的功能组件,只要它需要动态地操作/控制DOM中的某些内容,就只需要使用state

下面是一个带有一些验证的表单的简单示例


我担心您频繁更新的状态处于对象状态。是的,你们可以这样做,但这不是一个好方法来更新你们的个人状态,把他们放在对象

如果数据未更改或更新,则不需要将其保持在状态。您可以在某些变量中指定该类型的数据

//您可以通过此函数跟踪状态值和状态更改
//您可以在不同的组件中使用相同的功能
导出函数用于输入(initialValue=“”){
常量[input,setInput]=使用状态(初始值);
函数handleInputChange(e){
设置输入(如目标值);
}
返回{
值:输入,
onChange:handleInputChange,
}
}
const FormAuth=props=>{
//经常更新
//useFormInput函数将返回输入值并取消对函数的更改
const firstName=useFormInput();
const lastName=useFormInput();
//永不更新
//在这里,不更新数据是在formSchema变量中分配的
const formSchema={
名字:Joi.string().required(),
lastName:Joi.string().required(),
电子邮件:Joi.string().required().email().regex(emailRegex),
密码:Joi.string().required().regex(/^(?=.[a-z])(?=.[a-z])(?=.*\d)(?=.[#$^+=!*()@%&])。{8,30}$/,
confirmPassword:Joi.string().required()
}
//永不更新
常量inputRef={
firstNameRef:React.createRef(),
lastNameRef:React.createRef(),
emailRef:React.createRef(),
passwordRef:React.createRef(),
confirmPasswordRef:React.createRef()
}
返回(
//firstname值和onchange函数将
//分配使用扩展运算符
)

}
我认为应该使用
useRef
挂钩,而不是
createRef