Hooks实现一个自定义的Modal组件

Posted 前端e站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hooks实现一个自定义的Modal组件相关的知识,希望对你有一定的参考价值。

Hooks实现一个自定义的Modal组件

不管你做什么样的前端项目,Modal组件肯定会使用到(没使用过的举手🙋‍♂️?)。


export const useModal = (initTitle: string, initContent: string | React.ReactElement) => 
    const [visible, setVisible] = useState(false);
    const [title, setTitle] = useState(initTitle);
    const [content, setContent] = useState(initContent);
    const CustomModal =  () => 
        return (
            <Modal
                visible=visible
                title=title
                closable=false
                footer=null
            >
                content
            </Modal>
        );
    
    const show = (content?: string | React.ReactElement) => 
        content && setContent(content);
        setVisible(true);
    ;
    const hide = (delay?: number) => 
        if (delay) 
            setTimeout(() => setVisible(false), delay);
         else 
            setVisible(false)
        
    ;
    return 
        show, hide, CustomModal, setTitle, setContent
    

// 使用
const hide, show, CustomModal = useModal('系统提示',  '正在初始化...');
 
render() 
    <div><CustomModal /></div>

在上面的代码中,首先我们使用了useState定义了3个state属性,这里示例中就3个,如果你需要更多的自定义内容,可以自己再扩展。useState方法给定一个初始化的属性值,返回一个属性变量和设置该属性的方法。
以visible为例,这个属性用来控制Modal的隐藏和显示。在使用useState方法返回的setVisible的时候,组件状态会自动更新,然后触发重新渲染,是不是跟React的Class组件的setState有点类似?

在自定义的Modal中,我们返回了show,hide方法,setTitle,setContent方法,以及一个CustomModal组件,这样外部在使用的时候就可以直接像上面的使用代码一样,放到render中即可。

在需要修改title或者修改内容的时候,调用setTitle和setContent修改modal中的内容,注意这里的setContent不止可以传入String,还可以传入一个ReactElement,所有里面的你可以传一个Form进去,实现弹出框形式的表单组件。

以上是关于Hooks实现一个自定义的Modal组件的主要内容,如果未能解决你的问题,请参考以下文章

Hooks实现一个自定义的Modal组件

P10:自定义Hooks函数获取窗口大小

自定义Hooks函数获取窗口大小

更改数组中的一个状态会导致在 React Hooks 中重新渲染整个循环生成的自定义组件

在Modal中使用了Formik,如何提交?

Taro自定义Modal对话框组件|taro仿微信android弹窗