【小程序开发】—— 封装自定义弹窗组件

简介: 【小程序开发】—— 封装自定义弹窗组件

前言:

大家好我是不苒,本人男,头像是女朋友照片,很多大佬都以为我是女的,浅浅的解释一下哈哈。很高兴书写博客与大家分享知识。

本片文章主要讲的是,使用uniapp开发背景下,使用Vue的具名插槽封装一个自定义的弹窗组件popup,感兴趣的小伙伴可以学习一下,如果发现本人编写有问题的话,欢迎大家随时来评论区探讨支出问题,我也会及时更正的。


话不多说直接上正文一起来学习一下封装自定义弹窗组件吧!


正文

1、探讨需求封装popup自定义弹窗组件

首先我们需要探讨一下,封装自定义的组件都需要什么功能


需要一个半透明灰色的背景,用于区分与非弹窗内容,点击灰色区域也可以关闭弹窗。

需要一个关闭按钮和两个操作按钮,一个确定,一个取消。

弹窗内容:标题,内容区域,因为是自定义所以都使用了具名插槽,也可以设置默认的显示内容。

弹窗的显示位置,本次封装只考虑了居中与页面底部两个常用显示位置。

2、实战开发弹窗组件

2.1 子组件内容 popup.vue文件

<template>
  <view class="mark" v-if="isShow" @click="close">
    <view :class="bottom?'bottom':'center'" class="content" >
      <view @click="close">
        <image class="close" src="../static/close.png" ></image>
      </view>
      <slot name="title">
        <view class="title">子组件默认标题</view>
      </slot>
      <slot name="body">
        <text style="font-size: 14px;">确定要取消订单吗?取消之后购物车也将清空。</text>
      </slot>
      <slot name="bottom">
        <view class="btns">
          <view class="confirm btn" @click="confirm">确定</view>
          <view class="cancel btn" @click="cancel">取消</view>
        </view>
      </slot>
    </view>
  </view>
</template>
<script>
  export default {
    props: {
      isShow: {
        type: Boolean,
        default: false
      },
      // 子组件接收一个布尔类型的bottom,如果为true则弹窗则在页面的底部,false为默认居中显示
      bottom: {
        type: Boolean,
        default: false
      }
    },
    data() {
      return{
      }
    },
    methods: {
      close(){
        this.$emit('close')
      },
      cancel(){
        this.$emit('cancel')
      },
      confirm(){
        this.$emit('confirm')
      },
    }
  }
</script>
<style lang="scss">
  .mark {
    position: fixed;
    width: 100vw;
    height: 100vh;
    background-color: rgba(0, 0, 0, 0.3);
    left: 0;
    bottom: 0;
    top: 0;
    right: 0;
    display: flex;
    justify-content: center;
    align-items: center;
  }
  .bottom{
    position: absolute;
    bottom: 0 ;
    width: 100vw;
  }
  .center{
    width: 80vw;
    position: relative;
  }
  .content{
    background-color: #fff;
    border-radius: 20rpx;
    height: 400rpx;
    padding: 40rpx;
    box-sizing: border-box;
    .close{
      position:absolute;
      right:30rpx;
      top: 20rpx;
      width: 40rpx;
      height: 40rpx;
    }
    .title{
      text-align: center;
      font-weight: 600;
      height: 50rpx;
      line-height: 50rpx;
      margin-bottom: 20rpx;
    }
    .btns{
      bottom: 20px;
      position: absolute;
      display: flex;
      justify-content: space-between;
      width: 88%;
      .btn{
        width: 160rpx;
        height: 80rpx;
        text-align: center;
        line-height: 80rpx;
        border-radius: 20rpx;
      }
      .confirm{
        background: bisque;
      }
      .cancel{
        background: #ccc;
      }
    }
  }
</style>

注意:


本文CSS内容使用了scss语法,不使用的话可以将嵌套的样式拿出即可。

解释说明:


isShow 用于控制弹出层的显示与隐藏,在点击灰色空白区域和右上角关闭按钮,还有确定按钮与取消按钮之后都会关闭弹出层。

bottom 用于控制弹出层的显示位置,默认为居中显示

methods中向父组件传递了三个方法,分别是关闭弹窗,点击确定按钮,点击取消按钮

使用具名插槽,在父组件中可以自定义插槽中的内容,方便不同位置的弹窗显示样式

2.2 父组件引用子组件

<template>
  <view class="container">
    <view class="btn" @click="open">
      显示弹出层
    </view> 
    <popup :isShow='visible' :bottom='true'  @close="closeMadle" @cancel="cancel" @confirm="confirm">
      <template v-slot:title>
        <view class="title">
          父组件自定义标题
        </view>
      </template>
      <template v-slot:body>
        <view class="body" >
          这里是父组件引用子组件,使用具名插槽编写的自定义内容和样式。
        </view>
      </template>
    </popup>
  </view>
</template>
<script>
  import popup from '../../components/popup.vue'
  export default {
    components: {
      popup
    },
    data() {
      return {
        visible:false,
      }
    },
    methods: {
      open(){
        this.visible = true
        uni.hideTabBar()
      },
      closeMadle(){
        this.visible = false
        uni.showTabBar()
      },
      confirm(){
        // 这里调用接口执行点击确定后的操作并关闭弹窗
        console.log('点击了确认按钮')
        this.visible = false
      },
      cancel(){
        // 点击了取消按钮直接关闭弹窗
        console.log('点击了取消按钮')
        this.visible = false
      },
    }
  }
</script>
<style lang="scss>
  .title{
    text-align: center;
    font-weight: 600;
    height: 50rpx;
    line-height: 50rpx;
    margin-bottom: 20rpx;
  }
  .body{
    font-size: 14px;
    font-weight: 600;
    color: darkorchid;
  }
</style>

注意:


本文CSS内容使用了scss语法,不使用的话可以将嵌套的样式拿出即可。

解释说明:


引用子组件,并在conponents中注册。

bottom 为true用于控制弹出层的弹窗在底部显示,不传默认为居中显示。

@语法接收子组件中向父组件传递的三个方法,在父组件methods中定义三个方法做相应的操作。

使用具名插槽,自定义插槽中的内容。

uni.showTabBar() 和 uni.hideTabBar()两个方法用于控制原生tabbar的显示与隐藏。

3、效果图预览

3.1 不使用具名插槽的原有样式效果

3.2 使用具名插槽之后样式效果

这里是演示的那个显示在页面底部的弹窗,如果不需要直接将代码片段里的:bottom="true"删掉即可


专栏分享:

小程序项目实战专栏:《uniapp小程序开发》

前端面试专栏地址:《面试必看》


⏳ 名言警句:说能做的,做说过的 \textcolor{red} {名言警句:说能做的,做说过的} 名言警句:说能做的,做说过的


✨ 原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下


👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!


⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!


✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!  


目录
相关文章
|
13天前
|
人工智能 小程序
【一步步开发AI运动小程序】十五、AI运动识别中,如何判断人体站位的远近?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,无需后台支持,具有快速、体验好、易集成等特点。本文介绍如何利用插件判断人体与摄像头的远近,确保人体图像在帧内的比例适中,以优化识别效果。通过`whole`检测规则,分别实现人体过近和过远的判断,并给出相应示例代码。
|
6天前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十七、如何识别用户上传视频中的人体、运动、动作、姿态?
【云智AI运动识别小程序插件】提供人体、运动、姿态检测的AI能力,支持本地原生识别,无需后台服务,具有速度快、体验好、易集成等优点。本文介绍如何使用该插件实现用户上传视频的运动识别,包括视频解码抽帧和人体识别的实现方法。
|
11天前
|
人工智能 小程序 UED
【一步步开发AI运动小程序】十六、AI运动识别中,如何判断人体站位?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,本地引擎无需后台支持,具备快速、体验好、易集成等优势。本文介绍如何利用插件的`camera-view`功能,通过检测人体站位视角(前、后、左、右),确保运动时的最佳识别率和用户体验。代码示例展示了如何实现视角检查,确保用户正或背对摄像头,为后续运动检测打下基础。
|
17天前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十三、自定义一个运动分析器,实现计时计数02
本文介绍如何利用“云智AI运动识别小程序插件”开发AI运动小程序,详细解析了俯卧撑动作的检测规则构建与执行流程,涵盖卧撑和撑卧两个姿态的识别规则,以及如何通过继承`sports.SportBase`类实现运动分析器,适用于小程序开发者。
|
11天前
|
移动开发 小程序 PHP
校园圈子论坛系统采取的PHP语音和uni账号开发的小程序APP公众号H5是否只需要4800元?是的,就是只需要4800元
关于校园圈子论坛系统采用PHP语言和uni-app开发的小程序、APP、公众号和H5是否仅需4800元这个问题,实际上很难给出一个确定的答案。这个价格可能受到多种因素的影响
47 8
|
7天前
|
人工智能 小程序 数据处理
uni-app开发AI康复锻炼小程序,帮助肢体受伤患者康复!
近期,多家康复机构咨询AI运动识别插件是否适用于肢力运动受限患者的康复锻炼。本文介绍该插件在康复锻炼中的应用场景,包括康复运动指导、运动记录、恢复程度记录及过程监测。插件集成了人体检测、姿态识别等功能,支持微信小程序平台,使用便捷,安全可靠,帮助康复治疗更加高效精准。
|
13天前
|
人工智能 小程序 JavaScript
【一步步开发AI运动小程序】十四、主包超出2M大小限制,如何将插件分包发布?
本文介绍了如何从零开始开发一个AI运动小程序,重点讲解了通过分包技术解决程序包超过2M限制的问题。详细步骤包括在uni-app中创建分包、配置`manifest.json`和`pages.json`文件,并提供了分包前后代码大小对比,帮助开发者高效实现AI运动功能。
|
1月前
|
小程序 前端开发 JavaScript
在线课堂+工具组件小程序uniapp移动端源码
在线课堂+工具组件小程序uniapp移动端源码
35 0
在线课堂+工具组件小程序uniapp移动端源码
|
2月前
|
移动开发 小程序 数据可视化
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
349 3
|
2月前
|
小程序 API
微信小程序更新提醒uniapp
在小程序开发中,版本更新至关重要。本方案利用 `uni-app` 的 `uni.getUpdateManager()` API 在启动时检测版本更新,提示用户并提供立即更新选项,自动下载更新内容,并在更新完成后重启小程序以应用新版本。适用于微信小程序,确保用户始终使用最新版本。以下是实现步骤: ### 实现步骤 1. **创建更新方法**:在 `App.vue` 中创建 `updateApp` 方法用于检查小程序是否有新版本。 2. **测试**:添加编译模式并选择成功状态进行模拟测试。
57 0
微信小程序更新提醒uniapp