1. 概述

1.1 说明

小程序中使用wx.showModal(Object object)打开一个模态对话框,但是目前小程序所提供的modal中的内容显示比较死板,不能够完全满足工作中所遇到的功能信息,故做一个自定义组件来处理相关的功能任务。

自定义组件所需功能:

    1. 全屏蒙版
    2. 模态对话框的显示内容:标题、内容、操作按钮
    3. 对模态框的操作,如显示与隐藏,取消按钮是否显示,按钮对应标题颜色等
    4. 模态对话框内容信息能够自定义操作

1.2 自定义组件

  1.2.1 概述

  多个页面中会存在相同功能模块或类似功能模块,此时就可以把这些相同或类似的功能模块抽象成自定义组件,进行减少工作量的开展与后期维护;也可对复杂的页面拆分功能模块处理。

  小程序中的自定义组件也是由 json 、wxml 、wxss 、js 4个文件组成,直接右键点击新建component

    • json -- json文件中  "component": true (即显示声明自定义组件),则代表这个文件(json&wxml&wxss&js)为自定义组件
    • wxml -- wxml文件中进行编写自定义组件结构,其中组件中可使用<slot>节点去承载组件引用时所提供的子节点信息,即组件中写入<slot></slot>的地方,在页面中引用时可以执行定义节点信息。
    • wxss -- wxss文件中编写组件的样式,使用类选择器进行处理。
    • js -- js文件是定义组件的组件构造器Component({***}),包含组件对外属性properties,组件内部数据data,组件方法methods等

  1.2.2 引用

  使用已注册(json中显示声明component为true)的自定义组件前,需要先在页面的json文件中引用声明,自定义组件的标签名和组件文件路径:

{
"usingComponents": {
"component-tag-name": "path/to/the/custom/component"
}
}

  页面中引用:

<view>
<!-- 以下是对一个自定义组件的引用 -->
<component-tag-name 属性="属性值"></component-tag-name>
</view>

1.3 自定义组件图例

 

2. 代码

  码云: https://gitee.com/ajuanK/wxSimpleTodoList.git

2.1 组件页面设计(wxml)

  对话框中内容:标题、内容、操作按钮,其中内容使用slot去承接页面中自定义节点,按钮可以单按钮显示并更改其对应显示内容与颜色。

<view class='modal-wrapp' wx:if='{{modal.show}}'>
<view class='modal-main' style='height:{{(modal.height)?modal.height:modalDefault.height}}'>
<view class='modal-title'>{{(modal.title)?modal.title:modalDefault.title}}</view>
<scroll-view scroll-y class='modal-content'>
<slot></slot>
</scroll-view>
<view class='modal-button'>
<view class='modal-cancel' style='color:{{(modal.cancelColor)?modal.cancelColor:modalDefault.cancelColor}}' wx:if='{{modal.showCancel}}' bindtap="modalCancel">{{(modal.cancelText)?modal.cancelText:modalDefault.cancelText}}</view>
<view class='modal-confirm' style='color:{{(modal.confirmColor)?modal.confirmColor:modalDefault.confirmColor}}' bindtap="modalConfirm">{{(modal.confirmText)?modal.confirmText:modalDefault.confirmText}}</view>
</view>
</view>
</view>

2.2 组件构造器(js)

  使用modal对象去承接弹出框相关配置,modalDefault对象配置默认数据信息,按钮点击事件触发返回事件success

Component({
/**
* 组件的属性列表
* show: false,//modal是否显示,默认false
height: '',//modal显示内容高度,默认为50%
title: '',//modal标题,默认提示
showCancel: false,//是否显示取消按钮,默认显示
cancelText: '取消',//取消按钮标题,默认为取消
cancelColor: '',//取消按钮标题颜色,默认为#000000
confirmText: '',//确定按钮标题,默认为确定
confirmColor: '',//确定按钮标题颜色,默认为#3cc51f
clickClose:true//点击取消或确认按钮后是否关闭modal,默认为true
*/
properties: {
modal: {
type: Object,
value: {
show: false,
height: '',
title: '',
showCancel: true,
cancelText: '取消',
cancelColor: '',
confirmText: '',
confirmColor: '',
clickClose: true
}
}
}, /**
* 组件的初始数据
*/
data: {
modalDefault: {
show: false,
height: '50%',
title: '提示',
showCancel: true,
cancelText: '取消',
cancelColor: '#000000',
confirmText: '确定',
confirmColor: '#3cc51f',
clickClose: true
}
}, /**
* 组件的方法列表
*/
methods: {
/**
* 取消按钮事件
*/
modalCancel() {
this.modalShowChange();
this.triggerEvent('success', {
res: 'cancel'
})
},
/**
* 确定按钮事件
*/
modalConfirm() {
this.modalShowChange();
this.triggerEvent('success', {
res: 'confirm'
})
},
/**
* 弹框显示属性更改
*/
modalShowChange: function() {
let clickClose = this.data.modalDefault.clickClose;
if (this.data.modal && this.data.modal.clickClose != undefined) {
if (this.data.modal.clickClose == false) {
clickClose = false
}
}
if (clickClose) {
let objModal = {
show: false
}
this.setData({
modal: objModal
})
}
}
}
})

2.3 组件配置(json)

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

2.4 组件样式(wxss)

.modal-wrapp{
position: fixed;
left:;
right:;
top:;
bottom:;
display: flex;
justify-content: center;
align-items: center;
background-color: rgba(0,0,0,0.4);
z-index:;
}
.modal-main{
width: 80%;
background-color: #fff;
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
}
.modal-title{
font-size: 60rpx;
height: 100rpx;
line-height: 100rpx;
}
.modal-content{
flex:;
width: 100%;
overflow: hidden;
}
.modal-content-scroll{
margin-left: 32rpx;
margin-right: 32rpx;
}
.modal-button{
font-size: 48rpx;
width: 100%;
height: 100rpx;
line-height: 100rpx;
display: flex;
flex-direction: row;
border-top: 2rpx solid rgba(7,17,27,0.1); }
.modal-cancel, .modal-confirm{
flex:;
height: 100rpx;
line-height: 100rpx;
text-align: center;
}
.modal-cancel{
border-right: 2rpx solid rgba(7,17,27,0.1);
}

2.5 页面使用(json)

  自定义组件是在与pages同一目录下的components文件夹中的modal中。

{
"usingComponents": {
"modal":"../../components/modal/index"
}
}

2.6 页面使用(wxml)

  使用 catchtouchmove="ture" 处理弹出对话框后下边滚动条穿透问题

<view>
<button class="buttonClass" type="primary" bindtap='showModal'>打开弹出框</button>
<modal modal="{{modal}}" bindsuccess='modalOperate' catchtouchmove="ture">
<view class='modal-content' wx:for="{{content}}">{{item.text}}</view>
</modal>
</view>

2.7 页面使用(js)

Page({

  /**
* 页面的初始数据
*/
data: {
modal: {},
content: [{
text: '1.这是第一条数据信息,这是第一条数据信息,这是第一条数据信息,这是第一条数据信息。'
},
{
text: '2.这是第二条数据信息,这是第二条数据信息,这是第二条数据信息,这是第二条数据信息,这是第二条数据信息,这是第二条数据信息,这是第二条数据信息。'
}
]
},
showModal: function() {
let objModal = {
show: true,
title: '这是一个modal',
showCancel: false,
height: '70%',
confirmText: '我知道了'
}
this.setData({
modal: objModal
})
},
/**
* 弹框按钮操作事件
* @res 取消/确定按钮的相关信息
*/
modalOperate: function(res) {
if (res.detail.res == 'confirm') {
console.log('confirm')
} else if (res.detail.res == 'cancel') {
console.log('cancel')
}
}
})

2.8 页面使用(wxss)

.modal-content{
margin-left: 32rpx;
margin-right: 32rpx;
}
.buttonClass{
height: 100rpx
}

  

  

小程序 模态对话框自定义组件(modal)的更多相关文章

  1. 微信小程序页面调用自定义组件内的事件

    微信小程序页面调用自定义组件内的事件 page page.json { "usingComponents": { "my-component": ". ...

  2. 微信小程序中的自定义组件

    微信小程序中的组件 前言 之前做小程序开发的时候,对于开发来说比较头疼的莫过于自定义组件了,当时官方对这方面的文档也只是寥寥几句,一笔带过而已,所以写起来真的是非常非常痛苦!! 好在微信小程序的库从 ...

  3. 小程序如何封装自定义组件(Toast)

    1.创建和pages 同级的component目录新建一个myToast目录 例如: 2.myToast.wxml文件内容: <!-- 自定义toast组件 --> <!-- nam ...

  4. 微信小程序中的自定义组件(components)

     其实小程序开发很像vue和react的结合,数据绑定和setData  重新渲染页面的数据,最近发现连写组件都是很像,也是醉了,自我认为哈, 因为小程序可以将页面内的功能模块抽象成自定义组件,以便在 ...

  5. 微信小程序中的自定义组件 以及 相关的坑

    Step1 我们初始化一个小程序(本示例基础版本库为 1.7 ),删掉里面的示例代码,并新建一个 components 文件夹,用于存放我们以后开发中的所用组件,今天我们的目的是实现一个 首页 组件, ...

  6. 手摸手教你微信小程序开发之自定义组件

    前言 相信大家在开发小程序时会遇到某个功能多次使用的情况,比如弹出框.这个时候大家首先想到的是组件化开发,就是把弹出框封装成一个组件,然后哪里使用哪里就调用,对,看来大家都是有思路的人,但是要怎样实现 ...

  7. 原创:微信小程序如何使用自定义组件

    本博文是通过实际开发中的一个实例来讲解自定义组件的使用. 第一步:新建自定义组件目录,如图,我新建了个componts和tabList目录,然后右键tabList目录选择新建compont取名为tab ...

  8. 小程序里的自定义组件:组件的外部样式externalClasses的使用

    启用外部样式: 自定义组件: v-tag 在html 引入 在组件写外部样式的css : .ex-tag { background-color: #fffbdd ; } 在组件使用该外部的样式 这个时 ...

  9. 微信小程序之----弹框组件modal

    modal modal类似于javascript中的confirm弹框,默认情况下是一个带有确认取消的弹框,不过点击取消后弹框不会自动隐藏,需要通过触发事件调用函数来控制hidden属性. 官方文档 ...

随机推荐

  1. Entity Framework Core系列之实战(ASP.NET Core MVC应用程序)

    本示例演示在ASP.NET 应用程序中使用EF CORE创建数据库并对其做基本的增删改查操作.当然我们默认你的机器上已经安装了.NET CORE SDK以及合适的IDE.本例使用的是Visual St ...

  2. 移动端头部固定,上划逐渐透明 (vue)

    移动端头部固定,上划逐渐透明 <template> <div> <router-link tag="div" to="/" cla ...

  3. Linux下用户和raid练习题

    1. 公司一开发人员申请对服务器10天的oldboy普通用户权限,如何操作? useradd oldboy passwd oldboy usermod -e `date -d "10day& ...

  4. 蒟蒻浅谈树链剖分之一——两个dfs操作

    树链剖分,顾名思义就是将树形的结构剖分成链,我们以此便于在链上操作 首先我们需要明白在树链剖分中的一些概念 重儿子:某节点所有儿子中子树最多的儿子 重链:有重儿子构成的链 dfs序:按重儿子优先遍历时 ...

  5. 拷贝文件到服务器 提示FTP文件夹错误

    FTP文件夹错误将文件复制到FTP服务器时发生错误.请检查是否有权限将文件放到该服务器上.详细信息:200 Type set to I.227Entering Passive Mode (122,11 ...

  6. LODOP整页缩放,宽度、高度溢出缩放

    LODOP中,超文本超过打印项高度会自动分页,可以用语句进行缩放,让打印内容都在一页中.例如,整页缩放和高度溢出缩放.如下是三个语句及其效果,注意对内容缩放可能会导致变形哦,毕竟是不等比例缩放:LOD ...

  7. P2613 有理数取余

    原题链接 https://www.luogu.org/problemnew/show/P2613 在这里虽然是讲洛谷的题解,但用到的数论知识,归并到数论里也不为过! 进入正题: 首先看到题面:给出一个 ...

  8. FastStone Capture激活码

    用户名:c1ikm注册码:AXMQX-RMMMJ-DBHHF-WIHTV 或 AXOQS-RRMGS-ODAQO-APHUU

  9. Flask 构建微电影视频网站(四)

    后台管理 实现后台管理系统使用flask sqlalchemy结合mysql数据库进行增删改查操作.分页的使用.路由装饰器定义.模板中变量调用.登录会话机制.上传文件.flask wtforms表单使 ...

  10. MT【281】最大值函数

    已知正系数二次函数$ax^2+bx+c=0$有实数根,证明:$\max\{a,b,c\}\ge\dfrac{4}{9}(a+b+c)$ 证明:$\max\{a,b,c\}=\dfrac{a+c+|a- ...