React组件封装(一)---Modal

在React中,封装组件是一种很常见的作法,可以提高代码的可复用性和可维护性。常见的组件封装有表单组件、模态框组件、通知组件、图片轮播图组件、下拉菜单组件等。

这时候就有人说不是有很多UI组件库吗?比如ElementUI、Ant Design等,为什么还要自己写呀?使用UI组件库确实是一种很好的选择,它提供了丰富的UI组件和工具,可以大大简化前端开发,然而,有时我们可能需要根据项目的具体需求进行一些自定义的组件封装,而不是仅仅局限于组件库提供的组件。

今天要写的是模态框组件。封装一个可复用的模态框组件,可以在不同的场景中使用,例如展示提示信息、确认操作等。
App.js文件:

import React, { useState } from "react";
import CommonModal from "./components/CommonModal";
//按需引入标签
import {Button} from 'antd';

/* 
 将父组件的状态传递给子组件,子组件检测数据变化进行状态更新,打开模态框,
 点击取消或确定按钮之后又触发openModal函数的调用,并传递参数false,使parentModal状态发生变化,又传递给子组件进行关闭模态框
*/

function App() {
    //定义变量进行传值
    const [parentModal,setParentModal] = new useState(false);

    const openModal = (data) => {
        setParentModal(data);
    }
    return(
        //点击按钮打开模态框
        <>
            <Button type="primary" onClick={openModal}>点我打卡</Button>
            <CommonModal  vis={parentModal} fn={openModal}></CommonModal>
        </>
    )
}

export default App;

CommonModal.jsx文件:

import { Modal } from 'antd';
import React,{useEffect, useState} from 'react'

function CommonModal(props) {
    const [visible,setVisible] = useState(false);
    //确认
    const traggerComfirm = () => {
        //调用父函数的方法
        props.fn(false);
    }
    //取消
    const traggerCancel = () => {
        props.fn(false);
    }

    //监听数据是否发生变化
    useEffect(() => {
        setVisible(props.vis)
    },[props.vis])
    return (
        <>
           <div>
                <Modal
                    open={visible}
                    onOk={traggerComfirm}
                    onCancel={traggerCancel}>
                        <p>1111111</p>
                        <p>1111111</p>
                        <p>1111111</p>
                        <p>1111111</p>
                        <p>1111111</p>
                        <p>1111111</p>
                </Modal>
           </div>
        </>
    )
}

export default CommonModal;

展示图:
在这里插入图片描述
但是它的逻辑有点繁琐,需要从父组件跳到子组件再跳到父组件…于是可以优化一下代码,这里用到了forwardRef和 useImperativeHandle。

React 使用 forwardRef 完成 ref 的转发。
useImperativeHandle可以让你在使用ref时自定义暴露给父组件的实例值

App.jsx文件:

import React, { useState ,useRef} from "react";
import CommonModal from "./components/CommonModal";
//按需引入标签
import {Button} from 'antd';

/* 
 将父组件的状态传递给子组件,子组件检测数据变化进行状态更新,打开模态框,
 点击取消或确定按钮之后又触发openModal函数的调用,并传递参数false,使parentModal状态发生变化,又传递给子组件进行关闭模态框
*/

function App() {
    const ModalRef = useRef(null);
    //定义变量进行传值
    const [parentModal,setParentModal] = new useState(false);

    const openModal = (data) => {
        // 获取具体DOM
        console.log(ModalRef.current);
        ModalRef.current.traggerOpen();
    }
    return(
        //点击按钮打开模态框
        <>
            <Button type="primary" onClick={openModal} >点我打卡</Button>
            <CommonModal ref={ModalRef}></CommonModal>
        </>
    )
}
export default App;

CommonModal.jsx文件:

import { Modal } from 'antd';
import React,{useEffect, useState, forwardRef, useImperativeHandle } from 'react'

function CommonModal(props,ref) {
    const [visible,setVisible] = useState(false);
    //确认
    const traggerComfirm = () => {
        //调用父函数的方法
        // props.fn(false);
        setVisible(false);

    }
    //取消
    const traggerCancel = () => {
        // props.fn(false);
        setVisible(false);

    }

    const traggerOpen = () => {
        setVisible(true);
    }

    useImperativeHandle(ref,() =>({
        traggerOpen,
        traggerComfirm,
        traggerCancel,

    }))

    //监听数据是否发生变化
    useEffect(() => {
        setVisible(props.vis)
    },[props.vis])
    
    return (
        <>
           <div>
                <Modal
                    open={props.visible}
                    onOk={traggerComfirm}
                    onCancel={traggerCancel}>
                        <p>1111111</p>
                        <p>1111111</p>
                        <p>1111111</p>
                        <p>1111111</p>
                        <p>1111111</p>
                        <p>1111111</p>
                </Modal>
           </div>
        </>
    )
}
export default forwardRef(CommonModal);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您分享一下如何封装React Modal组件。 首先,您需要安装React Modal组件库。可以通过以下命令进行安装: ``` npm install react-modal ``` 接下来,您可以创建一个Modal组件并在其中封装React Modal。在组件中,您需要定义一个状态来控制Modal的显示和隐藏。这个状态可以使用useState钩子来实现。 ``` import React, { useState } from "react"; import Modal from "react-modal"; function MyModal(props) { const [isOpen, setIsOpen] = useState(false); const handleOpenModal = () => { setIsOpen(true); }; const handleCloseModal = () => { setIsOpen(false); }; return ( <> <button onClick={handleOpenModal}>打开模态框</button> <Modal isOpen={isOpen} onRequestClose={handleCloseModal} contentLabel="Modal" > <h2>这是一个模态框</h2> <p>这里可以放置模态框的内容</p> <button onClick={handleCloseModal}>关闭模态框</button> </Modal> </> ); } export default MyModal; ``` 在上面的示例中,我们定义了一个MyModal组件,并在其中封装React Modal。我们使用useState钩子来定义了一个名为isOpen的状态,它用于控制Modal的显示和隐藏。handleOpenModal和handleCloseModal函数分别用于打开和关闭Modal。我们在Modal组件中传递了三个props:isOpen,onRequestClose和contentLabel。isOpen用于控制Modal的显示和隐藏,onRequestClose用于在用户点击Modal外部时关闭Modal,contentLabel用于给Modal添加一个描述。 最后,我们在组件的返回值中渲染了一个按钮和一个Modal。我们将handleOpenModal函数绑定到按钮的onClick事件上,以便在单击按钮时打开Modal。我们在Modal中渲染了一些内容,并将handleCloseModal函数绑定到关闭按钮的onClick事件上,以便在单击关闭按钮时关闭Modal。 这样,您就可以使用封装好的Modal组件在您的React应用程序中创建模态框了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值