vue3结合hooks开发可以注册的二次确认弹框

 更新时间:2022年12月01日 08:57:01   作者:前端那些年  
这篇文章主要为大家介绍了vue3结合hooks开发可以注册的二次确认弹框,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

背景

上次开发了一个类似popConfirm的二次确认弹框,如下面两个图:

  • 图一

  • 图二

完成开发后,准备集成到项目中时忽然发现无法集成到公司内部的组件库中,因为公司的组件库表格的操作项按钮是通过传参的方式进行配置,无法直接使用popConfirm包裹操作按钮的方式进行Dom的书写。

所以又对二次弹框进行了一次简单的开发,采用modal的方式进行开发。好处是除了可以以之前的方式,直接在组件上传入props使用,如:

 <HConfirmModal  
     title="测试标题" 
     modalType="TextConfirm" 
     paperWork="hello-word" 
     :width="300" 
     v-model:visible="visible">
 </HConfirmModal>

也可以采用注册的方式,注册组件后,调用组件的api进行使用,如:

 <HConfirmModal  @register="register" @ok="testOK" ></HConfirmModal>
 const [register, { openConfirmModal: openModifyModal,setConfirmModalProps}] = useConfirmModal()
  function handleShow() {
    setConfirmModalProps({
      title:'测试标题',
      modalType:'TimeConfirm',
      desc:'注意危险'
    })
    openModifyModal(true)
  }

这样就可以比较方便的集成到现有的组件库中,也不需要改动现有组件库中的table相关的代码,相对来说效果也稍微好一些。

开发前想法

最早的实操方案打算借助于antd中的modal组件,对modal组件重新进行封装,但是发现:当我在modal组件中写入相应的dom结构后,如图:

  • 图一

  • 图二

modal组件中写入表单相关的dom后,需要我点击确认按钮时,对表单进行校验,这时候就需要能够直接获取Modal组件中的click事件。

那么,如何获取这个事件呢?

最开始的时候,也没想到很好的方法,后来想是否可以用ref来获取Modal的实例,然后调用这个实例上注册的事件呢?

也许可以,但是这样操作起来似乎有点舍近求远,毕竟除了表单校验的逻辑还有一个倒计时的罗需要进行判断,写起来似乎有些麻烦。

所以最终还是觉得借鉴Modal的样式,重新开发一个比较好,写起来比较舒服,效率也会高一点。

两种调用方式的实现思路

第一,使用props进行控制。这种组件实现起来比较简单,定义好组件需要的属性作为props,传递给组件,组件按照不同的属性进行渲染,点击时触发不同的emit事件即可。

其流程为:props和emit事件 ---> 渲染组件 ---> 触发emit事件

这种方式实现起来比较简单,但是场景稍微有些局限,如:组件的行为,如显示、隐藏必须在外部定义,需要外部书写相应的函数进行控制。

第二种方式,定义组件内部的方法,组件的行为通过组件本身的方法进行控制,同时将组件自身的方式通过hooks的方式暴露给外部。

其流程为:props和emit事件 ---> 组件定义自身需要的函数,同时将传入的props属性转化为内部属性---> 组件的行为根据自身的属性和方法进行控制---> 将组件本身的方法以hooks的形式暴露出来

这样一来,组件即可以以传统props的方式使用,也可以通过hooks的注册方法及组件本身的其他方法进行控制,使用的场景相对来说更广泛一些。

核心方法

传统的组件开发方式这里就不做过多的解释了,主要讲一下第二种方式的实现方式。

使用第二种方式开发组件的关键点有两处:

第一, 如何将外部传入的props转化为组件内部的属性 ?

第二,如何才能够获取到组件自身所定义的方法 ?

将外部传入的props转为组件内部属性其实很简单,我们只需要使用computed方式将转化一下即可,如:

  const getMergeProps = computed((): Recordable => {
      return {
        ...props,
        ...(unref(propsRef) as any)
      }
    })

这样我们就可以使用组件内部的属性getMergeProps对组件的dom进行渲染,实现不同的属性展示不同的内容。

那么,如何才能获取组件内部的方法呢?其实也很简单,这里需要用到一个vue提供的一个方法:getCurrentInstance

getCurrentInstance可以获取到当前组件的实例,既然可以获取到当前的实例,那么比必然可以操作实例上的方法。

然后,我们在组件实例化的时候触发一个注册函数register,将组件内部需要对外暴露的方法传给register方法,然后在对应的hooks中可以扩展实例的方法,这样我们就可以实现使用hooks的方式,注册、然后控制组件的各种行为。

这个触发的代码也很简单:

 const instance = getCurrentInstance()
    if (instance) {
      emit('register', modalMethods, instance.uid)
    }

最后,我们在hooks函数中可以获取组件的实例,拿到组件实例对象后,我们就可以为所欲为了。

最后

文章贴的代码较少,主要是觉得技术上还是需要以理解实现思路为主,有了思路我们就可以写各式各样的代码去实现功能,单纯的贴代码似乎没什么太大的意义。

以上就是vue3结合hooks开发可以注册的二次确认弹框的详细内容,更多关于vue3 hooks注册确认弹框的资料请关注脚本之家其它相关文章!

相关文章

  • vue 解决数组赋值无法渲染在页面的问题

    vue 解决数组赋值无法渲染在页面的问题

    今天小编就为大家分享一篇vue 解决数组赋值无法渲染在页面的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • elementUI动态嵌套el-form表单校验举例详解

    elementUI动态嵌套el-form表单校验举例详解

    最近工作遇到个需求,表单可以进行增加删除操作,需要进行表单校验,这篇文章主要给大家介绍了关于elementUI动态嵌套el-form表单校验的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • 使用iView Upload 组件实现手动上传图片的示例代码

    使用iView Upload 组件实现手动上传图片的示例代码

    这篇文章主要介绍了使用iView Upload 组件实现手动上传图片的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • vue子组件获取到它父组件数据的4种方法

    vue子组件获取到它父组件数据的4种方法

    这篇文章主要给大家介绍了关于vue子组件获取到它父组件数据的4种方法,对于vue来说组件之间的消息传递是非常重要的,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • vue3前端实现全屏显示及元素垂直填满页面效果

    vue3前端实现全屏显示及元素垂直填满页面效果

    这篇文章主要给大家介绍了关于vue3前端实现全屏显示及元素垂直填满页面效果的相关资料,文中还给大家介绍了vue3实现某一个元素全屏之后就黑屏了的解决办法,需要的朋友可以参考下
    2024-02-02
  • vue如何使用process.env搭建自定义运行环境

    vue如何使用process.env搭建自定义运行环境

    这篇文章主要介绍了vue如何使用process.env搭建自定义运行环境,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Vue修改mint-ui默认样式的方法

    Vue修改mint-ui默认样式的方法

    下面小编就为大家分享一篇Vue修改mint-ui默认样式的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • 详解Vue组件如何正确引用和使用外部方法

    详解Vue组件如何正确引用和使用外部方法

    在开发Vue应用时,我们经常需要在多个组件中复用一些通用的函数或方法,这些函数可能是我们自己编写的工具函数,也可能是从第三方库中导入的,下面我们就来看看如何正确引用和使用外部方法吧
    2024-01-01
  • Vue3 中 watch 与 watchEffect 区别及用法小结

    Vue3 中 watch 与 watchEffect 区别及用法小结

    这篇文章主要介绍了Vue3 中 watch 与 watchEffect 有什么区别?watch中需要指明监视的属性,也需要指明监视的回调,而watchEffect中不需要指明监视的属性,只需要指明监视的回调,回调函数中用到哪个属性,就监视哪个属性,本文给大家详细介绍,需要的朋友参考下
    2022-06-06
  • webstorm和.vue中es6语法报错的解决方法

    webstorm和.vue中es6语法报错的解决方法

    本篇文章主要介绍了webstorm和.vue中es6语法报错的解决方法,小编总结了webstorm和.vue中出现的es6语法报错,避免大家采坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05

最新评论