在react-antd中弹出层form内容传递给父组件的操作

我就废话不多说了,大家还是直接看代码吧~

子组件:

// jshint esversion:6
import React, { Component } from 'react';
import { Form, Input} from 'antd';

const FormItem = Form.Item;

class Forms extends Component{
  getItemsValue = ()=>{  //3、自定义方法,用来传递数据(需要在父组件中调用获取数据)
    const values= this.props.form.getFieldsValue();    //4、getFieldsValue:获取一组输入控件的值,如不传入参数,则获取全部组件的值
    return values;
  }
  render(){
    const { form } = this.props;
    const { getFieldDecorator } = form;  //1、将getFieldDecorator 解构出来,用于和表单进行双向绑定
    return(
      <Form layout="vertical">
        <FormItem label="姓名">
          {getFieldDecorator('name')(  //2、getFieldDecorator 的使用方法,这种写法真的很蛋疼
            <Input />
          )}
        </FormItem>
        <FormItem label="年龄">
          {getFieldDecorator('age')(
            <Input />
          )}
        </FormItem>
        <FormItem label="城市">
          {getFieldDecorator('address')(
            <Input />
          )}
        </FormItem>
      </Form>
    )
  }
}

export default Form.create()(Forms); //创建form实例

父组件:

import React, { Component } from 'react';
import { Modal } from 'antd';
import Forms from './Forms'

export default class Modals extends Component {
  handleCancel = () => {
    this.props.closeModal(false);
  }
  handleCreate = () => {
    console.log(this.formRef.getItemsValue());   //6、调用子组件的自定义方法getItemsValue。注意:通过 this.formRef 才能拿到数据
    this.props.getFormRef(this.formRef.getItemsValue());
    this.props.closeModal(false);
  }
  render() {
    const { visible } = this.props;
    return (
      <Modal
        visible={visible}
        title="新增"
        okText="保存"
        onCancel={this.handleCancel}
        onOk={this.handleCreate}
      >
        <Forms
          wrappedComponentRef={(form) => this.formRef = form}    //5、使用wrappedComponentRef 拿到子组件传递过来的ref(官方写法)
        />
      </Modal>
    );
  }
}

补充知识:react+antd组件 modal里面包裹使用form表单并获取提交事件

1 先上图

我这里是点击“修改密码”那个按钮,然后跳到了modal框。(大家这里可以随便写一个按钮,然后给他一个点击事件让他可以显示modal框就好了,我这里着重讲解标题的内容)

2 贴代码

const [visible, setVisible] = useState(false);//antd 控制modal是否显示
const showMoal=()=>{
  // console.log("showMoal")
  setVisible(true);
}
const handleCancel = e => {
// console.log("cancel:",e);
setVisible(false);
};

function updatePasswordChange(){
  // console.log("0000");
  setVisible(false);
}

//Modal框
 <Modal
   title="密码修改"
   visible={visible}
   onCancel={handleCancel}
   footer={null}
 >

   <UpdatePassword updatePasswordChange={updatePasswordChange}></UpdatePassword>
</Modal>

//Form表单的提交事件
const onFinish = values => {
    // console.log('Success:', values);
    IsUpdatePassword.commit(session.environment,values.newpassword,values.oldpassword,(response, errors) => {
        if (errors) {
          message.error(errors[0].message);
        } else {
          //修改密码成功
          message.success('修改密码成功!');
          props.updatePasswordChange();
        }
      },
      (errors) => {
        message.error(errors.source.errors[0].message);
      })

};

//Form表单部分
return(
    <>
      <Form
        {...layout}
        name="密码修改"
        initialValues={{
          remember: true,
        }}
        onFinish={onFinish}
        onFinishFailed={onFinishFailed}
      >
        <Form.Item
          label="旧密码"
          name="oldpassword"
          rules={[
          {
            required: true,
            message: '请输入旧密码!',
          },
          ]}
        >
          <Input.Password />
        </Form.Item>

        <Form.Item
          label="新密码"
          name="newpassword"
          rules={[
          {
            required: true,
            message: '请输入新密码!',
          },
          ]}
          hasFeedback
        >
          <Input.Password />
        </Form.Item>

        <Form.Item
          name="confirm"
          label="确认新密码"
          dependencies={['newpassword']}
          hasFeedback
          rules={[
          {
            required: true,
            message: '请确认新密码!',
          },
          ({ getFieldValue }) => ({
            validator(rule, value) {
            if (!value || getFieldValue('newpassword') === value) {
              return Promise.resolve();
            }
            return Promise.reject('两次新密码不一致!');
            },
          }),
          ]}
        >
          <Input.Password />
        </Form.Item>

        {/* <Form.Item {...tailLayout} name="remember" valuePropName="checked">
          <Checkbox>Remember me</Checkbox>
        </Form.Item> */}

        <Form.Item {...tailLayout}>
          <Row>
            <Col span={12}>
              <Button type="primary" htmlType="submit">
              确认
              </Button>
            </Col>
            <Col span={12}>
              <Button onClick={props.updatePasswordChange}>
              取消
              </Button>
            </Col>
          </Row>
        </Form.Item>
      </Form>
    </>
  );
}

小结:

上面的代码你看起来可能有点乱,而且也运行不起来,那是肯定的!因为我只粘贴了整个项目的一部分。

下面我来点睛:modal里面使用form表单并获取提交事件主要是使用了modal的**footer={null}**这个特性把外面的“确认取消按键隐藏”,然后使用我们自己的Form的“确定取消”按键,然后再通过Form的onFinish 事件来提交值和控制modal框的显示与消失。

就ok了!

以上这篇在react-antd中弹出层form内容传递给父组件的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Vue 之孙组件向爷组件通信的实现

    如何把孙组件内特定的数据传给爷组件? 例如 把孙组件的名字传给爷组件并在爷组件上显示 思路 在孙组件被点击后 emit 事件 1 和孙组件的名字 在父组件上监听孙组件 emit 出的事件 1,再次 emit 事件 2 在爷组件上监听父组件 emit 出的事件 2,并触发处理函数 这个处理函数将父组件传出的子组件名字显示在父组件上 <!DOCTYPE html> <html lang="en" dir="ltr"> <head> &

  • 简单了解vue中父子组件如何相互传递值(基础向)

    前言 首先,你需要知道vue中父组件和子组件分别指的是什么? 父组件:vue的根实例--用new Vue()构造函数创建的vue实例(实例会有一个挂载点,挂载点里的所有内容可理解为父组件的内容) 这里以root为挂载点,root里包含的所有内容可称为模板,即我们常说的父组件 子组件:用Vue.component()注册的组件(下图todo-item就是组件的名称,该名称可自定义,推荐使用短横线分隔命名) 定义组件名的2种方式(截图截自vue官网) 注:建议在html中引用组件时(非字符串模板),

  • Vue实现的父组件向子组件传值功能示例

    本文实例讲述了Vue实现的父组件向子组件传值功能.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Vue 父组件向子组件传值</title> <script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></scrip

  • 在react-antd中弹出层form内容传递给父组件的操作

    我就废话不多说了,大家还是直接看代码吧~ 子组件: // jshint esversion:6 import React, { Component } from 'react'; import { Form, Input} from 'antd'; const FormItem = Form.Item; class Forms extends Component{ getItemsValue = ()=>{ //3.自定义方法,用来传递数据(需要在父组件中调用获取数据) const values

  • js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)

    js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动) 复制代码 代码如下: <!doctype html> <head> <meta charset="utf-8" /> <title></title> <style type="text/css"> *{}{margin:0;padding:0;} html{}{_background:url(about:blank);} /**//*

  • 解决layer弹出层的内容页点击按钮跳转到新的页面问题

    在参与的一个项目中,有一个这样的需求,导入基础数据成功后,默认弹出一个管理员登录页,点击登录按钮,需要跳到管理页面. 导入页按钮: <button type="button" id="start" class="layui-btn layui-btn-radius layui-btn-lg layui-bg-orange btn3"><i>导入</i></button> 导入按钮的点击事件,点击后会

  • jquery实现居中弹出层代码

    复制代码 代码如下: /* 弹出窗口定位到浏览器中间 1. show(options{ height:高度 width:宽度 speed:渐显时间 默认0 container:包含的html内容的jquery对象 model:是否是模态窗口,默认true,模态对话框就是在弹层下面在覆盖遮罩层,参考上篇文章Overlay实现 }) 2. close(speed:淡出时间 默认0) */ Q.Panel = function() { var self = this; self._resetPosit

  • 点击弹出层效果&弹出窗口后网页背景变暗效果的实现代码

    复制代码 代码如下: <html><head><title>网页特效-窗口特效-弹出窗口后网页背景变暗的效果</title><meta http-equiv="content-Type" content="text/html;charset=gb2312"><!--把下面代码加到<head>与</head>之间--><style type="text/cs

  • 纯JavaScript实现的完美渐变弹出层效果代码

    如题,本文将使用纯粹的脚本JavaScript实现渐变的弹出层,其想法也非常简单:利用IFrame实现遮盖,再借助一个DIV用于展现弹出层的内容,最后再使用其内置函数setInterval()和clearInterval()实现渐变,原理非常简单,只不过要注意对DOM对象/元素的精确控制.由于代码比较简单,在此就不再赘述.以下代码在IE6+,FF3.5+测试通过. 脚本Flyout.js: 复制代码 代码如下: // JScript File if (navigator.userAgent.to

  • jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)

    弹出层主要用于展示丰富的页面信息,还有一个更好的应用是弹出表单层丰富交互应用.常见的应用有弹出登录表单层,用户提交登录信息,后台验证登录成功后,弹出层消失,主页面局部刷新用户信息.本文我们将给大家介绍如何使用jQuery+Ajax+PHP弹出层异步登录的应用. 效果展示        源码下载 HTML 由于本例UI部分使用了Bootstrap,以及使用jQuery插件,因此需要事先载入相关文件,推荐大家使用相关的CDN资源. <link rel="stylesheet" hre

  • jQuery弹出层插件Lightbox_me使用指南

    网站开发过程中,为了增加网站交互效果,我们有时需要在当前页面弹出诸如登陆.注册.设置等窗口.而这些窗口就是层,弹出的窗口就是弹出层.jQuery中弹出层插件很多,但有些在html5+css3浏览器下,支持完美.而在例如ie8一下的浏览器下显示不出应有的效果.例如jquery.avgrund插件在ie8下就无法显示. 本文介绍的插件Lightbox_me可以完美的支持chrome,firefox和ie7,ie8,ie9等主流浏览器. 1.Lightbox_me插件功能 用于显示弹出层 2.Ligh

  • 弹出层之1:JQuery.Boxy (一) 使用介绍

    1.下载并修改插件 可以在官网上下载到最新版(http://plugins.jquery.com/files/boxy-0.1.4.zip),到我写这些文字的时候最新版为0.1.4版,下载解压后有1个主要的js文件:jquery.boxy.js;1个css文件;还有4个图片用于构成弹出层的4个圆角.将文件引入系统中,修改boxy.css,将下面的图片路径修改为项目中实际的位置,如果设置不对会引起图片失效,那时就难看了. 复制代码 代码如下: /* 将此处的图片修改为相对于css文件的图片文件的路

  • react antd实现动态增减表单

    之前写动态表单遇到过坑,就是用index下标做key会导致bug,而且很严重! 今天有空写下文章记录下:怎么处理和逻辑 我用的是antd3的版本,3和4的表单有点不一样,不过差别应该不大. 需求: 1.选择类型切换展示固定的模板 2.通过新增字段可以动态增减表单里面的每一行 3.控制每一行的字段是否需要必填 4.编辑时候回填参数 效果图: 部分关键代码: import React, { Component } from 'react'; import styles from './index.l

随机推荐