先介绍三种常用的用法,
const Demo: React.FC = () => { const [visible, setVisible] = React.useState<boolean>(false); return ( <Modal visible={visible} close={() => setVisible(false)}> <div>I am dialog body</div> </Modal> ); };
const Demo:React.FC=()=>{ const [fns,elements]=Modal.useModal(); const openDialog=()=>{ const {update,destory}=fns.info({ content:<div>I am dialog body</div> }) } return ( <Button onClick={()=>openDialog()}>Open Dialog</Button> {elements} ) }
function openDialog() { const { update, destory } = Modal.info({ content: <div>I am dialog body</div>, }); }
这些个组件总是很复杂,让人看的云里雾里,很多的辅助功能将原本的功能给掩盖了,让初学者看得很累。
关闭的过程逻辑如下: onClose -> 外部组件调用 setVisible(false), Dialog 然后发现 visible=false, -> CSSMotion 开始走 leave 动画,动画结束后发出 afterClose 事件,然后在 DialogWrapper 里面会 返回 null,
这样整个 Dialog 就返回 null.
它的功能就是返回一个 ReactElement(用作容器),以及往这个 ReactElement 里面添加(删除)一个元素的方法。它主要使用了usePatchElement()这个 hook 函数,这个函数很简单,很有用。它就是返回一个容器,以及往容器中添加元素的方法,调用这个方法会返回删除这个元素的方法。我们只要将这个容器放到我们调用的 VD 上就行了,同时,我们可以通过 memo,让这个容器里的东西不参与当前 VD 的刷新,来提高性能。
export default function usePatchElement(): [ React.ReactElement[], (element: React.ReactElement) => Function ] { const [elements, setElements] = React.useState<React.ReactElement[]>([]); const patchElement = React.useCallback((element: React.ReactElement) => { // append a new element to elements (and create a new ref) setElements((originElements) => [...originElements, element]); // return a function that removes the new element out of elements (and create a new ref) // it works a little like useEffect return () => { setElements((originElements) => originElements.filter((ele) => ele !== element) ); }; }, []); return [elements, patchElement]; }