react實現(xiàn)動態(tài)增減表單項的示例代碼
在做項目的時候,甲方給的信息有限,網(wǎng)頁的備案信息寫成固定的,如下圖所示:
之后驗收的時候,甲方要求把這個備案信息寫成動態(tài)的,可以自增減,就去react組件庫看看有沒有具體的實現(xiàn),果真有,具體實現(xiàn)如下:
import { PageHeaderWrapper } from '@ant-design/pro-layout'; import { Button, Form, Input, Card, Space, message} from 'antd'; import CustomForm from '@/components/Form'; import { FormattedMessage, useIntl } from 'umi'; import { saveRecordInfomation, getRecordInfomation } from '@/services/record' import { useEffect } from 'react'; import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons'; const formItemLayout = { labelCol: { xs: { span: 24, }, sm: { span: 6, }, }, wrapperCol: { xs: { span: 24, }, sm: { span: 14, }, }, }; const RecordInformation = () => { const intl = useIntl() const [form] = Form.useForm(); const onReset = () => { form.resetFields(); }; useEffect(() => { getRecordInfo() return () => { }; }, []); const getRecordInfo = async () => { getRecordInfomation().then((res) => { if (res.code === 0) { form.setFieldsValue({ recordsInformation: res.data.map((item, index) => ({ ...item, key: index, })), }); } }); } const onFinish = async (forms) => { const res = await saveRecordInfomation(forms.recordsInformation) if (res.code === 0) { message.success(intl.formatMessage({ id: 'pages.cms.save.success' })) getRecordInfo() } else { message.error(intl.formatMessage({ id: 'pages.cms.save.fail' })) } } return ( <PageHeaderWrapper ghost={false}> <div> <Card style={{ height: '95%', }}> <Form {...formItemLayout} variant="filled" style={{ maxWidth: 1000, }} form={form} onFinish={onFinish} > <Form.List name="recordsInformation"> {(fields, { add, remove }) => ( <> {fields.map(({ key, name, ...restField }) => ( <Space key={key} style={{ display: 'flex', marginBottom: 8, marginRight: 0, }} align="baseline" > <Form.Item {...restField} name={[name, 'label']} rules={[{ required: true, message: 'Missing first name' }]} > <Input placeholder={intl.formatMessage({ id: 'pages.record.info.content.public.net.example.filing'})} style={{ width:105, textAlign: 'right', border:'none' }} /> </Form.Item> <Form.Item {...restField} name={[name, 'value']} rules={[{ required: true, message: 'Missing last name' }]} > <Input placeholder={intl.formatMessage({ id: 'pages.record.info.content.public.net.example.filing.url'})} style={{ width:300, }}/> </Form.Item> <MinusCircleOutlined onClick={() => remove(name)} /> </Space> ))} <Form.Item > <Button style={{width: 405}} type="dashed" onClick={() => add()} block icon={<PlusOutlined />}> <FormattedMessage id='pages.record.info.content.add' /> </Button> </Form.Item> </> )} </Form.List> <Form.Item > <Space> <Button type="primary" htmlType="submit"> <FormattedMessage id='pages.save' /> </Button> </Space> </Form.Item> </Form> </Card> </div> </PageHeaderWrapper> ); }; export default RecordInformation;
// record.js文件 import { request } from 'umi'; import { formatReqUrl } from '../../common'; export async function saveRecordInfomation(data) { console.log(data) return request('/beian',{method:'POST', data: data}); } export async function getRecordInfomation() { return request('/beian',{method:'GET'}); }
前端向后端傳送的是一個對象數(shù)組,也就是這種格式:[{label: ‘xxx’, value: ‘xxx’}]
后端用Go實現(xiàn),因為每次新增的信息可能不一樣,所以每次新增的時候,會先刪除舊的數(shù)據(jù),再插入。
代碼如下:
// 定義結構體 type Beian struct { Label string `bson:"label" json:"label"` Value string `bson:"value" json:"value"` DefaultField `bson:",inline"` } // controller func (ctl *BeianController) Post(c *gin.Context) resp.JSON { c.Set("log-opt", "創(chuàng)建beian") doc := []models.Beian{} if err := c.ShouldBind(&doc); err != nil { return resp.Error(http.StatusBadRequest, gin.H{}, err) } c.Set("log-content", models.Doc2string(doc)) id, err := ctl.srv.Insert(doc) if err != nil { return resp.Error(http.StatusInternalServerError, gin.H{}, err) } return resp.Success(gin.H{"id": id}) } //service func (i *BeianServiceImpl) Insert(doc []models.Beian) (primitive.ObjectID, error) { ctx := context.Background() // 先刪除 _, err := i.m.DB.Collection(BeianColl).RemoveAll(ctx, bson.M{}) if err != nil { return primitive.NilObjectID, err } // 再保存 var insertedID primitive.ObjectID for _, info := range doc { result, err := i.m.DB.Collection(BeianColl).InsertOne(ctx, &info) if err != nil { return primitive.NilObjectID, err } if insertedID.IsZero() { insertedID = result.InsertedID.(primitive.ObjectID) } } return insertedID, nil }
最終效果圖如下:
到此這篇關于react實現(xiàn)動態(tài)增減表單項的文章就介紹到這了,更多相關react動態(tài)增減表單項內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
深入學習TypeScript 、React、 Redux和Ant-Design的最佳實踐
這篇文章主要介紹了深入學習TypeScript 、React、 Redux和Ant-Design的最佳實踐,TypeScript 增加了代碼的可讀性和可維護性,擁有活躍的社區(qū),,需要的朋友可以參考下2019-06-06React路由組件傳參的三種方式(params、search、state)
本文主要介紹了React路由組件傳參的三種方式,主要包括了params、search、state,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07使用react render props實現(xiàn)倒計時的示例代碼
這篇文章主要介紹了使用react render props實現(xiàn)倒計時的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12React18使用Echarts和MUI實現(xiàn)一個交互性的溫度計
這篇文章我們將結合使用React 18、Echarts和MUI(Material-UI)庫,展示如何實現(xiàn)一個交互性的溫度計,感興趣的小伙伴可以跟隨小編一起學習一下2024-01-01