react + antd 封装通过json数组形式的Form表单

简介: 最近在搞react + antd,在弄form表单的时候,觉得没写一次都要重新写一次Form, Form.Item,感觉有些麻烦;就想啊,能不能像vue+element那样通过json配置的方式,实现一个form组件

> 最近在搞react + antd,在弄form表单的时候,觉得没写一次都要重新写一次Form, Form.Item,感觉有些麻烦;就想啊,能不能像vue+element那样通过json配置的方式,实现一个form组件


## 1. 假设你已经安装好了依赖,已经可以通过react + antd搭建页面了


> 以下是我的项目主要依赖,版本不同,写法可能也有些不同:

```json

"react": "^18.1.0",

"react-dom": "^18.1.0",

"antd": "^3.26.19",

"react-router": "^3.2.0",

```


## 2.搭建Form组件模子

```js

import React from "react"

import { Form, Col, Row} from "antd"


class Index extends React.Component {


 render() {

   return (

     <Form>


     Form>

   )

 }

}

export default Form.create()(Index)

```



## 3. 老生长谈的,配合Row与Col组件

> 主要是用 Col来做Form.Item的容器

```js

const Item = Form.Item

class Index extends React.Component {

 //这个地方就是我们用来遍历父组件传过来的json数组配置,我们就定义这个配置属性是fields

 getFormField = () => {

   //这里要注意以下 form是通过Form.create()(xxx)

   const {form, getFieldDecorator, fields} = this.props

   return fields.map((item, index)=>(

     <Col key={item.field + item.label + index} >

       <Item label={item.label}>

         {

           getFieldDecorator(item.field, {

             //...表单项配置

           })(

             //表单项配置

           )

         }

       Item>

     Col>

   ))

 }


 render() {

   return (

     <Form>

       <Row gutter={24}>{this.getFormField()}Row>

     Form>

   )

 }


}

//...省略

```


## 4. fields json数组的格式制定

```js

// {label: "姓名", field: "name", attrs: {rules: [{ required: true, message: "请输入!" }], initialValue: "张三",} component: }


// 那么 getFormField 方法也就可以完善了

getFormField = () => {

 //这里要注意以下 form是通过Form.create()(xxx)

 const {form, span = 6, fields} = this.props

 const {getFieldDecorator} = form

 return fields.map((item, index)=>(

   <Col span={span} key={item.field + item.label + index} >

     <Item label={item.label}>

       {

         getFieldDecorator(item.field, {

           ...item.attrs

         })(

           item.component

         )

       }

     Item>

   Col>

 ))

}

```


## 5. 尝试一下

**父组件**

```js

//导入Form组件

import FormPage from "./components/form"

import {Input, InputNumber} from 'antd'


function App() {

 const fields = [

   { label: "姓名", field: "name", attrs: { rules: [{ required: true, message: "请输入!" }] }, component: <Input allowClear placeholder="请输入姓名" /> },

   { label: "年龄", field: "age", attrs: { rules: [{ required: true, message: "请输入!" }] }, component: <InputNumber allowClear placeholder="请输入年龄" style={{width: "100%"}}/> },

 ]


 return (

   <div className="App">

     <FormPage fields={fields}/>

   div>

 );

}

```

#### 效果预览


antd-FormPage.v1.jpg


## 6. 那么,怎么在父组件上获取组件上表单项的值呢?

### 6.1 通过ref

```js

// 父组件中创建一个ref,绑定组件

import React from "react"

import FormPage from "./components/form"

function App() {

 //创建ref对象

 const fromRef = React.createRef()

 const handleForm = ()=> {

   //使用ref对象

   formRef.current.validateFields((err, vals) => {

     if(err) return

     console.log(vals)

   })

 }


 //...省略

 return (

   <div className="App">

     // ref对象与非状态组件绑定

     <FormPage fields={fields} ref={fromRef}/>

     <div style={{textAlign: "right"}}>

       <Button type="primary" onClick={handleForm}>获取Button>

     div>

   div>

 );

}

```

#### 效果预览

antd-FormPage.v2.jpg


### 6.2 使用 rc-form 提供的 wrappedComponentRef


```js

import React, { useState} from "react"

import FormPage from "./components/form"

function App() {

 const EnhancedForm = FormPage

 //非状态组件,用hooks定义变量

 const [form, setform] = useState();


 const handleForm = ()=> {

   //使用

   form.props.form.validateFields((err, vals) => {

     if(err) return

     console.log(vals)

   })

 }


 //...省略

 return (

   <div className="App">

     <EnhancedForm wrappedComponentRef={(form) => setform(form)} fields={fields} />

     <div style={{textAlign: "right"}}>

       <Button type="primary" onClick={handleForm}>获取Button>

     div>

   div>

 );

}

```

#### 效果预览

antd-formPage.v3.jpg


### 6.3 通过回调结合组件的componentDidMount生命钩子

**这种方法需要我们稍稍改造一下FormPage组件**

```js

//...省略

class Index extends React.Component {

 //...省略

 getForm = ()=> {

   const { form} = this.props

   this.props.getForm && this.props.getForm(form)

 }

 componentDidMount() {

   this.getForm()

 }

 //...省略

}

//...省略

```

**父组件使用**

```js

import React, { useState} from "react"

import FormPage from "./components/form"

function App() {

 const [form, setform] = useState();


 const handleForm = ()=> {

   console.log(form)

   //使用

   form.validateFields((err, vals) => {

     if(err) return

     console.log(vals)

   })

 }


 //...省略

 return (

   <div className="App">

     <FormPage fields={fields} getForm={(f) => setform(f)}/>

     <div style={{textAlign: "right"}}>

       <Button type="primary" onClick={handleForm}>获取Button>

     div>

   div>

 );

}

```

#### 效果预览

antd-FormPage.v4.jpg

相关文章
|
前端开发 JavaScript 测试技术
从零开始搭建react+typescript+antd+redux+less+vw自适应项目
从零开始搭建react+typescript+antd+redux+less+vw自适应项目
432 0
|
9月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult&lt;T&gt;`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码&quot;0&quot;和消息&quot;操作成功!&quot;,有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
753 0
|
5月前
|
JSON Java 数据格式
Spring Boot返回Json数据及数据封装
在Spring Boot中,接口间及前后端的数据传输通常使用JSON格式。通过@RestController注解,可轻松实现Controller返回JSON数据。该注解是Spring Boot新增的组合注解,结合了@Controller和@ResponseBody的功能,默认将返回值转换为JSON格式。Spring Boot底层默认采用Jackson作为JSON解析框架,并通过spring-boot-starter-json依赖集成了相关库,包括jackson-databind、jackson-datatype-jdk8等常用模块,简化了开发者对依赖的手动管理。
587 3
|
JSON Java 数据安全/隐私保护
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
1108 1
|
JSON JavaScript API
(API接口系列)商品详情数据封装接口json数据格式分析
在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
人工智能 前端开发 JavaScript
react js 处理表单( form )的2个例子
react js 处理表单( form )的2个例子
|
JSON Java fastjson
Spring Boot返回Json数据及数据封装
本文详细介绍了如何在Spring Boot项目中处理JSON数据的传输 Spring Boot默认使用Jackson作为JSON处理器,并通过`spring-boot-starter-web`依赖自动包含相关组件。文章还展示了如何配置Jackson处理null值,使其转换为空字符串。此外,文章比较了Jackson和FastJson的特点,并提供了FastJson的配置示例,展示了如何处理null值以适应不同应用场景。
|
前端开发 JavaScript 架构师
react+typescript+umi+dva+antd
react+typescript+umi+dva+antd
265 0
|
前端开发
20行代码,封装一个 React 图片懒加载组件
20行代码,封装一个 React 图片懒加载组件
193 0
|
2月前
|
JSON API 数据格式
淘宝拍立淘按图搜索API系列,json数据返回
淘宝拍立淘按图搜索API系列通过图像识别技术实现商品搜索功能,调用后返回的JSON数据包含商品标题、图片链接、价格、销量、相似度评分等核心字段,支持分页和详细商品信息展示。以下是该API接口返回的JSON数据示例及详细解析: