相关文章推荐
酷酷的海豚  ·  在Android ...·  1 年前    · 
眉毛粗的硬盘  ·  Material ...·  1 年前    · 

antd3中实时获取变化的表单值

由于项目中使用的antd版本是3.x,若要实时获取变化的表单值,可以使用 onValuesChange 配置项,如下所示:

import React, { Component } from 'react'
import { Modal, Form, Checkbox } from 'antd';
@Form.create({
    onValuesChange(props, changedValues, allValues) {
        // throttle为自定义节流函数
        throttle(index.formValuesChange(props, changedValues, allValues), 100);
});
export default class index extends Component {
    constructor(props) {
        super(props);
        this.state = {
            data: [],
    componentDidUpdate(prevProps) {
        // 处理data
     * 表单值实时更新
     * @param {Object} props
     * @param {Object} changedValues 当前改变的表单项
     * @param {Object} allValues 全量表单项
    static formValuesChange = (props, changedValues, allValues) => {
        const { form } = props;
         * 1、此处可以实时获取当前改变的表单值以及当前全量表单值。
         * 2、使用form内的属性及函数可以改变所需的表单值。
         * 3、无法使用this指向,无法修订data。
    render() {
        const { form } = this.props;
        const { data } = this.state;
        // 弹窗内表单,仅列出关键代码
        return <Modal>
                data?.map(v => (
                    <Form.Item key={v.key}>
                            form.getFieldDecorator(v.key, { initialValue: undefined })
                                (<Checkbox.Group options={v.list} disabled={v.disabled} />)
                    </Form.Item>
          </Form>
        </Modal>

局限性:无法在formValuesChange中使用this指向,即也无法根据条件改变data。(antd4无此局限,具体用法可参考官网:https://ant.design/components/form)

使用antd3,在能够实时获取表单变化的前提下,使用this指向

import React, { Component } from 'react'
import { Modal, Checkbox, Form } from 'antd';
@Form.create()
export default class index extends Component {
    constructor(props) {
        super(props);
        this.state = {
            data: [],  // 弹窗数据
            formValues: {}, // 存储最新的全量表单值
    componentDidUpdate() {
        const { form } = this.props;
        const { formValues } = this.state;
        // 比较上次的表单值与当前的表单值是否相等,isEqualObject为自定义的比较函数
        if (!isEqualObject(formValues, form?.getFieldsValue())) {
            this.formValuesChange(formValues, form?.getFieldsValue());
            // 修改最新的全量表单值
            this.setState({ formValues: form?.getFieldsValue() });
     * 表单值变化实时更新
     * @param {Object} preValues 上次的表单值
     * @param {Object} currentValues 当前的表单值
    formValuesChange = (preValues, currentValues) => {
         * 比较上次的表单值与当前的表单值,来判断修改了哪个字段。
         * 此时可以使用this指向,可以修改data。
         * 若preValues为空,表示打开弹窗的操作;若currentValues为空,表示关闭弹窗的操作
        this.setState({ data: [] });
     * 关闭弹窗,销毁数据
    cancel = () => {
        const { onCancel } = this.props;
        onCancel && onCancel();
        this.setState({
            data: [],
            formValues: {},
        });
    render() {
        const { form } = this.props;
        const { data } = this.state;
        // 弹窗内表单,仅列出关键代码
        return <Modal>
                    data?.map(v => (
                        <Form.Item key={v.key}>
                                form.getFieldDecorator(v.key, { initialValue: undefined })
                                    (<Checkbox.Group options={v.list} disabled={v.disabled} />)
                        </Form.Item>
            </Form>
        </Modal>

有更好的解决方案,可以给我留言,让我学习一下~

antd 有时候 还是会碰见这样得问题得,但是antd已经帮我们封装好了, 通过form表单来控制 各个表单元素 ,当我们想要监控某一个表单变化的时候 发现不好搞了 最近有个小需求 就是 监听表单 单选框变化 来触发一些 效果,这样的话就要求你要知道 每次发现改变的回调了 在 配置的时候 有一个api方法 可以用来 监控变化 以及变化后的 onValuesChange 字段更新时触发回调事件 function(changedValues, allValues) onFieldsCha antd Form组件的onValuesChange回调,在通过form.setFieldValue / form.setFieldsValue api修改时,不会触发。 在添加的表单,默认一般都为空,或者是真假状态的,所以说为Form的 initialValues 属性内的表单项的字段名称对应的设为空的字符串,或者false默认的radio单选初始即可。在打开编辑时显示的自然是当前编辑的这项的所有状态,接着还是在 onValuesChange 使用一个状态拿到最新的更改后的数据提交编辑即可。编辑时的初始为当前编辑项,所以直接可直接将当前编辑项的整个对象数据放入initialValues属性当做即可。allValues为整个最新的状态的表单对象。 首先理解正确解法,如果在 Form 组件要想改变他其 Form.Item 就需要给 Form 绑定一个 form 属性, 用。还是需要读懂框架给的接口文档。今天我总是想在 Form 表单绑定(历时 4h 的修改,最后通过yupi哥的代码得到提示最终解决),并且能够动态修改。进行定义,需要父组件传过来的而且需要动态更新的话就需要随时的监听这个变化,所以需要用到生命周期函数,用。时,如果想要控制里面的表单就需要给ProTable 也设置一个 formRef 属性,然后定义。 const{getFieldDecorator}=this.props.form;const formItemLayout={labelCol:{xs:{span:24},sm:{span:6},},wrapperCol:{xs:{span:24},sm:{span:14},},};constEditLargeSize=Form.create({当Form.Item子节点的发生改变时触发,可以把... import React,{ useState, useEffect } from 'react'; import { Button, Form, Input } from 'antd'; // 防抖 function debounce(fn: Function, delay = 500) { let timeoutId: any; return function (this: any) { clearTimeout(timeoutId); timeoutId = setTimeo ​ 在开发项目,经常使用表单模块,来完成交互的过程。但是我感觉,在以前开发的过程,就是直接copy,没有仔细的去理解其的逻辑,只要现象满足就可以。但是最近项目想封装一个通用的表单组件,还是必要知道其的逻辑和各个属性。所以,就回头过来仔细的理一下。 在antd4使用form表单,有着三种不同的方式的写法。 普通用法 (所以的布局全在表单) hooks写法 .