React+antd中form的创建和编辑使用同一组件的回显问题

React+antd中form的创建和编辑使用同一组件的回显问题
笔记中的需求讲解:
创建和编辑都是antd中的modal弹框,弹框的内容那是form表单,所以创建不用说,重点则是编辑时的回显。创建和编辑就传个不同值来区别什么时候是创建,什么时候是编辑就好了,笔记不细说了。
React:
使用父传子的形式:
直接可以在componentWillMount这个生命周期中就能拿到数据,然后是用antd——form的一个属性:setFieldsValue设置name就🆗了。

componentWillMount(){
	const { setFieldsValue } = this.props.form;
	setFieldsValue({
		username: “userName”
	})
}

通过dva的形式
如果要用dva 的话, 那引入那个modal组件会被先加载出来,那个时候我们还没有要弹出模态框,而componentWillMount只会执行一次,也就是说我们拿不到更改后的值。
注:componentWillReceiveProps可以拿到,但是在里面设置this.props.form.setFieldsValue会报错而引起死循环,但是我设置setTimeout可以不报错,
但是会造成页面一直刷新,会给页面造成负担,clearTimeout()清楚也不行,因为这样的话值就不显示了
解决方法:

//--------------------------------------------------------------------------------------------------------------
class中的render里面的
<div>
                    <Modal
                        title="编辑应急班次"
                        visible={editorState}
                        onOk={this.handleOk}
                        onCancel={this.handleCancel}
                        destroyOnClose={true}
                        width="60%"
                    >
                        <div className={test.TestEditor}>
                            <Form {...formItemLayout}>
                                <Row>
                                    <Col md={12} sm={24}>
                                        <Form.Item label="班次名称">
                                            {getFieldDecorator('shiftNasme', config.name)(<Input/>)}
                                        </Form.Item>
                                    </Col>
                                    <Col md={12} sm={24}>
                                        <Form.Item label="排班单位">
                                            {getFieldDecorator('typesettingUnit', config.unit)(<Input/>)}
                                        </Form.Item>
                                    </Col>
                                    <Col md={12} sm={24}>
                                        <Form.Item label="开始时间">
                                            {getFieldDecorator('startEndTime', config.startTime)(<TimePicker />)}
                                        </Form.Item>
                                    </Col>
                                    <Col md={12} sm={24}>
                                        <Form.Item label="结束时间">
                                            {getFieldDecorator('createTime', config.endTime)(<TimePicker />)}
                                        </Form.Item>
                                    </Col>
                                </Row>
                            </Form>
                        </div>
                    </Modal>
                </div>
// -------------------------------------------------------------------------------------------------------------------
 class外面的:
 	function mapPropsToFields(props){
    if(props.flag === 1 || props.flag === "1") {
        let timeData = props.editor.startEndTime.split("-");
        let startTime = moment(timeData[0], "HH:mm:ss");
        let endTime = moment(timeData[1], "HH:mm:ss");
        return {
            // 班次名称
            shiftNasme: Form.createFormField({
                ...props.username,
                value: props.editor.shiftNasme
            }),
            // 排班单位
            typesettingUnit: Form.createFormField({
                ...props.username,
                value: props.editor.typesettingUnit
            }),
            // 开始时间
            startEndTime: Form.createFormField({
                ...props.username,
                value: startTime
            }),
            // 创建时间
            createTime: Form.createFormField({
                ...props.username,
                value: endTime
            }),
        };   
    }
}
// ------------------------------------------
导出:
const TestEditorData = Form.create({
    mapPropsToFields:mapPropsToFields
})(TestEditor);
export default TestEditorData

以上的是class组件使用antd3的用法。

还有class组件使用的antd4的用法。
用法:class组件肯定不能像上面那样显示数据,而是通过

// 引入
import {  Form, Input  } from 'antd';
const FormItem = Form.Item;

// 因为我项目使用的是tsx模板,所以formRef写法和别的不同
formRef = React.createRef<FormInstance>();

// 这里是通过ref的方式来设置、获取、重置值等操作的
<Form ref={this.formRef} name="control-ref">
		<FormItem
         	name="dutyType"
        	initialValue={'1'}
         >
           <Input />
         </FormItem>
</Form>

// 获取值
this.formRef.current.validateFields().then(res => {
	console.log(res)
}).catch(err => {
	console.log(err);
})
// 值得注意的是,设置属性值也是不同的。
在class类中我们是通过initialValue,initialValues来设置的
这两个的区别就是可以在全局的Form(initialValues)标签中全部设置,也可在单个的Form.Item(initialValue)中设置
initialValue={"属性名"}
initialValues={{
	name: "我是Form.Item中的label值对应的名称",
	residence: ['zhejiang', 'hangzhou', 'xihu'],
    prefix: '86',
}}
重置等其他操作,可是自行看Ant Design的api;
注:在共用编辑和新建还是要重置的,否则form暂存了数据。

reactHook:
在useEffect中就可以拿到最新的,所以不像react那样区分
原因:reactHook中的useEffect是:componentDidMount 和 componentDidUpdate 两个生命周期函数,所以数据有更改会拿到最新的。
注意:要判断是编辑或者增加状态的时候要先,resetFields,重置一下form表单的状态,原因:
因为你在先进入“编辑”,然后再进入“新建”,就算你进入的是各自的状态,但是会发现form表单已经在编辑中显示的数据会在新建的状态中也会照常显示,这可以认为form表单已经暂存了数据,你需要先重置一下,然后再进入编辑和增加的判断,这样就会完成效果了。

——
如果哪里有错误的点,还望指出哦。

React项目使用Ant Design (antd) 库可以非常方便地实现标签页(Tabs)和表单(Form组件。以下是实现这些功能的基本步骤和代码示例: 1. **实现Tabs(标签页)**: 使用antd的`Tabs`组件,你可以快速创建一个标签页布局。你需要先导入`Tabs`组件,并在你的React组件使用它。 ```jsx import { Tabs } from 'antd'; const { TabPane } = Tabs; class MyTabsComponent extends React.Component { render() { return ( <Tabs type="card"> <TabPane tab="Tab 1" key="1"> Content of Tab 1 </TabPane> <TabPane tab="Tab 2" key="2"> Content of Tab 2 </TabPane> </Tabs> ); } } ``` 2. **实现Form(表单)**: 对于表单,你需要使用antd的`Form`、`Input`等表单控件组件创建一个表单首先需要导入`Form`组件,并设置表单的`initialValues`和`onFinish`事件处理函数。 ```jsx import { Form, Input, Button, message } from 'antd'; const { Item } = Form; class MyFormComponent extends React.Component { handleSubmit = (values) => { console.log('Received values of form: ', values); // 处理表单提交逻辑 message.success('Submit successfully!'); } render() { return ( <Form onFinish={this.handleSubmit}> <Item name="username" rules={[{ required: true, message: 'Please input your username!' }]}> <Input placeholder="Username" /> </Item> <Item name="password" rules={[{ required: true, message: 'Please input your password!' }]}> <Input.Password placeholder="Password" /> </Item> <Item> <Button type="primary" htmlType="submit"> Submit </Button> </Item> </Form> ); } } ``` 3. **表单提交**: 表单提交通常通过绑定`onFinish`事件来实现。在该事件处理函数,你可以获取到用户输入的数据,并进行相应的逻辑处理,比如发送请求到服务器。 在上述示例,`handleSubmit`方法会在表单提交时被调用,可以在这里添加你的提交逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值