首页 > 编程语言 >微信小程序自定义封装组件-showModal

微信小程序自定义封装组件-showModal

时间:2023-04-02 22:46:16浏览次数:59  
标签:index 封装 自定义 title 微信 modal showModal 组件

封装一个组件

这里由于最近使用微信小程序居多,所以着重写的是小程序的,但是万变不离其宗,组件实现思路其实都差不多的

微信小程序开发中官方自带的wx.showModal,这个弹窗
API有时候并不能满足我们的弹窗效果,所以往往需要自定义modal组件。下面我们进行一个自定义modal弹窗组件的开发,并进行组件的引用。

 wx.showModal({
    cancelColor: 'cancelColor',
    title: '提示',
    content: '这是一个模态弹窗',
})

效果如下:

屏幕截图 2021-08-05 113514.png

使用微信自定义modal,功能单一,样式也不能满足ui需求,这里自定义一个modal

我们新建在components里新建一个modal文件来封装我们自己的自定义弹框:

index.wxml页面

<view wx:if="{{_show}}" class='popV' catchtouchmove="move">
    <view class='popV-mask' bindtap="selectMask" animation='{{maskAnimate}}'></view>
    <!-- 动态修改top -->
    <view class='popV-content' animation='{{frameAnimate}}'>
        <view class="tap_title" wx:if="{{tabTitleShow}}">{{tapTitle}}</view>
        <view class="popV-title" wx:if="{{title}}">{{title}}</view>
        <slot wx:if="{{custom}}"></slot>
        <view class='popV-content-btm'>
            <button wx:for="{{btns}}" wx:key="index" data-index="{{index}}" class='popV-item' style="color:{{btnTextColor[index]?btnTextColor[index]:''}};" hover-class='popV-hover' bindtap='selectBtn'>
                {{item}}
            </button>
        </view>
    </view>
</view>

这里由于动效展示,使用了animation动画,大家也可以用这个api来实现想要的效果,如果想要更好的效果其实也可以通过设置参数来实现更好的弹框效果展示,这里不做更多的展示,喜欢的可以自己优化

组件相关参数

参数名含义
_show 弹框是否展示(Boolean类型)
tapTitle 顶部提示标题(string)
tabTitleShow 顶部提示标题 是否展示(Boolean类型)
title 提示文字(string)
btns 底部按钮(array)
btnTextColor 底部文字颜色(array)
custom 是否自定义插糟(Boolean类型)

然后,我们在需要的地方,index.json中引入组件

 "usingComponents": {
    "modal":"./common/index"
  }

1.简单封装组件

在自己要使用的组件使用:

<modal show="true" title="这是一个弹框" btns="{{['取消','确定']}}" binddidClickBtn="onClickModalBtn"></modal>

如下图就实现了弹框展示效果:

屏幕截图 2021-08-05 182459.png

这里我们直接把组件的props show写死了,所以直接展示,我们可以通过动态数组来实现展示隐藏,

我们看看效果:

gue25-hdt00.gif

这里可以看到大部分效果已经实现,这里我们对最外层的view做了一个catchtouchmove方法,用来组织冒泡

接下来就是对底部按钮的处理:

 // 选中底部的按钮
selectBtn: function (e) {
    let index = e.currentTarget.dataset.index;
    this.triggerEvent('didClickBtn', index); // 外面通过e.detail获取index的值
},

我们让组件设置一个triggerEvent事件,让父组件接受这个事件,使得调用该组件的组件能够处理底部按钮点击对应的事件

// wxml
<modal show="{{modalShow}}" title="这是一个弹框" btns="{{['取消','确定']}}" binddidClickBtn="onClickModalBtn"></modal>
// js
  //底部按钮点击
onClickModalBtn(e){
    console.log(e);
    if(e.detail == 0){
        console.log('关闭事件');
    }else{
        console.log('确定事件');
    }
}

这里我们只对两个按钮的做处理,如果对应的多个组件可以自定义封装,由于没有做到多个按钮的需求,底部按钮只做两个:

我们看看效果:

wocya-0v9z7.gif

这样我们就实现了对Modal的简单封装,你想要在那个文件使用,在json引入就可以。

2.优化封装

但是有一个问题就是,每次想要弹窗都需要创建一个modal,然后在里面写入相关的参数,也是有点小麻烦的。

我们可以把参数抽出来,写在函数里面,实现像微信小程序一样的写法,具体可以 参考 wx.showModal(Object object)

wx.showModal({
  title: '提示',
  content: '这是一个模态弹窗',
  success (res) {
    if (res.confirm) {
      console.log('用户点击确定')
    } else if (res.cancel) {
      console.log('用户点击取消')
    }
  }
})

这样子写起来着实方便,快捷,易懂,我们对现有代码进行封装,把相关参数抽离到一个函数中:

 showModal: function (params) {
    let {cuccess,error} = this
    this.setData({
    show: !this.data.show,
    title: params.title,
    tabTitleShow:params.tabTitleShow,
    success: params.success || function () { },
    error: params.error || function () { },
    })
},
// 选中底部的按钮
selectBtn: function (e) {
    let index = e.currentTarget.dataset.index;
    this.triggerEvent('didClickBtn', index); // 外面通过e.detail获取index的值
    if (index == 0) {
    this.setData({
        show: false
    }, () => {
        this.data.error()
    })
    } else {
    this.setData({
        show: false
    }, () => {
        this.data.success()
    })
    }
},

这里把所有参数放到了showModal方法里,然后点击取消确定时关闭弹框并且触发成功失败方法,在调用组件时可以在success、error回调中做相应的方法

我们在调用组件的位置调用showModal:
由于是获取组件里的方法,所以我们需要先获取组件

// show  调用
this.modal = this.selectComponent("#modal")
onClick4() {
    this.modal.showModal({
      show: true,
      title: '函数调用',
      tabTitleShow: false,
      success :(res) => {
        wx.showToast({
          icon:"success",
          title: '确定按钮点击',
        })
      },
      error: () => {
        wx.showToast({
          icon:'error',
          title: '取消按钮点击',
        })
      },
    }) 
  },

我们看看效果:

shtow-2fhdu.gif

这里已经实现了函数调用组件

3.将组件全局化

但是每个组件都得重新获取组件,然后才能调用方法,这个也很麻烦,我们可以全局实例化这个方法,在app.js把这个方法挂载:

//app.js

showModal(that,options){
    that.selectComponent('#modal').showModal(options);
  }
// 组件调用
const app = getApp()
app.showModal(this,{
    show: true,
    title: '函数调用',
    tabTitleShow: false,
    success :(res) => {
    wx.showToast({
        icon:"success",
        title: '确定按钮点击',
    })
    },
    error: () => {
    wx.showToast({
        icon:'error',
        title: '取消按钮点击',
    })
  },
}) 

这样子,全局组件就封装好了,调用效果和上面函数调用效果一样,这里我只把我常用的参数和方法进行了封装,大家也可以根据自己产品对封装组件进行很多函数。参数的封装。

微信小程序的弹框已经大概实现,其实vue、react也大致相同。可以参考封装一个,这里不做解释.

这里附上相关代码,希望能帮助大家:

微信小程序自定义modal 代码 》》》 自定义modal

其他作品也希望大佬多多指点

码字不易,希望大佬多多指点!

标签:index,封装,自定义,title,微信,modal,showModal,组件
From: https://www.cnblogs.com/Alex80/p/17281625.html

相关文章

  • 智慧停车场微信小程序源码/全开源智能停车系统源码
    ☑️品牌:小程序☑️语言:小程序☑️类型:智慧停车场系统☑️支持:小程序......
  • vue3 directive自定义指令
    importstorefrom'../store'//新建jsexportdefault{install(app){//权限控制,没有相关的权限,则删除模块app.directive('permission',{mounted(el,val){if(el&&!store.state.rule.includes(val.valu......
  • 微信小程序slider抖动
    问题描述:做一个音乐播放器的UI,想要使用slider做歌曲进度条,能拖动那种。为了使进度条自动向前,设置了一个interval,每500ms更新一次,用audioctx.currentTime更新,有拖动的时候用拖动值更新。拖动进度条的时候发现:从B点拖到A点,小圆圈回先退回B点,然后弹回A点。声音播放没有回退现象,就是进......
  • Qt学习笔记9——P30-33. 自定义控件封装,鼠标事件,定时器
    P30.自定义控件封装P31.Qt中的鼠标事件P32.定时器1P33.定时器2P30.自定义控件封装(创建了新项目) 添加新的界面和类:右键项目的文件夹(顶层的文件)->Qt——Qt设计师界面类->“选择界面模板”选"Widget"->在"Classname"中取个类名(此案例中改成了SmallWidget)->别的没......
  • 微信小程序登录、获取用户信息的流程及实现
    微信小程序登录、获取用户信息的流程及实现本篇文章将通过以下三步,让你了解到小程序登录、和用户信息获取的微信生态变迁,和流程上前后端技术实现。小程序登录流程小程序获取手机号小程序获取头像昵称小程序登录小程序登录是通过微信官方提供的登录能力,获取微信提供的用......
  • 暂停在博客园发布文章,请亲爱的读者们移步同名微信公众号
     各位亲爱的读者们,从2023年3月起,本人将暂停在博客园发布新文章,请移步本人的微信公众号“世民谈云计算”。公众号文章将同步至知乎同名号和头条同名号。感谢您一直以来的关注! 扫码关注本人的微信公众号: 知乎创作中心:https://www.zhihu.com/people/sammy-1-91/posts ......
  • 添加自定义监控第2篇--------------------------------------------------
      netstat-antp|grep':80'|grep-c'ESTABLISHED'换一个测试项:netstat-antp|grep":22"|grep-c"ESTABLISHED"    出现了不是正整数的情况,怎么消掉前面的错误提示??        chmod +s/bin/netstat    或者  chmodu+s /......
  • 使用 wine 安装微信遇到的问题解决方法
    1.中文显示成方块添加启动环境变量:LANG=zh_CN.UTF-82.输入框不显示文字安装winetrickssudoaptinstallwinetricks#oryay-Sywinetricks然后安装riched20winetricksriched20......
  • 发一下好看的博客园自定义主题代码
    发一下好看的博客园自定义主题代码要开通js权限,皮肤用simplememory,最好禁用模板侧边栏:<!DOCTYPEhtml><html><style>/*最外层容器样式*/.wrap{top:0;right:0;bottom:0;left:0;width:200px;height:200px;margin:auto;/......
  • 微信小程序之实现封装一个富文本编辑器 Editor
    前言富文本编辑器,可以对图片、文字进行编辑。编辑器导出内容支持带标签的html和纯文本的text,编辑器内部采用delta格式进行存储。通过setContents接口设置内容时,解析插入的html可能会由于一些非法标签导致解析错误,建议开发者在小程序内使用时通过delta进行插入。富文本......