【更新】2018-09-30

重写了组件,新增了一个样式,新增了一堆参数,原样式进行了部分调整,具体使用参照这里

下面那堆可以不用管了
demo目录
以下是示例图(无视那个熊猫)
加载中
加载中
成功
成功
警告
警告
自定义图片
自定义图片
我自定义组件放在了/components/toast文件夹下

toast.wxml部分

<view class="toast" wx:if="{{param.title || param.icon}}">
    <view class="toast-block">
        <image class="{{param.icon}}" src="{{param.image?param.image:(param.icon!='none'?'./icons/'+(param.icon||'success')+'.png':'')}}" bindload="onImageLoad" style="{{param.image?'width:'+width+';height:'+height+';':''}}"></image>
        <view class="title {{param.icon}}">{{param.title}}</view>
    </view>
</view>

toast.wxss部分

.toast {
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    position: fixed;
    top: 0;
    left: 0;
    z-index: 9999;
}

.toast-block {
    max-width: 540rpx;
    min-width: 200rpx;
    padding: 30rpx;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    background: rgba(0, 0, 0, 0.8);
    border-radius: 10rpx;
}

.toast-block>image {
    width: 60rpx;
    height: 60rpx;
    max-width: 540rpx;
    max-height: 540rpx;
    display: block;
}

.toast-block>image.loading {
    animation:circle 1s infinite linear;
}
@keyframes circle{
    0%{ transform:rotate(0deg); }
    100%{ transform:rotate(360deg); }
}
.toast-block>image.none{
    display: none;
}
.toast-block .title {
    margin-top: 20rpx;
    line-height: 29rpx;
    font-size: 30rpx;
    color: #fff;
    text-align: center;
    width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 1;
    -webkit-box-orient: vertical;
}
.toast-block .none{
    margin-top: 0;
}

toast.js部分

Component({
    properties: {
        param:{
            type: Object,
            value: { icon: "", image: "", title: "", duration:1000 },
            observer: function (newVal, oldVal) {
                if (!this.isPlainObject(newVal)){
                    let pages = getCurrentPages();
                    let page = pages[pages.length - 1];
                    var duration = typeof newVal == 'object' ? newVal.duration : 1000;
                    setTimeout(() => {
                        page.setData({
                            toast: {}
                        })
                    }, duration);
                }
            }
        }
    },
    data: {},
    methods: {
        isPlainObject: function(obj){
            for (var name in obj) {
                return false;
            }
            return true;
        },
        onImageLoad:function(e){
            this.setData({
                width: e.detail.width * 2 > 540 ? 540:e.detail.width * 2 + 'rpx',
                height: e.detail.height * 2 > 540 ? 540:e.detail.height * 2 + 'rpx'
            })
        }
    }
})

以上是自定义组件的内容,里面包含了三张图片,懒得发,自己画一个就行,三个文件名字分别是success,warning,loading,格式为png

 

 

icon图片大小固定为60rpx*60rpx。

image图片会自动判断大小,限制最大尺寸为540rpx*540rpx;

说说用法,

在app.js里插入

/**
 * toast模态弹窗
 * param.icon       string      弹框类型 success成功,warning警告,loading加载,none无图标,默认success
 * param.image      string      自定义图标
 * param.title      string      弹框内容
 * param.duration   int         弹窗显示时间,单位:毫秒,默认1秒
 */
showToast:function(param){
    let pages = getCurrentPages();
    let page = pages[pages.length - 1];
    page.setData({
        toast:param
    })
},

在需要使用的页面的json里加入

"usingComponents": {
    "toast": "/components/toast/toast"
}

然后在对应页面wxml最底部或最顶部加入

<toast param="{{toast}}"></toast>

然后对应页面的js中需要弹窗提示信息的地方加上

 app.showToast({
    title:'测试',
    duration:2000
 });

完。