{ const_antd modal">
当前位置:   article > 正文

antd中封装Modal的几种方式_antd modal

antd modal

1 利用Modal.method.

特点:无需考虑visible。抛出数据方便

基本使用:

1新建一个Dilaog.js。核心内容是创建一个Modal

  1. import {Form,Modal,Input} from "antd"
  2. import React from "react"
  3. import {Button} from "antd"
  4. function CreatModal(props) {
  5. const Content = ({formRef}) => {
  6. const [form] = Form.useForm()
  7. const onFinish = (values) => {
  8. console.log('Success:', values);
  9. };
  10. const onFinishFailed = (errorInfo) => {
  11. console.log('Failed:', errorInfo);
  12. };
  13. return (
  14. <Form
  15. form={form}
  16. ref={formRef}
  17. onFinish={onFinish}
  18. onFinishFailed={onFinishFailed}
  19. >
  20. <Form.Item label="姓名" name="name" rules={[{ required: true, message: 'Please input your username!' }]}>
  21. <Input style={{ width: 200 }} />
  22. </Form.Item>
  23. <Form.Item label="球队" name="team" rules={[{ required: true, message: 'Please input your username!' }]}>
  24. <Input style={{ width: 200 }} />
  25. </Form.Item>
  26. <Form.Item style={{ width: 200 }}>
  27. <Button type="primary" htmlType="submit">
  28. Submit
  29. </Button>
  30. </Form.Item>
  31. </Form>
  32. )
  33. }
  34. // content里面存放表单
  35. return new Promise((openSuccess,openError) => {
  36. const formRef = React.createRef();
  37. Modal.confirm({
  38. title: props.title,
  39. content: <Content formRef={formRef} />,
  40. okText: '确定',
  41. cancelText: '取消',
  42. onOk() {
  43. return new Promise((resolve,reject) => {
  44. formRef.current.validateFields().then(values =>{
  45. // 获取表单数据,在这里进行异步操作
  46. resolve()
  47. openSuccess(123)
  48. }).catch(err=>{
  49. reject()
  50. openError(123)
  51. })
  52. })
  53. }
  54. })
  55. })
  56. }
  57. export default modalOpen;

2 在父组件中引入该函数

  1. import { Component,useRef } from "react"
  2. import CreateMpdal from '../components/CreateMpdal.js'
  3. import {Button} from "antd"
  4. function Detail(){
  5. const openModal= async() => {
  6. let data={
  7. title:"我是标题"
  8. }
  9. let res= await CreateMpdal(data);
  10. console.log("res:",res) //这里会抛出123
  11. }
  12. return(
  13. <div>
  14. <Button onClick={createData}> dia</Button>
  15. </div>
  16. )
  17. }
  18. export default Detail

 2 利用useRef获取Modal组件的ref,直接操作其显示和隐藏。

特点:需要再Modal内部引入一个visible变量。数据抛出需要通过在组件中传递一个props函数来在父组件中接收。相对方法一稍显复杂。但是通过ref引用来控制Modal内部的隐藏和显示,避免在父组件内部再申明一个visible的state

具体用法:

  1. import React, { useState, forwardRef, useImperativeHandle,useRef } from 'react'
  2. import {Modal} from "antd"
  3. function Dialog(props, ref) {
  4. const { onSuccess, renderBtn = <span>aaa</span>, item = {},successFn } = props
  5. const [visible, setVisible] = useState(false)
  6. // modal的显示与隐藏
  7. const showModal = () => {
  8. setVisible(true)
  9. }
  10. const hideModal = () => {
  11. setVisible(false)
  12. }
  13. useImperativeHandle(ref, () => ({
  14. showModelRef: showModal,
  15. hideModelRef: hideModal
  16. }))
  17. const handleClose = () => {
  18. hideModal();
  19. let num=100;
  20. successFn(num) //注意这里。successFn是父组件的方法,这里把num的值传出去
  21. }
  22. return (
  23. <Modal
  24. width={670}
  25. footer={null}
  26. visible={visible}
  27. centered={true}
  28. maskClosable={false}
  29. onCancel={handleClose}
  30. destroyOnClose={true}
  31. >
  32. <h1>这是测试一</h1>
  33. <h2>这是测试一</h2>
  34. <h3>这是测试一</h3>
  35. <h4>这是测试一</h4>
  36. </Modal>
  37. )
  38. }
  39. export default forwardRef(Dialog)

父组件代码:

  1. import { Component,useRef } from "react"
  2. import Dialog from '../components/dialog.js'
  3. import {Button} from "antd"
  4. function Home(){
  5. const successFuc=(data)=>{
  6. console.log("success--",data)
  7. }
  8. const dialogRef = useRef()
  9. const test=()=>{
  10. console.log("dialogRef:",dialogRef)
  11. dialogRef.current.showModelRef(true)
  12. }
  13. return(
  14. <div>
  15. <Button type="primary" onClick={test}>home--点击</Button>
  16. <Dialog successFn={successFuc} ref={dialogRef} ></Dialog>
  17. </div>
  18. )
  19. }
  20. export default Home

3 还是利用高阶组件的思想。我们把组件的属性通过prop传递给modal,再通过把函数通过props传来抛出modal内部的数据。

(1)新建一个wrap.js

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. const wrapper = (component) => {
  4. // 销毁组件
  5. const destoryDialog = (element) => {
  6. const unmountResult = ReactDOM.unmountComponentAtNode(element);
  7. if(unmountResult && element.parentNode) {
  8. setTimeout(() => {
  9. element.parentNode.removeChild(element);
  10. }, 300);
  11. }
  12. }
  13. // 渲染组件
  14. const render = ({element, component, config}) => {
  15. const comInstance = React.createElement(component, {
  16. ...config,
  17. key: 'div',
  18. closeDialog: () => {
  19. destoryDialog(element)
  20. },
  21. visible: true
  22. })
  23. ReactDOM.render(comInstance, element)
  24. }
  25. return function (config) { // 挂载div
  26. const element = document.createElement('div');
  27. render({element, component, config});
  28. document.getElementsByTagName('body')[0].appendChild(element);
  29. }
  30. };
  31. export default wrapper;

(2)在warp的基础上包装Modal

  1. import React from 'react';
  2. import {Modal} from 'antd';
  3. import wrapper from './wrapper';
  4. const attrOpts=[
  5. {
  6. id:"001",
  7. value:""
  8. }
  9. ]
  10. const FncModal = (props) => {
  11. console.log("props:",props)
  12. const onCancelData = '这是 MemberModal onCancel 传递出来的数据';
  13. const onOkData = '这是 MemberModal onOK 传递出来的数据';
  14. const handleCancel = () => {
  15. props.onCancel(onCancelData);
  16. props.closeDialog();
  17. };
  18. const handleOk = () => {
  19. props.onOK(onOkData);
  20. props.closeDialog();
  21. };
  22. return(
  23. <Modal
  24. title={props.title}
  25. visible={props.visible}
  26. onCancel={handleCancel}
  27. onOk={handleOk}
  28. >
  29. <p>Some contents...</p>
  30. <p>Some contents...</p>
  31. <p>Some contents...</p>
  32. </Modal>
  33. )
  34. };
  35. export default wrapper(FncModal );

(3)外层接受

  1. import React, { useState } from 'react';
  2. import { Table, Button, Divider} from 'antd';
  3. import OpenModal from '../components/openModal';
  4. import FncModal from "../components/FncModal"
  5. const data = [{
  6. name: '张三',
  7. age: '12'
  8. }, {
  9. name: 'tom',
  10. age: '22'
  11. }]
  12. const Prod = () => {
  13. const [modalData, setModalData] = useState('111111');
  14. const columns = [
  15. {
  16. dataIndex: 'name',
  17. title: '姓名'
  18. },{
  19. dataIndex: 'age',
  20. title: '年龄'
  21. }, {
  22. title: '操作',
  23. render: (text, record) => {
  24. return <div>
  25. <a onClick={() => showModal('edit',record)}>编辑</a>
  26. <Divider type="vertical" />
  27. <a onClick={() => showModal('add',record)}>查看</a>
  28. <Divider type="vertical" />
  29. <a >删除</a>
  30. </div>
  31. }
  32. }
  33. ]
  34. const handleOk = (okData) => {
  35. console.log("ok--parent-data:",okData)
  36. //这里我们接受值
  37. setModalData(okData);
  38. };
  39. const handleCancel = (cancelData) => {
  40. setModalData(cancelData);
  41. };
  42. const showModal = (type,record={}) => {
  43. console.log("type:",type)
  44. console.log("record:",record)
  45. let title = type=== "edit"?"编辑":"新建"
  46. MemberModal({
  47. type,
  48. record,
  49. onOK: handleOk, //这里是核心
  50. onCancel: handleCancel, //这里是核心
  51. })
  52. };
  53. return (
  54. <>
  55. <hr />
  56. <Table
  57. dataSource={data}
  58. columns={columns}
  59. />
  60. <p>{modalData}</p>
  61. </>
  62. );
  63. };
  64. export default Prod

这样我们就可以通过函数命令式方式来调用Modal。非常方便

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/115629
推荐阅读
相关标签
  

闽ICP备14008679号