微信小程序—史上最自由的自定义dialog,支持嵌套各种自定义布局

摘要

说到小程序dialog,属于项目最常用的控件之一,也是变化最多端的控件之一,逼不得已,只有自定义,网上很多自定义dialog,但估计很少能直接用到项目中使用的,自己写又太麻烦,故笔者为了使用方便,只对dialog的显示与隐藏方法与效果进行封装,不涉及dialog中的布局、样式及逻辑,大大减少了平时的开发工作。

使用步骤

步骤1

将文末dialog组件拷贝至项目components下

步骤2

xxx.json中引用

"hw-dialog": "../../components/dialog/dialog",
步骤3

xxx.wxml中使用

<hw-dialog show="{{dialogShow}}" bindbuttontap="closeDialog">
  //在这里添加自定义布局、样式、逻辑,如下:
  <view style="padding:60rpx;" bindtap:"xxxxxx">
    欢迎来到Demo集中营
  </view>
</hw-dialog>
步骤4

xxx.js中使用

data: {
    dialogShow: false,
  },
  openDialog: function () {
    this.setData({
      dialogShow: true
    })
  },
  closeDialog(e) {
    this.setData({
      dialogShow: false
    })
  },

效果图

在这里插入图片描述

体验途径

依次点击:custom系列>>>dialog&actionsheet
更多Demo尽在Demo集中营
微信小程序—史上最自由的自定义actionsheet,支持嵌套各种自定义布局
.

dialog组件代码

dialog.js

module.exports =
  (function(modules) {
    var installedModules = {};

    function __webpack_require__(moduleId) {
      if (installedModules[moduleId]) {
        return installedModules[moduleId].exports;
      }
      var module = installedModules[moduleId] = {
        i: moduleId,
        l: false,
        exports: {}
      };
      modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
      module.l = true;
      return module.exports;
    }
    __webpack_require__.m = modules;
    __webpack_require__.c = installedModules;
    __webpack_require__.d = function(exports, name, getter) {
      if (!__webpack_require__.o(exports, name)) {
        Object.defineProperty(exports, name, {
          enumerable: true,
          get: getter
        });
      }
    };
    __webpack_require__.r = function(exports) {
      if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
        Object.defineProperty(exports, Symbol.toStringTag, {
          value: 'Module'
        });
      }
      Object.defineProperty(exports, '__esModule', {
        value: true
      });
    };
    __webpack_require__.t = function(value, mode) {
      if (mode & 1) value = __webpack_require__(value);
      if (mode & 8) return value;
      if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
      var ns = Object.create(null);
      __webpack_require__.r(ns);
      Object.defineProperty(ns, 'default', {
        enumerable: true,
        value: value
      });
      if (mode & 2 && typeof value != 'string')
        for (var key in value) __webpack_require__.d(ns, key, function(key) {
          return value[key];
        }.bind(null, key));
      return ns;
    };
    __webpack_require__.n = function(module) {
      var getter = module && module.__esModule ?
        function getDefault() {
          return module['default'];
        } :
        function getModuleExports() {
          return module;
        };
      __webpack_require__.d(getter, 'a', getter);
      return getter;
    };
    __webpack_require__.o = function(object, property) {
      return Object.prototype.hasOwnProperty.call(object, property);
    };
    __webpack_require__.p = "";
    return __webpack_require__(__webpack_require__.s = 20);
  })
  ({
    20:
      (function(module, exports, __webpack_require__) {

        "use strict";


        Component({
          options: {
            multipleSlots: true,
            addGlobalClass: true
          },
          properties: {
            title: {
              type: String,
              value: ''
            },
            extClass: {
              type: String,
              value: ''
            },
            maskClosable: {
              type: Boolean,
              value: true
            },
            mask: {
              type: Boolean,
              value: true
            },
            show: {
              type: Boolean,
              value: false,
              observer: '_showChange'
            },
            buttons: {
              type: Array,
              value: []
            }
          },
          data: {
            innerShow: false
          },
          ready: function ready() {
            var buttons = this.data.buttons;
            var len = buttons.length;
            buttons.forEach(function(btn, index) {
              if (len === 1) {
                btn.className = 'weui-dialog__btn_primary';
              } else if (index === 0) {
                btn.className = 'weui-dialog__btn_default';
              } else {
                btn.className = 'weui-dialog__btn_primary';
              }
            });
            this.setData({
              buttons: buttons
            });
          },

          methods: {
            buttonTap: function buttonTap(e) {
              var index = e.currentTarget.dataset.index;

              this.triggerEvent('buttontap', {
                index: index,
                item: this.data.buttons[index]
              }, {});
            },
            close: function close() {
              var data = this.data;
              if (!data.maskClosable) return;
              this.setData({
                show: false
              });
              this.triggerEvent('close', {}, {});
            },
            stopEvent: function stopEvent() {}
          }
        });
      })
  });

dialog.json

{
  "component": true
}

dialog.wxml

<view bindtap="close" class="weui-mask {{!show ? 'weui-mask_hidden' : '' }}" wx:if="{{mask}}"></view>
<view wx:if="{{show}}" bindtap="close" class="weui-dialog__wrp {{extClass}}"><view class="weui-dialog" catchtap="stopEvent"><slot></slot></view></view>

dialog.wxss

.weui-mask {
  position: fixed;
  z-index: 1000;
  top: 0;
  right: 0;
  left: 0;
  bottom: 0;
  background: rgba(0, 0, 0, 0.6);
}

.weui-mask_transparent {
  position: fixed;
  z-index: 1000;
  top: 0;
  right: 0;
  left: 0;
  bottom: 0;
}

.weui-dialog__wrp {
  position: fixed;
  z-index: 5000;
  top: 16px;
  bottom: 16px;
  left: 16px;
  right: 16px;
  text-align: center;
  font-size: 0;
  display: -webkit-box;
  display: -webkit-flex;
  display: flex;
  align-items: center;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
  justify-content: center;
}

.weui-dialog__wrp .weui-dialog {
  max-height: 100%;
}

.weui-dialog {
  background-color: transparent;
  text-align: center;
  overflow: hidden;
  display: -webkit-box;
  display: -webkit-flex;
  display: flex;
  -webkit-flex-direction: column;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  max-height: 90%;
}


@media screen and (min-width:352px) {
  .weui-dialog {
    width: 320px;
    margin: 0 auto;
  }
}

.weui-dialog.weui-dialog_hidden {
  opacity: 0;
  transform: scale3d(1, 1, 0);
}

.weui-dialog {
  opacity: 1;
  -webkit-transform: scale3d(1, 1, 1);
  transform: scale3d(1, 1, 1);
  transition: all 0.3s ease-in;
}

.weui-mask.weui-mask_hidden {
  opacity: 0;
  transform: scale3d(1, 1, 0);
}

.weui-mask {
  opacity: 1;
  transform: scale3d(1, 1, 1);
  transition: all 0.3s ease-in;
}

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玩烂小程序

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值