微信小程序 组件弹窗

一、前言


以前小程序弹窗直接调微信modal简单快捷,现在公司最近项目新增需求得底部选择增加一个。不说了上代码。


二、具体实现

我们先实现个简单的弹窗组件,详情图如下:

 

实现过程如下:

1.新建component文件夹存放我们的组件,里边存放的就是我们所用的组件,我们今天要做的事弹出框,新建文件夹dialog存放我们的组件模板,点击右键选择新建component,就会自动生成组件的模板wxss、wxml、json、js,如图

2.我们可以写一些组件样式和布局,更页面写法类似,我就不多说了,直接把代码贴出 :

dialog.wxml

<!--component/dialog/dialog.wxml-->
<view class="my-dialog" hidden="{{!showDialog}}">
  <view class="my-mask"></view>
  <view class="my-container">
    <view class="title">{{title}}</view>
    <view class="content">
     <view class="row">
      <checkbox-group bindchange="checkboxChange" class="upcheck">
  {{content}} <checkbox value="1" checked="{{item.checked}}" />
    </checkbox-group>
    </view>
    </view>
    <view class="btn-row">
      <view class="confirm" bindtap="_confirm">{{confirmText}}</view>
      <view class="upplan" bindtap="_upplan">{{upText}}</view>
      <view class="cancel" bindtap='_cancel'>{{cancelText}}</view>
    </view>
  </view>
</view>

dialog.wxss

/* component/dialog/dialog.wxss */
.my-dialog {
  opacity: 1;
}
.my-dialog .my-mask {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.6);
  z-index: 1000;
}
.my-dialog .my-container {
  position: fixed;
  width: 80%;
  max-width: 300px;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
  background-color: #fff;
  text-align: center;
  border-radius: 3px;
  overflow: hidden;
  z-index: 5000;
}
.my-dialog .my-container .title {
  display: inline-block;
  width: 100%;
  margin: 37rpx 0 0 0;
  height: 50rpx;
  line-height: 50rpx;
  text-align: center;
  font-weight: 400;
  font-size: 18px;
  color: #303133;
}
.my-dialog .my-container .content {
  margin: 10rpx 0 20rpx;
  display: inline-block;
  width: 100%;
  line-height: 50rpx;
  text-align: left;
}
.my-dialog .my-container .content .row {
  margin: 0 10%;
  width: 80%;
  color: #606266;
  word-break: break-all;
}
.my-dialog .my-container .btn-row {
  padding: 10rpx 0 0;
  display: inline-block;
  width: 100%;
  height: 80rpx;
  line-height: 70rpx;
  font-size: 14px;
  border-top: 1rpx solid #c0c4cc;
}
.my-dialog .my-container .btn-row .confirm {
  float: right;
  width: 30%;
  height: 100%;
  color: #3CC51F;
}
.my-dialog .my-container .btn-row .upplan {
  float: right;
  width: 40%;
  height: 100%;
  color: #86c2ec;
  border-right: 1rpx solid #c0c4cc;
}
.my-dialog .my-container .btn-row .cancel {
  color: #000;
  width: 30%;
  height: 100%;
  border-right: 1rpx solid #c0c4cc;
}
.upcheck{
  display: flex;
  justify-content: center;
  margin: 10px;
}

dialog.js

// component/dialog/dialog.js
Component({
  options: {
    multipleSlots: true // 在组件定义时的选项中启用多slot支持
  },
  /**
   * 组件的属性列表
   */
  properties: {
    title: {
      type: String,
      // 初始值
      value: '请确认提交信息'
    },
    // 弹窗内容
    content: {
      type: String,
      // 初始值
      value: '是否空载'
    },
    // 弹窗确认按钮文字
    confirmText: {
      type: String,
      value: '确定'
    },
    // 弹窗取消按钮文字
    cancelText: {
      type: String,
      value: '取消'
    },
    // 弹窗center按钮文字
    upText: {
      type: String,
      value: '修改目的站点'
    },
    
  },

  /**
   * 组件的初始数据
   */
  data: {
    showDialog: true,
    noload_stat:''
  },

  /**
   * 组件的方法列表
   */
  methods: {
    show() {
      this.setData({
        showDialog: true
      })
    },
    hide() {
      this.setData({
        showDialog: false
      })
    },
    /*
    * 内部私有方法建议以下划线开头
    * triggerEvent 用于触发事件
    */
    _cancel() {
      //触发取消回调
      this.triggerEvent("cancel")
    },
    _confirm() {
      //触发成功回调
      this.triggerEvent("confirm");
    },
     _upplan(){
       this.triggerEvent("upplan");
    },
    //选择框事件
    checkboxChange: function (e) {
      this.setData({ noload_stat: e.detail.value[0] == undefined ? "" : e.detail.value[0] })
    },
  }
})

3.模板文件也建好了,在首页用这个组件需要配置一下,首先建一个名为index.json的文件,里边配置"usingComponents",就是需要引入到首页,直接上代码:

{
  "navigationBarTitleText": "功能列表",
  "usingComponents": {
    "dialog": "/component/dialog/dialog"
  }
}

4.完成这些基本上大功告成了,还有最重要的一步也是最后一步,引入到首页,看代码

<!--index.wxml-->
<view class="container">
  <view class="userinfo">
    <button bindtap="handleSubmit"> 点我 </button>
  </view>
</view>
<dialog id="dialog"
      title="是否确认出发"
      bind:cancel="handleCancelDialog"
      bind:upplan="handleUpplanDialog"
      bind:confirm="handleConfirmDialog">
   </dialog>

配置index.js操作点击事件

onReady: function () {
    // 获得dialog组件
    this.dialog = this.selectComponent("#dialog");
  }, 
  // 点击了提交记录按钮
  handleSubmit(e) {
      // 打开弹窗
      this.dialog.show()

  },
  // 点击了弹出框的取消
  handleCancelDialog() {
    this.dialog.hide()
    console.log("取消")
  },
  // 点击了弹出框的确认
  handleConfirmDialog() {
    this.dialog.hide()
    console.log("确定")
  },
  // 点击了弹出框的确认
  handleUpplanDialog(){
    this.dialog.hide()
    console.log("修改目的站点:" + this.dialog.data.noload_stat)

  }

到此就结束,一个简单的小插件封装好了

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值