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


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之对系统的toFixed()方法的修正
May 08 Javascript
自己整理的一个javascript日期处理函数
Oct 16 Javascript
jquery构造器的实现代码小结
May 16 Javascript
javascript跨域的4种方法和原理详解
Apr 08 Javascript
利用JavaScript实现拖拽改变元素大小
Dec 14 Javascript
基于JavaScript实现选项卡效果
Jul 21 Javascript
JavaScript定时器setTimeout()和setInterval()详解
Aug 18 Javascript
简单谈谈js的数据类型
Sep 25 Javascript
微信小程序switch开关选择器使用详解
Jan 31 Javascript
JavaScript简单实现的仿微博留言功能示例
Jan 17 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
Jun 10 Javascript
简单了解Ajax表单序列化的实现方法
Jun 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连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
Linux系统下PHP-FPM的安装和配置教程
2015/08/17 PHP
ThinkPHP表单数据智能写入create方法实例分析
2015/09/27 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
2021/03/09 PHP
最新优化收藏到网摘代码(digg,diigo)
2007/02/07 Javascript
JavaScript中的History历史对象
2008/01/16 Javascript
JS解析XML的实现代码
2009/11/12 Javascript
Jquery中dialog属性小记
2010/09/03 Javascript
全系IE支持Bootstrap的解决方法
2015/10/19 Javascript
jQuery无刷新分页完整实例代码
2015/10/27 Javascript
JS作用域深度解析
2016/12/29 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
Vue项目中引入外部文件的方法(css、js、less)
2017/07/24 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
react-native android状态栏的实现
2018/06/15 Javascript
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
如何正确理解vue中的key详解
2019/11/02 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
JS闭包原理及其使用场景解析
2020/12/03 Javascript
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
使用Python求解最大公约数的实现方法
2015/08/20 Python
利用Python操作消息队列RabbitMQ的方法教程
2017/07/19 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
世界第一冲浪品牌:O’Neill
2016/08/30 全球购物
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
化学相关工作求职信
2013/10/02 职场文书
大学生就业自荐信
2013/10/26 职场文书
护理人员的自我评价分享
2014/03/15 职场文书
2014年母亲节寄语
2014/05/07 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
无犯罪记录证明样本
2015/06/16 职场文书