在实际开发中,我们会遇到表单中有些数据项是多个,并不是普通的一个值,或者一组值,而是一个数组,比如联系人这一项,我们通常会有多个联系人,这时候,表单的设计会有些不一样。

先给出一个示例:

在react+antd中,我们需要注意的是,表单的数据表示需要根据数据项的数组长度来制作。我们不能像jQuery那样,在已经生成的dom文档中,通过append的方式或者remove的方式来增减dom中的结点。这里,我们需要借助数据模型,也就是状态的改变来改变dom结点,实现动态增加或者减少数据项。

我们这需要用到的react hook是useState,通过useState,我们需要定义出我们的数组数据项,并设置一个可以更改的方法:

const [contacts,setContacts] = useState([{name:'',mobile:''}])

定义setContacts的目的是为了在新增和删除的时候更改contacts的数据。

另外,在Form中,我们需要使用一个数组来表示数组数据项的内容。

<Form.Item name={['contacts',index,'name']}><Input/></Form.Item><Form.Item name={['contacts',index,'mobile']}><Input/></Form.Item>

我在实际操作中,遇到了这样的情况:就是我们的表单会有一个values,表示的是表单中所有数据项的值,这个values里面也会包含页面上的contacts,而我们定义的contacts并不是表单中表示的contacts,这个似乎很拗口,我们在后面的示例中会提到这里。

先给出这个组件的代码:

import React,{useState} from 'react'
import {Form,Input,Button,Row,Col} from 'antd'
import 'antd/dist/antd.css'
const UserForm = ()=>{
	const [contacts,setContacts] = useState([{name:'zhangsan',mobile:'15011176302'}])
	const formLayout = {labelCol:{span:8},wrapperCol:{span:16}}
	const [form] = Form.useForm()
	const submitForm = ()=>{
		form.validateFields()
		.then(values=>{
			console.log(values);
	const add = ()=>{
		form.setFieldsValue({"contacts":[...contacts,{name:'',mobile:''}]})
		return setContacts([...contacts,{name:'',mobile:''}])
	const del = (index)=>{
		form.setFieldsValue({"contacts":[...contacts.slice(0,index),...contacts.slice(index+1)]})
		return setContacts([...contacts.slice(0,index),...contacts.slice(index+1)])
	const onChange = (index,name,event)=>{
		let tempArray = [...contacts];
		if('name'===name)
			tempArray[index] = {...tempArray[index],name:event.target.value}
			tempArray[index] = {...tempArray[index],mobile:event.target.value}
		return setContacts(tempArray)
	const contactsItems = contacts.map((item,index)=>{
		return <Row key={index}>
				<Col span={10}>
					<Form.Item label="name" name={['contacts',index,'name']}><Input onChange={(event)=>onChange(index,'name',event)}/></Form.Item>
				<Col span={10}>
					<Form.Item label="mobile" name={['contacts',index,'mobile']} ><Input onChange={(event)=>onChange(index,'mobile',event)}/></Form.Item>
				<Col span={3} offset={1}>
					<Button type="primary" onClick={()=>del(index)}>-</Button>
	return <Row>
			<Form name="user_form" form={form} layout={'horizontal'} onFinish={submitForm} initialValues={{contacts:contacts}}>
				<Form.Item label="username" name="username">
					<Input />
				</Form.Item>
				<Form.Item label="contacts">
				{contactsItems}
				</Form.Item>
				<Form.Item><Button type="primary" onClick={add}>+</Button></Form.Item>
				<Form.Item>
					<Button type="primary" htmlType='submit'>submit</Button>
				</Form.Item>
			</Form>
export default UserForm

这是一个示例代码,表单不会真正的提交给后台,而是在提交的时候,仅仅是打印一下表单的数据。

这里面需要注意的地方有三个:

1、表单如何设置才能在提交表单的时候获得对应数组项,
2、实现动态增减,我们需要通过setContacts方法改变数组数据项,
3、就是前面提到的,form表单的values.contacts值并不是我们在代码中通过useState()定义出来,所以我们需要在数据发生更改的地方,同时维护values.contacts和contacts两个对象。

在实际开发中,我们会遇到表单中有些数据项是多个,并不是普通的一个值,或者一组值,而是一个数组,比如联系人这一项,我们通常会有多个联系人,这时候,表单的设计会有些不一样。 先给出一个示例: 在react+antd中,我们需要注意的是,表单的数据表示需要根据数据项的数组长度来制作。我们不能像jQuery那样,在已经生成的dom文档中,通过append的方式或者remove的方式来增减dom中的结点。这里,我们需要借助数据模型,也就是状态的改变来改变dom结点,实现动态增加...
支持两种布局模式,Tab模式和正常模式。两种模式是webpack打包编译时确定的,打包某个模式时不会引入另外一种模式下的多余代码( React 实现Tab模式比较蛋疼)。   实现了RBAC权限控制模型的核心功能页面和操作。   通过解析定义好的JSON数据,可以生成查询 表单 ,静态 表单 动态 表单
记录用户使用的系统配置,缓存浏览器中,记录用户习惯。 1-2. antd 换肤(Layout组件未封装) 使用插件实现扩展 antd 样式文件并绑定cssVariable,通过less.js浏览器在线编译更改更少变量方法实现主题样式更改 @import " _var " ; :root { --primary-color : @primary-color ; --danger-color : red ; window . less . modifyVars ( vars ) . then ( ( ) => { if ( vars [ '@primary-color' ] === getItem ( S 这几天做了个没做过的组件,以此记录下,需要的效果是在一个dom内,缩放拖拽图片。 封装的子组件imgbox.Vue。父组件中使用,需要在父组件中准备一个盒子用来装图片,在这个盒子中可以缩放拽拽图片。 父组件如下 父组件html部分 <!-- 普通方形盒子 --> <div class="box1"> <imgbox :config="data1" @enlarge="enlargeImg" @narrow="narrowImg" @changeIm |-- config webpack配置文件 |-- dist webpack构建目录 |-- docs 文档 |-- public html模板
react + antd 搭建前端管理框架(***支持响应式***),主要模块分为:菜单、选项卡、面包屑;通过路由监听,实现三个模块之间的联动(同时监听浏览器);状态采用 react -redux进行集中管理。目前只包含前端代码,未与后台进行关联实现菜单、用户等权限,若需要,则需进行二次开发。 访问链接:https://blog.csdn.net/weixin_48357332/article/details/124860395
React 中,清空 表单 可以通过 Antd Form 组件提供的`resetFields`方法来实现。具体步骤如下: 1. 在 表单 的父组件中引入` Form `组件,并将 表单 的所有控件都用` Form .Item`包裹起来,每个` Form .Item`需要设置`name`属性,这个属性值需要与`getFieldDecorator`方法中的`id`参数保持一致。 ```jsx import { Form , Input, Button } from ' antd '; class My Form extends React .Component { render() { const { getFieldDecorator } = this.props. form ; return ( < Form .Item label="用户名" name="username"> {getFieldDecorator('username')(<Input />)} </ Form .Item> < Form .Item label="密码" name="password"> {getFieldDecorator('password')(<Input.Password />)} </ Form .Item> < Form .Item> <Button type="primary" onClick={this.handleSubmit}>提交</Button> <Button onClick={this.handleReset}>重置</Button> </ Form .Item> </ Form > 2. 在 表单 的父组件中定义`handleSubmit`和`handleReset`方法。`handleSubmit`方法用于提交 表单 ,`handleReset`方法用于清空 表单 。 ```jsx class My Form extends React .Component { handleSubmit = e => { e.preventDefault(); this.props. form .validateFields((err, values) => { if (!err) { console.log('Received values of form : ', values); handleReset = () => { this.props. form .resetFields(); render() { //... 3. 在 表单 的父组件中将`My Form `组件包裹在` Form .create`函数中,生成一个新的高阶组件,并将其导出。 ```jsx const WrappedMy Form = Form .create({ name: 'my_ form ' })(My Form ); export default WrappedMy Form ; 这样,当用户点击 表单 中的“重置”按钮时, 表单 中的所有控件都会被清空。如果想要清空 表单 中的某一个控件,可以通过`setFieldsValue`方法来清空,具体可见前面的回答。