一、首先我们来看官方提供的wx.showToast(Object object)方法:
(官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showToast.html)
很明显存在两个问题:
提示文字最多只支持7个字符长度 提示图标只支持两种:success和loading这并不能满足我们的业务需求,所以接下来实现自定义提示组件(下面是github地址,需要的自行下载,欢迎star交流!)
地址:https://github.com/736755244/Toast
二、参照一般的组件写法(方法1)
1、提示框的样式和内容根据自己的业务需求进行设计
<!-- 组件页面 可根据自己需求添加更加丰富的内容,此处只展示图标和内容--> <view class="toast_content_box" wx:if="{{showToast}}"> <view class="toast_content"> <!-- 提示图标 --> <view class="toast_content_img {{iconType}}"></view> <!-- 提示内容 --> <view class="toast_content_text"> {{dataText}} </view> </view> </view>2、功能实现
Component({ properties: { //此处可接收来自页面的一些参数 }, data: { dataText: 'default content',//提示文字,可默认 iconType:'',//提示图片类型 showToast: false//默认不弹出 }, methods: { //展示弹框 showDialog(data) { var _this = this _this.setData({ showToast: true,//展示弹框 dataText: data.content,//设置提示内容 iconType:data.icon//设置提示图片类型 }) // 定时器关闭弹框 setTimeout(function () { _this.setData({ showToast: false }) }, 1500); } } })3、 页面引用
<!--wxml--> <toast id='toastDialog'></toast> <!--json--> "usingComponents": { "toast": "../../components/toast1/index" } <!--js--> onReady: function () { //获得Toast组件,此处获取的id与页面定义的组件id一致,也可以使用class属性 this.toastDialog = this.selectComponent("#toastDialog") }, showMes(){ this.toastDialog.showDialog({ content: 'xxxx',//可传入提示的内容 image:'xxxx',//可传入自定义的图片路径,优先级大于icon icon:'xxxx'//可传入提示图片的类型:success/error/warning等 }) }
三、模块化写法(方法2)
1、不需要json文件,只需要js、wxml、wxss三个文件即可
2、提示框的样式和内容根据自己的业务需求进行设计
<!-- 自定义toast组件 --> <template name="toast"> <view class="toast_content_box" wx:if="{{ isHide }}"> <view class="toast_content"> <!-- 默认的提示图片 --> <view class="toast_content_img {{iconType}}" wx:if="{{!isUserImg}}"></view> <!-- 用户自定义提示图片 --> <view class="toast_content_myimg" wx:if="{{isUserImg}}"> <image src="{{imgPath}}"></image> </view> <!-- 内容 --> <view class="toast_content_text"> {{content}} </view> </view> </view> </template>3、功能实现
let _compData = { '_toast_.isHide': false,// 控制组件显示隐藏 '_toast_.content': 'default content',// 显示的内容,可默认 '_toast_.isUserImg': false,// 控制是否显示用户自定义的图片 '_toast_.iconType': '',// 提示的图片类型 '_toast_.imgPath': ''// 用户自定义图片路径 } let toastPannel = { //展示逻辑 showTip: function (data) { let self = this; //赋值 this.setData({ '_toast_.isHide': true, '_toast_.content': data.content, '_toast_.isUserImg': data.image ? true : false, '_toast_.imgPath': data.image, '_toast_.iconType': data.icon || 'success' }); setTimeout(function () { //隐藏提示框 self.setData({ '_toast_.isHide': false }) }, 2000) }, } function ToastPannel() {//构造方法关联了当前页的方法及相关代码 // 拿到当前页面对象 let pages = getCurrentPages(); let curPage = pages[pages.length - 1]; this.__page = curPage; Object.assign(curPage, toastPannel); // 附加到page上 curPage.toastPannel = this; // 把组件的数据合并到页面的data对象中 curPage.setData(_compData); return this; } module.exports = { ToastPannel }4、引入方法
<!--app.js--> //引入弹框组件 import { ToastPannel } from './components/toast2/index'; App({ ToastPannel,//公共组件 onLaunch: function () { //...... } }) <!--app.wxss--> //引入弹框样式 @import "./components/toast2/index.wxss"; <!--需要引入组件的页面wxml--> <import src="../../components/toast2/index.wxml"/> <template is="toast" data="{{ ..._toast_ }}"/> <!--需要引入组件的页面js--> const app=getApp();获取app实例 Page({ data: { //.... }, onLoad(){ new app.ToastPannel()//在onload中实例化 }, showMesSuc(){ //showtip是组件中的方法,这里可以直接调用 this.showTip({ image:"xxxxx",//可自定义显示的图片路径,优先级大于icon icon: "xxxxx",//可以传入success、error、warning等定义好的图标格式 content:"xxxxxxx"//可传入自定义的提示内容 }) } })四、带动画效果
官方文档关于动画说明:https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/wx.createAnimation.html
1、把之前两种方法的控制弹框显示的字段去掉,替换成animation属性(默认弹框透明度为0)
<!-- 此处不用字段来控制是否展示弹框,使用动画来设置opacity透明度来完成 --> <view class="toast_content_box" animation="{{animationData}}"> <view class="toast_content"> <!-- 默认提示图标 --> <view class="toast_content_img {{iconType}}" wx:if="{{!isUserImg}}"></view> <!-- 用户自定义提示图片 --> <view class="toast_content_myimg" wx:if="{{isUserImg}}"> <image src="{{imgPath}}"></image> </view> <!-- 提示内容 --> <view class="toast_content_text"> {{dataText}} </view> </view> </view>2、 实现方法
Component({ options: { multipleSlots: true // 在组件定义时的选项中启用多slot支持 }, properties: { //..... }, data: { animationData: {},//控制动画效果 dataText: '', icon:'', showToast: false, isUserImg:false, imgPath:'' }, methods: { //展示弹框 showDialog(data) { var _this = this //创建动画 var animation = wx.createAnimation({ duration: 300, timingFunction: 'ease', }) _this.animation = animation animation.opacity(1).step()//透明度由0=>1 _this.setData({ animationData: animation.export(), showToast: true, dataText: data.content,//设置提示内容 isUserImg: data.image?true:false,//是否展示用户自定义图片 imgPath: data.image,//用户自定义图片 iconType:data.icon//设置提示图片类型 }) // 定时器关闭弹框 setTimeout(function () { animation.opacity(0).step()//透明度由1=>0 this.setData({ animationData: animation.export() }) }.bind(this), 2000) } } })五、效果展示