怎么封装一个更易用的Dialog组件
创建调用组件的hook函数
在src目录下创建hooks目录,然后再hooks目录下创建useMyDialog.ts.
函数调用组件我们需要:
将组件转换成VNode
将VNode转换成DOM然后渲染到页面
import{createVNode,render,ComponentPublicInstance}from"vue";exportdefaultfunctionuseMyDialog(option?:any){constprops={...option,};constvm=createVNode(MyDialog,props);constcontainer=document.createElement("div");render(vm,container);document.querySelector("#app")?.appendChild(container.firstElementChild!);}
ps:
container.firstElementChild!中的!表示container.firstElementChild不为null或者undefined
接下来我们在App.vue中测试一下
importuseMyDialogfrom"./hooks/useMyDialog";functionshowDialog(){useMyDialog({message:"test1",onClose:()=>{console.log("self");},});}
Dialog的缓存、隐藏
隐藏
我们需要将close返回出去,这样我们就可以手动调用close函数关闭Dialog.
在useMyDialog.ts中添加
import{ComponentPublicInstance,VNode}from"vue";exportdefaultfunctionuseMyDialog(option?:any){constuserCloseFn=option?.onClose;props.onClose=()=>{close();userCloseFn??userCloseFn();};functionclose(vm:VNode){(vm.component!.proxyasComponentPublicInstance<{visible:boolean}>).visible=false;}return{close:close.bind(null,vm),}}
缓存
现在每次点击显示Dialog按钮时都会创建一个新的组件实例,这不是我们的预期,所以我们需要将组件进行缓存.
在useMyDialog.ts中添加
import{ComponentPublicInstance}from'vue'constinstances:any[]=[];exportdefaultfunctionuseMyDialog(option?:any){consttempVm:any=instances.find((item)=>`${item.vm.props?.message??""}`===`${(optionasany).message??""}`);if(tempVm){(tempVm.vm.component!.proxyasComponentPublicInstance<{visible:boolean;}>).visible=true;return{close:close.bind(null,tempVm.vm),};}}
完整代码
src/hooks/useMyDialog.ts
import{createVNode,render,ComponentPublicInstance,VNode}from"vue";importMyDialogfrom"../components/MyDialog.vue";constinstances:any[]=[];exportdefaultfunctionuseMyDialog(option?:any){constprops={...option,};constuserCloseFn=option?.onClose;props.onClose=()=>{close(vm);userCloseFn??userCloseFn();};functionclose(vm:VNode){(vm.component!.proxyasComponentPublicInstance<{visible:boolean}>).visible=false;}consttempVm:any=instances.find((item)=>`${item.vm.props?.message??""}`===`${(optionasany).message??""}`);if(tempVm){(tempVm.vm.component!.proxyasComponentPublicInstance<{visible:boolean;}>).visible=true;return{close:close.bind(null,tempVm.vm),};}constvm=createVNode(MyDialog,props);constcontainer=document.createElement("div");render(vm,container);document.querySelector("#app")?.appendChild(container.firstElementChild!);instances.push({vm});return{close:close.bind(null,vm),};}
以上就是关于“怎么封装一个更易用的Dialog组件”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注恰卡编程网行业资讯频道。