创建 React 动态表单

Posted

技术标签:

【中文标题】创建 React 动态表单【英文标题】:Create React Dynamic Forms 【发布时间】:2020-08-05 03:26:51 【问题描述】:

我正在尝试使用 react hooks 和 .map() 实现动态表单;

到目前为止,我已经实现了生成静态表单,如下例所示: https://codesandbox.io/s/material-demo-ndh9q

这是我的静态表格:

<form className=classes.root noValidate autoComplete="off">
      <Grid container spacing=4>
        <Grid item xs=12 sm=6 md=4>
          <TextField id="profile" label="Name" fullWidth=true />
        </Grid>
        <Grid item xs=12 sm=6 md=4>
          <TextField id="profile" label="Email" fullWidth=true />
        </Grid>
        <Grid item xs=12 sm=6 md=4>
          <TextField id="profile" label="Address" fullWidth=true />
        </Grid>
        /* textarea */
        <Grid item xs=12 sm=12 md=12>
          <TextField
            label="Info"
            multiline
            rows=1
            rowsMax=4
            fullWidth=true
          />
        </Grid>
      </Grid>
    </form>

在这里我试图使表单动态化:

const initialState =  name: "", email: "", address: "", info: "" ;

export default function BasicTextFields() 

const [inputs, setInputs] = useState( ...initialState );

return(
<form className=classes.root noValidate autoComplete="off">
      <Grid container spacing=4>
      inputs.map((item, index) => (
        <Grid item xs=12 sm=6 md=4>
          <TextField id=index`$item` label=item fullWidth=true />
        </Grid>
      )
  </Grid>
    </form>
)

但它返回错误,不知道为什么,有人可以帮助我提供详细信息。 请记住,表单的最后一个字段也是一个文本区域,因此获取特定属性。

谢谢!

【问题讨论】:

如果我没记错的话,你的inputs 是一个对象,对吧? 【参考方案1】:

我发现您的代码中存在一些问题。

    由于您的inputs 是一个对象,您不能直接在其上使用地图。我使用Object.keys() 来使用map。 您的 template 文字也存在一些问题。

这是您的 form 元素,包含动态内容。

<form className=classes.root noValidate autoComplete="off">
  <Grid container spacing=4>
    
      Object.keys(inputs).map((key, index) => 
        if(key === 'info') 
          return (
            <Grid item xs=12 sm=12 md=12>
            <TextField
              label=key
              multiline
              rows=1
              rowsMax=4
              fullWidth=true
            />
            </Grid>
          )
         else 
          return (
            <Grid item xs=12 sm=6 md=4>
          <TextField id=`index$key` label=key fullWidth=true />
        </Grid>
          )
        
    )
  
  </Grid>
</form>

这里是codesandbox_link。

【讨论】:

如果我有多种类型的字段,我猜每个字段的 if 条件,对吧?谢谢你:) 是的。欢迎:)

以上是关于创建 React 动态表单的主要内容,如果未能解决你的问题,请参考以下文章

React 中的动态表单,无法读取未定义的属性“地图”

React JS - 用动态子组件组成通用表单

react实现动态表单中嵌套动态表单

踩坑React antd 动态表单获取和设置值

React:动态添加输入字段到表单

react.js 基于 DRF HTTP OPTIONS 动态生成表单