在实际开发中,我们会遇到表单中有些数据项是多个,并不是普通的一个值,或者一组值,而是一个数组,比如联系人这一项,我们通常会有多个联系人,这时候,表单的设计会有些不一样。
先给出一个示例:
在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`方法来清空,具体可见前面的回答。