知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
您當(dāng)前位置>首頁(yè) » 新聞資訊 » 小程序相關(guān) >
微信小程序自定義組件——模態(tài)框 Modal
發(fā)表時(shí)間:2021-1-5
發(fā)布人:葵宇科技
瀏覽次數(shù):72
之所以寫這個(gè)自定義modal組件,和自定義ActionSheet一樣,主要是用于一些開放能力。有些開放能力必須綁定在button上,比如用戶授權(quán),這個(gè)需求很常見,但是小程序現(xiàn)在已經(jīng)不支持主動(dòng)彈出授權(quán)框了,所以我們會(huì)想先彈出modal用戶點(diǎn)擊確定再來彈出授權(quán)框,小程序原生的Modal確定按鈕無法實(shí)現(xiàn),故此組件應(yīng)運(yùn)而生。該Modal組件還支持轉(zhuǎn)發(fā),打開設(shè)置頁(yè)的開放能力,同時(shí)也擴(kuò)展了提交表單功能。
安裝
1.使用npm安裝
直接使用小程序開發(fā)工具自帶的構(gòu)建npm
,請(qǐng)按下面幾個(gè)步驟引入:
- 確保項(xiàng)目目錄下有package.json文件,已有的跳過這一步
$ npm init
- 安裝
$ npm i wx-miniprogram-modal
- 在小程序開發(fā)者工具中依次找到并點(diǎn)擊
工具
->構(gòu)建npm
,構(gòu)建完成后你的項(xiàng)目目錄會(huì)多出一個(gè)miniprogram_npm
目錄,請(qǐng)確保項(xiàng)目設(shè)置已勾選使用npm模塊
- 在使用組件的頁(yè)面配置json中使用
{
"usingComponents": {
"mymodal": "wx-miniprogram-modal"
}
}
2.不使用任何構(gòu)建工具的普通小程序安裝
直接拷貝wx-miniprogram-modal倉(cāng)庫(kù)中的miniprogram_dist
目錄下的代碼到項(xiàng)目中的放組件的目錄中去,之后使用方法和小程序自定義組件一樣了。同樣需要在頁(yè)面配置json中聲明:
{
"usingComponents": {
"mymodal": "../components/modal/index" // 根據(jù)你的目錄寫
}
}
使用
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: '請(qǐng)輸入姓名', name: 'name' }]
},
// 完成操作的回調(diào)
onComplete: function (e) {
// 關(guān)閉模態(tài)框 這里其實(shí)不寫也行,組件里已經(jīng)包含了關(guān)閉modal的代碼,
// 但是不寫這個(gè)的話,該頁(yè)面的data里的showModal值是不會(huì)變?nèi)允莟rue,
// 如果確定不會(huì)造成其他影響,寫不寫看個(gè)人
this.setData({
showModal: false,
})
if (e.detail.confirm) {
// 用戶點(diǎn)擊確定
// 各個(gè)type攜帶的數(shù)據(jù) 這里為了方便寫到一起了
// 用戶授權(quán)
if (this.data.type === 'getUserInfo') {
if (e.detail.hasUserInfo) {
// 已經(jīng)授權(quán)
this.setData({
hasUserInfo: true,
userInfo: e.detail.userInfo
})
app.globalData.userInfo = e.detail.userInfo
} else {
wx.showToast({
title: '您拒絕了授權(quán)',
icon: 'none'
})
}
}
// 提交表單
if (this.data.type === 'prompt') {
var formData = http://www.wxapp-union.com/e.detail.formData
var formId = e.detail.formId
// eg.
// formData: {name: "Jaime"}
// formId: "the formId is a mock one"
}
// 打開設(shè)置頁(yè)
if (this.data.type === 'openSetting') {
var authSetting = e.detail.authSetting
// eg. { "scope.userInfo": true}
}
} else {
// 用戶點(diǎn)擊取消
}
},
onShareAppMessage: function (res) {
if (res.from === 'button') {
// 因?yàn)樽远x組件內(nèi)不能使用轉(zhuǎn)發(fā)回調(diào) 所以在這關(guān)閉模態(tài)框
// 不寫這個(gè) 模態(tài)框點(diǎn)擊轉(zhuǎn)發(fā)按鈕將不會(huì)自動(dòng)關(guān)閉
if (res.target.dataset.type === 'modalShare') {
this.setData({
showModal: false
})
}
}
return {
title: '自定義轉(zhuǎn)發(fā)標(biāo)題',
path: '/page/index?id=123'
}
}
})
參數(shù)
屬性 | 數(shù)據(jù)類型 | 說明 | 選項(xiàng) | 默認(rèn)值 |
---|---|---|---|---|
showStatus | Boolean | modal的顯隱狀態(tài) | 必填 | — |
type | String | modal的類型,可選值:prompt 、getUserInfo 、share 、openSetting | 必填 | — |
showCancel | Boolean | 是否顯示取消按鈕 | 選填 | false |
confirmText | String | 確定按鈕的文字 | 選填 | 好的 |
cancelText | String | 取消按鈕的文字 | 選填 | 取消 |
title | String | 標(biāo)題,不寫或?yàn)榭諘r(shí)則不顯示title | 選填 | 無 |
content | String | modal的內(nèi)容 | 選填 | — |
formItems | Array | type='prompt' 時(shí)必填的表單項(xiàng)屬性,格式: [{label: '輸入框label', name: '鍵名', val: '初始值(可為空)'}, ...] | 選填 | [] |
reportSubmit | Boolean | type="prompt"時(shí) 是否返回 formId | 選填 | false |
觸發(fā)事件
eventName | 說明 |
---|---|
complete | modal完成時(shí)觸發(fā)的事件,e.detail.confirm 來判斷是取消還是確定,type='prompt' 時(shí)攜帶的數(shù)據(jù)包括e.detail.formData 和e.detail.formId ; type='getUserInfo' 時(shí)攜帶的數(shù)據(jù)為e.detail.hasUserInfo ,e.detail.userInfo ; type='openSetting' 時(shí)攜帶的數(shù)據(jù)為e.detail.authSetting ; 具體請(qǐng)看示例 |
注意事項(xiàng)
type = 'prompt'
時(shí),必須設(shè)置表單項(xiàng)屬性formItems="{{items}}"
;表單項(xiàng)屬性
formItems
格式如下:[{label: '請(qǐng)輸入姓名', name: 'name', val: '初始值(可為空)'}, {label: '請(qǐng)輸入郵箱', name: 'email'}, val: '']
提交后表單數(shù)據(jù)將重置為初始值
type='share'
頁(yè)面生命周期需聲明onShareAppMessage
,并且在內(nèi)部加上以下代碼,因?yàn)樽远x組件內(nèi)不能使用轉(zhuǎn)發(fā)回調(diào) 所以在這關(guān)閉模態(tài)框,不寫這個(gè) 模態(tài)框點(diǎn)擊轉(zhuǎn)發(fā)按鈕后將不會(huì)自動(dòng)關(guān)閉;
if (res.from === 'button') {
if (res.target.dataset.type === 'modalShare') {
this.setData({
showModal: false
})
}
}
type='getUserInfo'
時(shí),按需求來設(shè)定授權(quán)modal初始顯隱狀態(tài)。
建議:項(xiàng)目中先wx.getSetting
查看用戶是否已經(jīng)授權(quán),未授權(quán)showStatus初始設(shè)為true將主動(dòng)彈出該彈框,若已授權(quán)showStatus初始設(shè)為false避免多次彈出;
- 每個(gè)type攜帶的數(shù)據(jù)見上文代碼示例或下載以下完整示例。
示例Demo
微信小程序自定義組件使用示例整合
提取碼:28a2
相關(guān)案例查看更多
相關(guān)閱讀
- 云南網(wǎng)站建設(shè)公司排名
- 小程序定制開發(fā)
- 網(wǎng)站建設(shè)首選
- 云南小程序制作
- 報(bào)廢車回收管理系統(tǒng)
- 楚雄小程序開發(fā)
- 全國(guó)前十名小程序開發(fā)公司
- 云南網(wǎng)站建設(shè)一條龍
- 微信小程序
- 云南網(wǎng)站建設(shè)公司地址
- 百度小程序
- 云南小程序開發(fā)
- 海南小程序制作公司
- 開通微信小程序被騙
- 網(wǎng)站建設(shè)專業(yè)品牌
- 云南網(wǎng)站建設(shè)首選
- 報(bào)廢車拆解軟件
- web教程
- 網(wǎng)站建設(shè)百度官方
- 云南小程序被騙蔣軍
- 做網(wǎng)站
- 網(wǎng)站小程序
- 云南網(wǎng)站建設(shè)制作
- 云南網(wǎng)站建設(shè)靠譜公司
- 汽車報(bào)廢回收
- 云南省建設(shè)廳網(wǎng)站
- web前端
- 昆明小程序公司
- 網(wǎng)站建設(shè)案例
- 云南網(wǎng)站建設(shè)