怎么封装一个vue中也可使用的uniapp全局弹窗组件

其他教程   发布日期:2023年07月01日   浏览次数:777

这篇文章主要介绍了怎么封装一个vue中也可使用的uniapp全局弹窗组件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么封装一个vue中也可使用的uniapp全局弹窗组件文章都会有所收获,下面我们一起来看看吧。

场景:

当你对接websocket时,或者轮询也好,你需要获取到最新的信息,并且在任何页面弹出一个组件进行后续操作

思路:

1、先封装好要弹出的公共组件

2、向vue原型上挂载全局方法,拿到组件真实dom,从而对组件进行显隐操作

第一步:

创建一个公共组件,以下是组件全部的结构及样式,你需要把html中的两个image标签的路径换掉或者直接注释掉也行,html 和 css就不做解释了

invite.vue

  1. <template>
  2. <div class="invite-box">
  3. <view class="center-box">
  4. <image class="logo" src="/static/invite-logo.png"></image>
  5. <image class="close" src="/static/close.png" v-on:click="$closeInvite"></image>
  6. <view class="title">邀请函</view>
  7. <view class="content">您好!您的朋友xxx邀请您对<text>“为什么小朋友到了一定年龄需要打疫苗?”</text>进行专家答疑,您是否接受?</view>
  8. <view class="btn-group">
  9. <view class="invite-specia">邀请专家</view>
  10. </view>
  11. </view>
  12. </div>
  13. </template>
  14. <script>
  15. export default {
  16. name: 'invite',
  17. props: {
  18. _specia: String
  19. },
  20. data() {
  21. return {}
  22. },
  23. mounted() {
  24. console.log('this.specia', this._specia);
  25. }
  26. }
  27. </script>
  28. <style scoped lang='scss'>
  29. .invite-box {
  30. position: fixed;
  31. top: 0;
  32. left: 0;
  33. width: 100vw;
  34. height: 100vh;
  35. background: rgba(0,0,0,0.5);
  36. z-index: 9999;
  37. .center-box {
  38. position: absolute;
  39. top: 50%;
  40. left: 50%;
  41. transform: translate(-50%, -50%);
  42. width: 622rpx;
  43. padding: 32rpx;
  44. border-radius: 16rpx;
  45. opacity: 1;
  46. background: rgba(255,255,255,1);
  47. .logo {
  48. position: absolute;
  49. top: -48rpx;
  50. left: 50%;
  51. transform: translateX(-50%);
  52. width: 136rpx;
  53. height: 144rpx;
  54. }
  55. .close {
  56. position: absolute;
  57. top: 24rpx;
  58. right: 24rpx;
  59. width: 48rpx;
  60. height: 48rpx;
  61. }
  62. .title {
  63. margin-top: 66rpx;
  64. text-align: center;
  65. color: rgba(0,0,0,1);
  66. font-size: 36rpx;
  67. font-weight: 500;
  68. font-family: "PingFang SC";
  69. letter-spacing: 0.6rpx;
  70. }
  71. .content {
  72. margin: 40rpx 0;
  73. font-size: 26rpx;
  74. font-family: "PingFang SC";
  75. letter-spacing: 0.6rpx;
  76. color: #343434;
  77. text {
  78. font-size: 32rpx;
  79. letter-spacing: 0.6rpx;
  80. color: rgba(69,108,255,1);
  81. }
  82. }
  83. .btn-group {
  84. display: flex;
  85. justify-content: center;
  86. padding: 0 16rpx;
  87. .invite-specia {
  88. width: 526rpx;
  89. height: 88rpx;
  90. line-height: 88rpx;
  91. border-radius: 16rpx;
  92. text-align: center;
  93. background: linear-gradient(-46.8deg, rgba(63,101,255,1) 0%, rgba(97,141,255,1) 100%);
  94. color: #fff;
  95. }
  96. }
  97. }
  98. }
  99. </style>

第二步:

注册一个全局函数,使用 Vue.prototype,首先创建一个js文件来存放你的全局方法,之后在main.js中引入挂载

以下代码中几个关键点:

1、install,参数可以拿到Vue函数,等价于 main.js 中 import 进来的 Vue

2、Vue.extend(Invite),这里可以看到 Invite 是我导入的组件实例对象,该方法传入组件实例对象可以返回给你该组件的实例构造器,方便我们后续多次构建并操作该组件

3、instance._props._specia = params,这里只是向新构建的组件内传递一个props参数

4、instance.vm = instance.$mount(),挂载模板,生成真实dom,作用和$el一致

5、invite-box是组件最外层盒子的类名

6、setTimeout,因为要添加到最后,需要异步添加

invite.js

  1. import Invite from '../components/invite.vue'
  2. export default {
  3. install(Vue) {
  4. const Profile = Vue.extend(Invite)
  5. // 弹出邀请
  6. Vue.prototype.$openInvite = function(params) {
  7. const instance = new Profile()
  8. instance._props._specia = params
  9. instance.vm = instance.$mount()
  10. const InviteEle = document.body.lastElementChild
  11. if(InviteEle.className === 'invite-box') return
  12. setTimeout(() => document.body.appendChild(instance.vm.$el))
  13. return instance
  14. }
  15. // 关闭邀请
  16. Vue.prototype.$closeInvite = function() {
  17. const instance = new Profile()
  18. instance.vm = instance.$mount()
  19. const InviteEle = document.body.lastElementChild
  20. if(InviteEle.className !== 'invite-box') return
  21. document.body.removeChild(InviteEle)
  22. return instance
  23. }
  24. }
  25. }

main.js

  1. // 导入invite.js
  2. import invite from './utils/invite'
  3. // 安装插件
  4. Vue.use(invite)

第三部:使用

在你任何组件内调用 this.$openInvite() 即可弹出组件,调用 this.$closeInvite()即可关闭组件

以上就是怎么封装一个vue中也可使用的uniapp全局弹窗组件的详细内容,更多关于怎么封装一个vue中也可使用的uniapp全局弹窗组件的资料请关注九品源码其它相关文章!