概述
自己封裝的一個比較簡單微信彈窗小元件,主要就是教會大家對微信小元件的用法和理解,因為微信小程式對元件介紹特別少,所以我就把自己的理解分享給大家。
一前言
相信大家在開發小程式時會遇到某個功能多次使用的情況,比如彈出框。這個時候大家首先想到的是元件化開發,就是把彈出框封裝成一個元件,然後哪裡使用哪裡就呼叫,對,看來大家都是有思路的人,但是要怎樣實現呢。可能你會去看官方文件,但是微信的官方文件也是說的不太清楚,所以寫起來也是非常痛苦。今天就和大家一起開發微信元件,坐穩了,老司機要開車了。
二具體實現
我們先實現個簡單的彈窗元件,詳情圖如下:
1.新建component資料夾存放我們的元件,裡邊存放的就是我們所用的元件,我們今天要做的事彈出框,新建資料夾popup存放我們的元件模板,點選右鍵選擇新建component,就會自動生成元件的模板wxss、wxml、json、js,如圖
2.我們可以寫一些元件樣式和佈局,跟頁面寫法類似,我就不多說了,直接把程式碼貼出 :
popup.wxml
<view class="wx-popup" hidden="{{flag}}">
<view class=`popup-container`>
<view class="wx-popup-title">{{title}}</view>
<view class="wx-popup-con">{{content}}</view>
<view class="wx-popup-btn">
<text class="btn-no" bindtap=`_error`>{{btn_no}}</text>
<text class="btn-ok" bindtap=`_success`>{{btn_ok}}</text>
</view>
</view>
</view>複製程式碼
popup.wxss
/* component/popup.wxss */
.wx-popup {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, .5);
}
.popup-container {
position: absolute;
left: 50%;
top: 50%;
width: 80%;
max-width: 600rpx;
border: 2rpx solid #ccc;
border-radius: 10rpx;
box-sizing: bordre-box;
transform: translate(-50%, -50%);
overflow: hidden;
background: #fff;
}
.wx-popup-title {
width: 100%;
padding: 20rpx;
text-align: center;
font-size: 40rpx;
border-bottom: 2rpx solid red;
}
.wx-popup-con {
margin: 60rpx 10rpx;
text-align: center;
}
.wx-popup-btn {
display: flex;
justify-content: space-around;
margin-bottom: 40rpx;
}
.wx-popup-btn text {
display: flex;
align-items: center;
justify-content: center;
width: 30%;
height: 88rpx;
border: 2rpx solid #ccc;
border-radius: 88rpx;
}
複製程式碼
樣式和佈局和佈局已經寫好了接下來要介紹的就是
Component構造器
Component構造器可用於定義元件,呼叫Component構造器時可以指定元件的屬性、資料、方法等。
定義段 | 型別 | 是否必填 | 描述 |
---|---|---|---|
properties | Object Map | 否 | 元件的對外屬性,是屬性名到屬性設定的對映表,屬性設定中可包含三個欄位, type 表示屬性型別、 value 表示屬性初始值、 observer 表示屬性值被更改時的響應函式 |
data | Object | 否 | 元件的內部資料,和 properties 一同用於元件的模版渲染 |
methods | Object | 否 | 元件的方法,包括事件響應函式和任意的自定義方法,關於事件響應函式的使用,參見 元件事件 |
behaviors | String Array | 否 | 類似於mixins和traits的元件間程式碼複用機制,參見 behaviors |
created | Function | 否 | 元件生命週期函式,在元件例項進入頁面節點樹時執行,注意此時不能呼叫 setData |
attached | Function | 否 | 元件生命週期函式,在元件例項進入頁面節點樹時執行 |
ready | Function | 否 | 元件生命週期函式,在元件佈局完成後執行,此時可以獲取節點資訊(使用 SelectorQuery ) |
moved | Function | 否 | 元件生命週期函式,在元件例項被移動到節點樹另一個位置時執行 |
detached | Function | 否 | 元件生命週期函式,在元件例項被從頁面節點樹移除時執行 |
relations | Object | 否 | 元件間關係定義,參見 元件間關係 |
externalClasses | String Array | 否 | 元件接受的外部樣式類,參見 外部樣式類 |
options | Object Map | 否 | 一些元件選項,請參見文件其他部分的說明 |
Tips:
Component
構造器構造的元件也可以作為頁面使用。- 使用
this.data
可以獲取內部資料和屬性值,但不要直接修改它們,應使用setData
修改。 - 生命週期函式無法在元件方法中通過
this
訪問到。 - 屬性名應避免以 data 開頭,即不要命名成
dataXyz
這樣的形式,因為在 WXML 中,data-xyz=""
會被作為節點 dataset 來處理,而不是元件屬性。 - 在一個元件的定義和使用時,元件的屬性名和data欄位相互間都不能衝突(儘管它們位於不同的定義段中)。
component介紹完後就是最為關鍵的js了
popup.js:
Component({
options: {
multipleSlots: true // 在元件定義時的選項中啟用多slot支援
},
/**
* 元件的屬性列表
*/
properties: {
title: { // 屬性名
type: String, // 型別(必填),目前接受的型別包括:String, Number, Boolean, Object, Array, null(表示任意型別)
value: `標題` // 屬性初始值(可選),如果未指定則會根據型別選擇一個
},
// 彈窗內容
content: {
type: String,
value: `內容`
},
// 彈窗取消按鈕文字
btn_no: {
type: String,
value: `取消`
},
// 彈窗確認按鈕文字
btn_ok: {
type: String,
value: `確定`
}
},
/**
* 元件的初始資料
*/
data: {
flag: true,
},
/**
* 元件的方法列表
*/
methods: {
//隱藏彈框
hidePopup: function () {
this.setData({
flag: !this.data.flag
})
},
//展示彈框
showPopup () {
this.setData({
flag: !this.data.flag
})
},
/*
* 內部私有方法建議以下劃線開頭
* triggerEvent 用於觸發事件
*/
_error () {
//觸發取消回撥
this.triggerEvent("error")
},
_success () {
//觸發成功回撥
this.triggerEvent("success");
}
}
})複製程式碼
上邊會用到一個triggerEvent下面我們就來介紹下:
自定義元件觸發事件時,需要使用 triggerEvent
方法,指定事件名、detail物件和事件選項。
觸發事件的選項包括:
選項名 | 型別 | 是否必填 | 預設值 | 描述 |
---|---|---|---|---|
bubbles | Boolean | 否 | false | 事件是否冒泡 |
composed | Boolean | 否 | false | 事件是否可以穿越元件邊界,為false時,事件將只能在引用元件的節點樹上觸發,不進入其他任何元件內部 |
capturePhase | Boolean | 否 | false | 事件是否擁有捕獲階段 |
現在一個彈窗的元件就封裝好了接下來就是呼叫了。
呼叫的時候需要在呼叫的頁面新建一個json檔案,json檔案裡需要配置usingComponents就是引用元件,看程式碼:
index.json
{
"usingComponents": {
"popup": "/component/popup/popup"
}
}複製程式碼
現在基本上完成了需要的就是在首頁引用了。
<!--index.wxml-->
<view class="container">
<view class="userinfo">
<button bindtap="showPopup"> 點我 </button>
</view>
<popup id=`popup`
title=`小元件`
content=`學會了嗎`
btn_no=`沒有`
btn_ok=`學會了`
bind:error="_error"
bind:success="_success">
</popup>
</view>複製程式碼
配置index.js加上點選事件
//index.js
//獲取應用例項
const app = getApp()
Page({
onReady: function () {
//獲得popup元件
this.popup = this.selectComponent("#popup");
},
showPopup() {
this.popup.showPopup();
},
//取消事件
_error() {
console.log(`你點選了取消`);
this.popup.hidePopup();
},
//確認事件
_success() {
console.log(`你點選了確定`);
this.popup.hidePopup();
}
})複製程式碼
一個彈窗元件就完成了,看下效果: