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


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 相关文章推荐
JQuery 选择器 xpath 语法应用
May 13 Javascript
js中eval详解
Mar 30 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
Jun 27 Javascript
javascript打印html内容功能的方法示例
Nov 28 Javascript
浅谈jquery中delegate()与live()
Jun 22 Javascript
基于OL2实现百度地图ABCD marker的效果
Oct 01 Javascript
vue组件父与子通信详解(一)
Nov 07 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
Nov 30 Javascript
JS加密插件CryptoJS实现AES加密操作示例
Aug 16 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
Sep 03 Javascript
vue实现分页栏效果
Jun 28 Javascript
node.js中module模块的功能理解与用法实例分析
Feb 14 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中养成7个面向对象的好习惯
2010/07/17 PHP
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
PHP统一页面编码避免乱码问题
2015/04/09 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
2017/07/04 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
jquery简单瀑布流实现原理及ie8下测试代码
2013/01/23 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
JavaScript中读取和保存文件实例
2014/05/08 Javascript
extjs 如何给column 加上提示
2014/07/29 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
微信小程序 解决swiper不显示图片的方法
2017/01/04 Javascript
javascript帧动画(实例讲解)
2017/09/02 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
javascript实现弹出层效果
2019/12/10 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
vue实现信息管理系统
2020/05/30 Javascript
利用python实现数据分析
2017/01/11 Python
python对excel文档去重及求和的实例
2018/04/18 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
python如何调用字典的key
2020/05/25 Python
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
女性时尚在线:IVRose
2019/02/23 全球购物
杭州SQL浙江浙大网新恩普软件有限公司
2013/07/27 面试题
《合作意向书》怎么写?
2019/08/20 职场文书
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL