共计 3213 个字符,预计需要花费 9 分钟才能阅读完成。
版权申明:本文原创,转载请注明出处 https://segmentfault.com/a/11…
系列文章:微信小程序自定义组件——底部菜单栏 ActionSheet
之所以写这个自定义 modal 组件,和自定义 ActionSheet 一样,次要是用于一些凋谢能力。有些凋谢能力必须绑定在 button 上,比方用户受权,这个需要很常见,然而小程序当初曾经不反对被动弹出受权框了,所以咱们会想先弹出 modal 用户点击确定再来弹出受权框,小程序原生的 Modal 确定按钮无奈实现,故此组件应运而生。该 Modal 组件还反对转发,关上设置页的凋谢能力,同时也扩大了提交表单性能。
装置
1. 应用 npm 装置
间接应用小程序开发工具自带的 构建 npm
,请按上面几个步骤引入:
- 确保我的项目目录下有 package.json 文件,已有的跳过这一步
$ npm init
- 装置
$ npm i wx-miniprogram-modal
- 在小程序开发者工具中顺次找到并点击
工具
->构建 npm
,构建实现后你的我的项目目录会多出一个miniprogram_npm
目录,请确保我的项目设置已勾选应用 npm 模块
- 在应用组件的页面配置 json 中应用
{
"usingComponents": {"mymodal": "wx-miniprogram-modal"}
}
2. 不应用任何构建工具的一般小程序安装
间接拷贝 wx-miniprogram-modal 仓库中的 miniprogram_dist
目录下的代码到我的项目中的放组件的目录中去,之后应用办法和小程序自定义组件一样了。同样须要在页面配置 json 中申明:
{
"usingComponents": {"mymodal": "../components/modal/index" // 依据你的目录写}
}
应用
wxml 文件中
<mymodal type="{{type}}" title='{{title}}' content='{{content}}' form-items="{{items}}"
confirmText='{{confirmText}}' showStatus='{{showModal}}' showCancel="{{showCancel}}"
bind:complete="onComplete"></mymodal>
js 文件中
// 只列出外围代码
Page({
data: {
showModal: false,
type: 'getUserInfo',
showCancel: false,
title: '提醒',
content: '',
confirmText: '好的',
items: [{label: '请输出姓名', name: 'name'}]
},
// 实现操作的回调
onComplete: function (e) {
// 敞开模态框 这里其实不写也行,组件里曾经蕴含了敞开 modal 的代码,// 然而不写这个的话,该页面的 data 里的 showModal 值是不会变仍是 true,// 如果确定不会造成其余影响,写不写看集体
this.setData({showModal: false,})
if (e.detail.confirm) {
// 用户点击确定
// 各个 type 携带的数据 这里为了不便写到一起了
// 用户受权
if (this.data.type === 'getUserInfo') {if (e.detail.hasUserInfo) {
// 曾经受权
this.setData({
hasUserInfo: true,
userInfo: e.detail.userInfo
})
app.globalData.userInfo = e.detail.userInfo
} else {
wx.showToast({
title: '您回绝了受权',
icon: 'none'
})
}
}
// 提交表单
if (this.data.type === 'prompt') {
var formData = e.detail.formData
var formId = e.detail.formId
// eg.
// formData: {name: "Jaime"}
// formId: "the formId is a mock one"
}
// 关上设置页
if (this.data.type === 'openSetting') {
var authSetting = e.detail.authSetting
// eg. {"scope.userInfo": true}
}
} else {// 用户点击勾销}
},
onShareAppMessage: function (res) {if (res.from === 'button') {
// 因为自定义组件内不能应用转发回调 所以在这敞开模态框
// 不写这个 模态框点击转发按钮将不会主动敞开
if (res.target.dataset.type === 'modalShare') {
this.setData({showModal: false})
}
}
return {
title: '自定义转发题目',
path: '/page/index?id=123'
}
}
})
参数
属性 | 数据类型 | 阐明 | 选项 | 默认值 |
---|---|---|---|---|
showStatus | Boolean | modal 的显隐状态 | 必填 | — |
type | String | modal 的类型,可选值:prompt 、getUserInfo 、share 、openSetting |
必填 | — |
showCancel | Boolean | 是否显示勾销按钮 | 选填 | false |
confirmText | String | 确定按钮的文字 | 选填 | 好的 |
cancelText | String | 勾销按钮的文字 | 选填 | 勾销 |
title | String | 题目,不写或为空时则不显示 title | 选填 | 无 |
content | String | modal 的内容 | 选填 | — |
formItems | Array | type='prompt' 时必填的表单项属性,格局: [{label: ‘ 输入框 label’, name: ‘ 键名 ’, val: ‘ 初始值(可为空)’}, …] |
选填 | [] |
reportSubmit | Boolean | type=”prompt” 时 是否返回 formId | 选填 | false |
触发事件
eventName | 阐明 |
---|---|
complete | modal 实现时触发的事件,e.detail.confirm 来判断是勾销还是确定,type='prompt' 时携带的数据包含 e.detail.formData 和e.detail.formId ; type='getUserInfo' 时携带的数据为 e.detail.hasUserInfo ,e.detail.userInfo ; type='openSetting' 时携带的数据为e.detail.authSetting ; 具体请看示例 |
注意事项
type = 'prompt'
时,必须设置表单项属性formItems="{{items}}"
;-
表单项属性
formItems
格局如下:[{label: '请输出姓名', name: 'name', val: '初始值(可为空)'}, {label: '请输出邮箱', name: 'email'}, val: '']
提交后表单数据将重置为初始值
type='share'
页面生命周期需申明onShareAppMessage
, 并且在外部加上以下代码,因为自定义组件内不能应用转发回调 所以在这敞开模态框,不写这个 模态框点击转发按钮后将不会主动敞开;
if (res.from === 'button') {if (res.target.dataset.type === 'modalShare') {
this.setData({showModal: false})
}
}
type='getUserInfo'
时,按需要来设定受权 modal 初始显隐状态。
倡议:我的项目中先 wx.getSetting
查看用户是否曾经受权,未受权 showStatus 初始设为 true 将被动弹出该弹框,若已受权 showStatus 初始设为 false 防止屡次弹出;
- 每个 type 携带的数据见上文代码示例或下载以下残缺示例。
示例 Demo
微信小程序自定义组件应用示例整合
正文完