我们可以隐藏表单字段依赖于其他字段吗?

Posted

技术标签:

【中文标题】我们可以隐藏表单字段依赖于其他字段吗?【英文标题】:can we hide form fields depend on other fields? 【发布时间】:2022-01-18 14:01:39 【问题描述】:

我试图使我正在创建的表单尽可能动态, 所以我有一个案例,如果用户从下拉列表中选择值,一些字段会隐藏而其他字段会出现,但是当下拉列表超过 2 个时,我还有其他情况,让我给你们举个例子:

下拉 A :['a','b','c'], 下拉 B:['d','e','f'],

第一种情况,如果用户从 A.a 中选择,则字段 name 将出现,而字段 email 将隐藏。

第二种情况,如果我们有第一种情况,用户如果从 B.e 中选择会出现一些文件,而另一些会隐藏。

所以我该怎么做,这是我的代码。但它不能正常工作:

const [fieldsToHide, setFieldsToHide] = useState<string[]>([
    'name',
    'email',
    'password',
    'signIn',
    'signUp'
  ]);

const onFieldsChange = useCallback((changedFields: FieldData[], allFields: FieldData[]) => 
    const [changedField] = changedFields;
    const  name, value  = changedField || ( as FieldData);
    if (Array.isArray(name) && name.length) 
      const [fieldName] = name;
      if (fieldName === 'A' && value === 'a') 
        setFieldsToHide(['name', 'email']);
       else if (fieldName === 'A' && value === 'c') 
        setFieldsToHide(['email']);
       else if (fieldName === 'A' && value === 'b') 
        setFieldsToHide(['name']);
       else if (fieldName === 'B' && value === 'd') 
        setFieldsToHide(...fieldsToHide,'password']);
       else if (fieldName === 'B' && value === 'e') 
        setFieldsToHide(...fieldsToHide,'signIn','signUp']);
       
    
  , []);

【问题讨论】:

【参考方案1】:

您没有说明为什么它不起作用。你到底哪里有问题。我可以看到的一个问题是:

setFieldsToHide(...fieldsToHide,['password'])

你在这里执行一个带有多个参数的函数 - 而你想用一个参数执行它 - 一个表:

setFieldsToHide([...fieldsToHide,'password']);

甚至更好:

setFieldsToHide(prevFieldsToHide => [...prevFieldsToHide,'password']);

【讨论】:

我的问题当我从第二个 dropDown B 中选择时它隐藏所有字段,当我从 dropDown A 中选择时它显示第二个 dropDown 的所有字段

以上是关于我们可以隐藏表单字段依赖于其他字段吗?的主要内容,如果未能解决你的问题,请参考以下文章

symfony:我们不能有一个隐藏的实体字段吗?

CodeIgniter / GroceryCrud:单选按钮/下拉依赖于取消隐藏隐藏字段

隐藏输入/选择时,表单字段标签不会隐藏

防止清除按钮擦除隐藏字段

使用 html 和 css 将术语输入隐藏表单字段?

如何在颤动中显示带有提交按钮和隐藏输入字段的html表单