(乾貨)微信小程式元件封裝

舊巷老友發表於2019-03-04

概述

自己封裝的一個比較簡單微信彈窗小元件,主要就是教會大家對微信小元件的用法和理解,因為微信小程式對元件介紹特別少,所以我就把自己的理解分享給大家。

一前言

相信大家在開發小程式時會遇到某個功能多次使用的情況,比如彈出框。這個時候大家首先想到的是元件化開發,就是把彈出框封裝成一個元件,然後哪裡使用哪裡就呼叫,對,看來大家都是有思路的人,但是要怎樣實現呢。可能你會去看官方文件,但是微信的官方文件也是說的不太清楚,所以寫起來也是非常痛苦。今天就和大家一起開發微信元件,坐穩了,老司機要開車了。

二具體實現

我們先實現個簡單的彈窗元件,詳情圖如下:

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();
  }
})複製程式碼

一個彈窗元件就完成了,看下效果:

如果覺得文章還不錯並對你有幫助的話,請分享給你的小夥伴,並點贊,有什麼不懂得可以在底下留言哦。
如果想看原始碼的話可以去我的github上下載,歡迎star,github:github.com/Mr-MengBo/M…

相關文章