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进去,实现弹出框形式的表单组件。