详解钉钉小程序组件之自定义模态框(弹窗封装实现)


Posted in Javascript onMarch 07, 2020

背景

开发钉钉小程序中需要用到模态框 文档里也没有 自己搞一个…
效果大概长这个样

点击指定按钮,弹出模态框,里面的内容可以自定义,可以是简单的文字提示,也可以输入框等复杂布局。操作完点击取消或确定关闭。

开始封装

上图所示文件内容放入项目即可 (路径自己高兴着来)

modal.js
内容不多 但都是精华

/**
 * 自定义modal浮层
 * 使用方法:
 * <modal show="{{showModal}}" height='80%' onCancel="modalCancel" onSubmit='modalSubmit'>
 <view>你自己需要展示的内容</view>
 </modal>
 
 属性说明:
 show: 控制modal显示与隐藏
 height:modal的高度
 onCancel:点击取消按钮的回调函数
 onSubmit:点击确定按钮的回调函数
 
 */
 
 Component({
 
 /**
 * 组件的属性列表
 */
 props: {
 // modal的默认高度
 height: '60%',
 
 //是否显示modal
 show: false,
 
 // submit()
 onSubmit:(data) => console.log(data),
 
 // onCancel()
 onCancel:(data) => console.log(data),
 },
 
 /**
 * 组件的初始数据
 */
 data: {
 
 },
 
 /**
 * 组件的方法列表
 */
 methods: {
 clickMask() {
 // this.setData({show: false})
 },
 
 cancel(e) {
 // this.setData({ show: false });
 this.props.onCancel(e);
 },
 
 submit(e) {
 // this.setData({ show: false });
 this.props.onSubmit(e);
 }
 }
 })

代码使用 props 属性设置属性默认值, 调用的时候传递指定值即可

modal.json
这就是个申明 啥也不是

{
 "component": true,
 "usingComponents": {}
 }

开发者需要在 .json 文件中指明自定义组件的依赖

modal.acss
这玩意我一个写后端的调了半天才勉强看得下去 求大佬改版发我

.mask{
 position: absolute;
 top: 0;
 bottom: 0;
 width: 100%;
 height: 100%;
 display: flex;
 justify-content: center;
 align-items: center;
 background-color: rgba(0,0,0,0.4);
 z-index: 9999;
}

.modal-content{
 flex-direction: column;
 width: 90%;
 /* height: 80%; */
 position: fixed;
 top: 10%;
 left: 5%;
 background-color: #fff;
 border-radius: 10rpx;
}

.modal-btn-wrapper{
 display: flex;
 flex-direction: row;
 height: 100rpx;
 line-height: 100rpx;
 background-color: #fff;
 border-radius: 10rpx;
 border-top: 2rpx solid rgba(7,17,27,0.1);
}

.cancel-btn, .confirm-btn{
 flex: 1;
 height: 100rpx;
 line-height: 100rpx;
 text-align: center;
 font-size: 32rpx;
}

.cancel-btn{
 border-right: 2rpx solid rgba(7,17,27,0.1);
}

.main-content{
 flex: 1;
 height: 100%;
 overflow-y: hidden; 
}

modal.axml
敲重点 slot 标签

可以将 slot 理解为槽位,default slot就是默认槽位,如果调用者在组件标签之间不传递 axml,则最终会将默认槽位渲染出来。而如果调用者在组件标签之间传递有 axml,则使用其替代默认槽位,进而组装出最终的 axml 以供渲染。

简而言之 你在调用的时候所编辑的axml都被塞进slot里面了

<view class='mask' a:if='{{show}}' onTap='clickMask'>
 <view class='modal-content' style='height:{{height}}'>
 <scroll-view scroll-y class='main-content'>
 <slot></slot>
 </scroll-view>
 <view class='modal-btn-wrapper'>
 <view class='cancel-btn' style='color:rgba(7,17,27,0.6)' onTap='cancel'>取消</view>
 <view class='confirm-btn' style='color:#13b5f5' onTap='submit'>确定</view>
 </view>
 </view>
</view>

使用
这个相对简单鸟

page/xx/page.json
首先申明我要调用这个组件 标签名我就叫modal 路径自己别搞错就好

{
 "usingComponents": {
 "modal": "/page/components/modal/modal"
 }
}

page/xx/page.axml
就是这样 喵~

<modal show="{{showSearchModal}}" height='80%' onCancel="searchModalCancel" onSubmit='searchModalSubmit'>
 <view>你自己的布局</view>
</modal>

page/xx/page.js
这个你就写你自己的逻辑就没毛病了

let app = getApp();
Page({
 data: {
 showSearchModal: false,
 },
 
 onLoad() {
 },

 searchModalCancel(){
 this.setData({
 showSearchModal: false,
 });
 dd.alert({
 title: '提示',
 content: '用户点击了取消',
 });
 },

 searchModalSubmit(){
 this.setData({
 showSearchModal: false,
 });
 dd.alert({
 title: '提示',
 content: '用户点击了提交',
 buttonText: '我知道了',
 });
 },
});

小结
激动的心,颤抖的手。。。
总之先阅读官方文档
钉钉开放平台 => 前端API => 小程序 => 框架 => 自定义组件
https://ding-doc.dingtalk.com/doc#/dev/develop-custom-component

本案例相对简单,业务复杂的需求看看文档基本都能实现。

关于微信小程序实现自定义modal弹窗封装的方法 ,可以点击查看。

总结

到此这篇关于钉钉小程序组件之自定义模态框(弹窗封装实现)的文章就介绍到这了,更多相关小程序组件自定义模态框内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
你必须知道的Javascript知识点之&quot;单线程事件驱动&quot;的使用
Apr 23 Javascript
用js的for循环获取radio选中的值
Oct 21 Javascript
js闭包的用途详解
Nov 09 Javascript
js与css实现弹出层覆盖整个页面的方法
Dec 13 Javascript
js实现键盘控制DIV移动的方法
Jan 10 Javascript
在jQuery中处理XML数据的大致方法
Aug 14 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
Jan 22 Javascript
微信小程序 弹框和模态框实现代码
Mar 10 Javascript
使用travis-ci如何持续部署node.js应用详解
Jul 30 Javascript
原生js jquery ajax请求以及jsonp的调用方法
Aug 04 jQuery
angular4中*ngFor不能对返回来的对象进行循环的解决方法
Sep 12 Javascript
vue设置动态请求地址的例子
Nov 01 Javascript
Vue实现手机扫描二维码预览页面效果
May 28 #Javascript
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
Mar 07 #Javascript
微信小程序实现比较功能的方法汇总(五种方法)
Mar 07 #Javascript
微信小程序实现下滑到底部自动翻页功能
Mar 07 #Javascript
js实现选项卡效果
Mar 07 #Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
Mar 07 #Javascript
js实现简单放大镜效果
Mar 07 #Javascript
You might like
谈谈PHP语法(3)
2006/10/09 PHP
php设计模式 Proxy (代理模式)
2011/06/26 PHP
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
JavaScript delete操作符应用实例
2009/01/13 Javascript
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
封装好的一个万能检测表单的方法
2015/01/21 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
2016/11/09 Javascript
JS常用知识点整理
2017/01/21 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
Postman参数化实现过程及原理解析
2020/08/13 Javascript
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
Python 字典(Dictionary)操作详解
2014/03/11 Python
使用python解析xml成对应的html示例分享
2014/04/02 Python
Python 的 with 语句详解
2014/06/13 Python
python进程类subprocess的一些操作方法例子
2014/11/22 Python
对于Python编程中一些重用与缩减的建议
2015/04/14 Python
Python二分法搜索算法实例分析
2015/05/11 Python
将TensorFlow的模型网络导出为单个文件的方法
2018/04/23 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
《小草和大树》教学反思
2014/02/16 职场文书
小学安全教育材料
2014/02/17 职场文书
小班幼儿评语大全
2014/04/30 职场文书
公司采购主管岗位职责
2014/06/17 职场文书
加入学生会自荐书
2015/03/05 职场文书
nginx配置文件使用环境变量的操作方法
2021/06/02 Servers
python高温预警数据获取实例
2022/07/23 Python