【微信小程式】常用元件及自定義元件

BWH_Steven發表於2020-09-14

(一) 常用標籤

元件你可以理解為傳統頁面開發時候的各種標籤,例如 div span 等等,我這裡只說一些常用的,這樣就能能搭建出一個基本的頁面了,但是如果想要更加美觀以及擁有更好的體驗,就需要 WSS 和 別的一些強大的元件了,如果有額外的需求,可以去官方文件查閱一下 (同時不常用的屬性,也就不提了)

https://developers.weixin.qq.com/miniprogram/dev/component/

(1) view

view 可以理解為傳統頁面開發中的 div 塊級元素,使用 view 會換行

關於 view 標籤,還有一些額外的屬性,說的也很清楚,但是前期的話,其實不考慮這個也是可以的,就單純的當做一個佈局的 div 來用

屬性 型別 預設值 必填 說明 最低版本
hover-class string none 指定按下去的樣式類。當 hover-class="none" 時,沒有點選態效果 1.0.0
hover-stop-propagation boolean false 指定是否阻止本節點的祖先節點出現點選態 1.5.0
hover-start-time number 50 按住後多久出現點選態,單位毫秒 1.0.0
hover-stay-time number 400 手指鬆開後點選態保留時間,單位毫秒 1.0.0

(2) text

text 可以理解為傳統頁面中的 span 行內元素,text 不會換行

text 涉及的一些標籤

屬性 型別 預設值 必填 說明 最低版本
selectable boolean false 文字是否可選 1.1.0
space string 顯示連續空格 1.4.0
decode boolean false 是否解碼 1.4.0

space 的合法值

說明
ensp 中文字元空格一半大小
emsp 中文字元空格大小
nbsp 根據字型設定的空格大小

decode可以解析的有

  < > & '    

簡單測試一下其中兩個,可以看到,後者長按可以選擇文字,同時編碼被解析成空格,前者反之

<text selectable="{{false}}" decode="{{false}}">測&nbsp;試</text>
<text selectable="{{true}}" decode="{{true}}">測&nbsp;試</text>

(3) image

image 就是圖片相關的一個元件,這個元件預設寬度320px、⾼度240px,同時支援懶載入

我摘了三個比較常用的屬性出來

屬性 型別 預設值 必填 說明 最低版本
src string 圖片資源地址 1.0.0
mode string scaleToFill 圖片裁剪、縮放的模式 1.0.0
lazy-load boolean false 圖片懶載入,在即將進入一定範圍(上下三屏)時才開始載入 1.5.0

他作為圖片的一個承載物,我們重點多說一下關於 mode 的問題,也就是圖片的顯示形式

所以先來看一下,mode 的取值範圍(節選了相對常用的,其餘的取值都屬於裁剪型別)

說明 最低版本
scaleToFill 縮放模式,不保持縱橫比縮放圖片,使圖片的寬高完全拉伸至填滿 image 元素
aspectFit 縮放模式,保持縱橫比縮放圖片,使圖片的長邊能完全顯示出來。也就是說,可以完整地將圖片顯示出來。
aspectFill 縮放模式,保持縱橫比縮放圖片,只保證圖片的短邊能完全顯示出來。也就是說,圖片通常只在水平或垂直方向是完整的,另一個方向將會發生擷取。
widthFix 縮放模式,寬度不變,高度自動變化,保持原圖寬高比不變
heightFix 縮放模式,高度不變,寬度自動變化,保持原圖寬高比不變 2.10.3

比較常用是 widthFix,在這幾個其中,aspectFill 相對還是用的比較少的

(4) swiper

這個元件,是小程式頁面中的一個輪播圖的效果

swiper 是輪播圖的一個總的容器,swiper-item 代表其中的每一個內容,配合其屬性,能很方便的達到需要的樣式

同樣摘了幾個常見的屬性

屬性 型別 預設值 必填 說明 最低版本
indicator-dots boolean false 是否顯示皮膚指示點 1.0.0
indicator-color color rgba(0, 0, 0, .3) 指示點顏色 1.1.0
indicator-active-color color #000000 當前選中的指示點顏色 1.1.0
autoplay boolean false 是否自動切換 1.0.0
interval number 5000 自動切換時間間隔 1.0.0
duration number 500 滑動動畫時長 1.0.0
circular boolean false 是否採用銜接滑動 1.0.0
vertical boolean false 滑動方向是否為縱向 1.0.0

顯示比例問題

首先說明一下,swiper存在一些預設的樣式

  • width: 100%
  • height 150px

image 預設寬高

  • width: 320px
  • height: 240px

如果,swiper 的高度出現了問題,給出一個解決方式

先根據素材圖片的寬高比例,等比計算 swiper 的寬高,這樣高度就換算出來了

swiper 高度 = swiper 寬度 * 素材高度 / 素材寬度

即:height: 750rpx * 素材高度 / 素材寬度

來看個綜合一些的例子

WXML

圖片隨便自己做了兩張

<swiper autoplay="{{true}}" interval="5000" circular="{{true}}" indicator-dots="{{true}}"
    indicator-color="#D3D3D3" indicator-active-color="#FFFF00">
    <swiper-item><image mode="widthFix" src="../../image/swiperC.jpg"></image></swiper-item>
    <swiper-item><image mode="widthFix" src="../../image/swiperB.jpg"></image></swiper-item>
    <swiper-item><image mode="widthFix" src="../../image/swiperA.jpg"></image></swiper-item>
</swiper>

WXSS

swiper{
    width: 100%;
    height: calc(750rpx * 275 / 1000);
}

image{
    width: 100%;
}

看一下效果,現在就實現了輪播圖的效果,同時會5秒自動迴圈輪播,自己可以對照屬文件進行定製修改

(5) navigator

導航元件,這塊可以理解為傳統頁面開發的超連結標籤

屬性 型別 預設值 必填 說明 最低版本
target string self 在哪個目標上發生跳轉,預設當前小程式 2.0.7
url string 當前小程式內的跳轉連結 1.0.0
open-type string navigate 跳轉方式 1.0.0

open-type 的合法值

說明 最低版本
navigate 保留當前頁面,跳轉到應用內的某個頁面,但是不能跳到tabbar 頁面
redirect 關閉當前頁面,跳轉到應用內的某個頁面,但是不允許跳轉到tabbar 頁面
switchTab 跳轉到 tabBar 頁面,並關閉其他所有非 tabBar 頁面
reLaunch 關閉所有頁面,開啟到應用內的某個頁面 1.1.0
navigateBack 關閉當前頁面,返回上⼀頁面或多級頁面。可通過 getCurrentPages() 獲取當 1.1.0
exit 退出小程式,target=miniProgram時⽣效 2.1.0

下面給出一個測試的程式碼,預設不新增 open-type 的寫法會有一個返回上一層的

<navigator url="/pages/test06/test06">預設跳轉到test06</navigator>

<navigator open-type="redirect" url="/pages/test06/test06">redirect跳轉到test06</navigator>

<navigator open-type="switchTab" url="/pages/index/index">switchTab跳轉到主頁</navigator>

<navigator open-type="reLaunch" url="/pages/index/index">reLaunch跳轉到主頁</navigator>

(6) rich-text

這是一個富文字標籤,作用就是把字串中的對應標籤解析出來,其主要的一個屬性就是 nodes ,我們先簡單看一下 nodes的屬性有哪些

現支援兩種節點,通過type來區分,分別是元素節點和文字節點,預設是元素節點,在富文字區域裡顯示的HTML節點 元素節點:type = node

屬性 說明 型別 必填 備註
name 標籤名 string 支援部分受信任的 HTML 節點
attrs 屬性 object 支援部分受信任的屬性,遵循 Pascal 命名法
children 子節點列表 array 結構和 nodes 一致

來看一個例子,這個nodes 的值,我們去 js 中定義一個

<rich-text nodes="{{receive}}"></rich-text>

有兩種方式賦值,一種就是我註釋掉的那一行,直接使用一個含有標籤的字串,直接賦值就會解析,另一種就是通過後面這樣 JSON 的一種格式賦值,效果是一樣的

Page({
  data: {
    // receive:'<div class="div_class"><h3>理想二旬不止</h3></div>'
    receive:[{
      name:'div',
      attrs:{
        class:'div_class'
      },
      children:[{
        name:'h3',
        attrs:{},
        children:[{
          type:'text',
          text:'理想二旬不止'
        }]
      }]
    }] 
  },
})

(7) button

按鈕標籤,也算是非常常用的內容了,同時相比較傳統頁面開發中的按鈕,微信小程式中又有很多開放式的功能,首先看一些涉及的一些屬性(更多內容可以看官網文件):

https://developers.weixin.qq.com/miniprogram/dev/component/button.html

屬性 型別 預設值 必填 說明 最低版本
size string default 按鈕的大小 1.0.0
type string default 按鈕的樣式型別 1.0.0
plain boolean false 按鈕是否鏤空,背景色透明 1.0.0
disabled boolean false 是否禁用 1.0.0
loading boolean false 名稱前是否帶 loading 圖示 1.0.0
form-type string 用於 form 元件,點選分別會觸發 form 元件的 submit/reset 事件 1.0.0
open-type string 微信開放能力 1.10

size 的合法值

說明
default 預設大小
mini 小尺寸

type 的合法值

說明
primary 綠色
default 白色
warn 紅色

form-type 的合法值

說明 最低版本
submit 提交表單
reset 重置表單

open-type 的合法值

說明 最低版本
contact 開啟客服會話,如果使用者在會話中點選訊息卡片後返回小程式,可以從 bindcontact 回撥中獲得具體資訊 1.1.0
share 觸發使用者轉發,使用前建議先閱讀 1.2.0
getPhoneNumber 獲取使用者手機號,可以從bindgetphonenumber回撥中獲取到使用者資訊 1.2.0
getUserInfo 獲取使用者資訊,可以從bindgetuserinfo回撥中獲取到使用者資訊 1.3.0
launchApp 開啟APP,可以通過app-parameter屬性設定向APP傳的引數 1.9.5
openSetting 開啟授權設定頁 2.0.7
feedback 開啟“意見反饋”頁面,使用者可提交反饋內容並上傳日誌,開發者可以登入小程式管理後臺後進入左側選單“客服反饋”頁面獲取到反饋內容 2.1.0

這幾個程式碼就是通過 sizetype 進行基本的大小或者說型別實現一個樣式

<button style="width:100%">預設按鈕</button>
<button style="width:100%" size="mini">mini 預設按鈕</button>
<button style="width:100%" type="primary">primary 按鈕</button>
<button style="width:100%" type="warn">warn 按鈕</button>
<button style="width:100%" type="warn" plain>plain 按鈕</button>

下面就是一些開放的功能

<button style="width:100%" open-type="contact">聯絡客服</button>
<button style="width:100%" open-type="share">分享小程式</button>
<button style="width:100%" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">
    獲取電話號碼
</button>
<button style="width:100%" open-type="getUserInfo" bindgetuserinfo="getUserInfo">
    獲取使用者資訊
</button>
<button style="width:100%" open-type="launchApp">開啟App</button>
<button style="width:100%" open-type="openSetting">開啟授權設定頁</button>
<button style="width:100%" open-type="feedback">意見反饋</button>

需要說明的幾個點:

  • 聯絡客服這個功能只能在真機除錯,需要先在後臺繫結一個客服的微訊號碼,接著在開發工具中選擇真機除錯,然後掃描二維碼就可以了

  • 獲取電話號碼,以及使用者資訊,需要結合事件來做,例如:
Page({
  // 獲取使用者的手機號碼資訊
  getPhoneNumber(e){
    console.log(e);
  },
  // 獲取使用者個人資訊
  getUserInfo(e){
    console.log(e);
  }
})

例如獲取使用者資訊

但是電話號碼,不是企業的小程式賬號 沒有許可權來獲取使用者的手機號碼

  • 開啟App,是在 app 中 通過 app 的某個連結開啟小程式,然後在小程式 再通過這個功 重新開啟 app

  • 當前版本的微信小程式,在.wxss檔案裡設定Button寬度無效,網路上的一種解決方案就是把 app.json裡的 style: v2語句刪掉,還有一種就是像我程式碼中一樣,直接加 style,暫時推薦後者吧,此處未深究

(8) icon

微信小程式預設封裝了一些圖示,也很簡單,只有三個屬性

屬性 型別 預設值 必填 說明 最低版本
type string icon的型別,有效值:success, success_no_circle, info, warn, waiting, cancel, download, search, clear 1.0.0
size number/string 23 icon的大小 1.0.0
color string icon的顏色,同css的color 1.0.0

簡單用一下

<icon  type="success" size="50"> </icon>
<icon  type="success" size="50" color="#3390ff"> </icon>

如果不指定顏色,其預設都是有一定顏色樣式的,如果指定了 color 就會覆蓋掉原來的顏色

(9) radio

單選框元件,需要配合 radio-group 使用,下面看程式碼就明白了

屬性 型別 預設值 必填 說明 最低版本
value string radio標識。當該radio選中時,radio-group 的 change 事件會攜帶 radio 的 value 1.0.0
checked boolean false 當前是否選中 1.0.0
disabled boolean false 是否禁用 1.0.0
color string #09BB07 radio的顏色,同css的color 1.0.0

簡單用一下,

<radio-group bindchange="handleChange">
  <radio color="blue" value="male">男</radio>
  <radio color="blue" value="female" >女</radio>
</radio-group>

<view>你選擇的性別是:{{gender}}</view>

js 內容,至於 e.detail.value 如何來的,可以通過 console.log(e) 列印看到

Page({
  data: {
    gender: ""
  },
  handleChange(e){
    // 獲取單選框中的值
    let gender=e.detail.value;
    // 把值 賦值給 data中的資料
    this.setData({
      gender
    })
  }
})

(10) checkbox

屬性 型別 預設值 必填 說明 最低版本
value string checkbox 標識,選中時觸發 checkbox-group 的 change 事件,並攜帶 checkbox 的 value 1.0.0
disabled boolean false 是否禁用 1.0.0
checked boolean false 當前是否選中,可用來設定預設選中 1.0.0
color string #09BB07 checkbox的顏色,同css的color 1.0.0

直接用一下

<view>
  <checkbox-group bindchange="handleItemChange">
    <checkbox value="{{item.value}}" wx:for="{{list}}" wx:key="id">
      {{item.name}}
    </checkbox>
  </checkbox-group>
  <view>
    選中的內容:{{checkedList}}
  </view>
</view>
Page({
  data: {
    list:[
      {
        id:0,
        name:"?️",
        value:"太陽"
      },
      {
        id:1,
        name:"?",
        value:"月亮"
      },
      {
        id:2,
        name:"⭐️",
        value:"星星"
      }
    ],
    checkedList:[]
  },
  // 核取方塊的選中事件
  handleItemChange(e){
    // 獲取被選中的核取方塊的值
    const checkedList=e.detail.value;
    // 進行賦值
    this.setData({
      checkedList
    })
  }
})

執行結果:

(二) 自定義元件(標籤)

(1) 快速體驗

如果我們想要自定義一些元件,也就是說將一些程式碼抽離出來,可以達到複用等的效果

我們一步一步舉個例子:

首先建立資料夾目錄 components/header

接著右鍵建立元件 header,點選新建 Component

結構就是這樣的

一般點選建立元件的方式會自動將元件的 json 檔案中宣告元件,如果沒有需要自己手動修改component 為 true

{
  "component": true,
}

接著在元件WXML中隨便寫點東西,然後開啟想要引用元件的頁面,首先在 json 中說明引用元件

{
  "usingComponents": {
    "header":"/../../components/header/header"
  }
}

然後直接引用就可以了,效果就出來了

<header></header>

(2) 元件傳參

元件傳參有兩個方向,一個是父元件 --> 子元件 ,還有就是反過來。注:父元件是頁面,子元件是自定義元件

  • ⽗元件通過屬性的⽅式給⼦元件傳遞引數

  • 元件通過事件的⽅式向⽗元件傳遞引數

通過一個例子來演示

在上面結構上自己寫一個自定義的元件,一個導航條的效果

自定義元件的頁面程式碼

<!-- components/header/header.wxml -->
<view class="header">
    <view class="header_tabs_title">
        <view wx:for="{{headerTabs}}" 
        wx:key="id" 
        class="header_tabs_title_item {{item.isActive?'active':''}}"
        bindtap="hanldeItemTap"
        data-index="{{index}}"
        >
            {{item.name}}
        </view>
    </view>
</view>

自定義元件的樣式檔案如下

/* components/header/header.wxss */
.header_tabs_title{
    display: flex;
    padding: 10px;
}
.header_tabs_title_item{
    flex: 1;
    display: flex;
    justify-content: center;
    align-items: center;
}

.active{
    color:blue;
    border-bottom: 5rpx solid currentColor;
}

自定義元件的 js檔案,在 properties 中的內容,就是接收到父(頁面)的資料,也就是一個關於導航的陣列,其中包括首頁測試關於等等導航文字內容

  • headerTabs的位置:要接受的名稱,自己定

  • type:要接收的資料的型別

  • value:預設值

而下面的方法就是關於父傳資料到子元件的內容,其代表觸發父元件中的自定義事件,同時傳遞資料給 父元件

// components/header/header.js
Component({
  /**
   * 元件的屬性列表
   */
  properties: {
    headerTabs:{
      type:Array,
      value:[]
    }
  },

  /**
   * 元件的初始資料
   */
  data: {

  },

  /**
   * 元件的方法列表
   */
  methods: {
    hanldeItemTap(e){
      const {index}=e.currentTarget.dataset;
      // 觸發父元件中的自定義事件 同時傳遞資料給  
      this.triggerEvent("itemChange",{index});
    }
  }
})

補充:e.currentTarget.dataset; 是怎麼來的,還是老辦法,console 列印一下

父頁面

繫結一個事件,同時把等會再 js 中的定義資料,傳遞到自定義元件中去,名稱就是剛才接收的 headerTabs

<header headerTabs="{{headerTabs}}" binditemChange="handleItemChange" ></header>

父頁面的 js

說明:let { headerTabs } = this.data; 這是 ES6 的寫法,也可以寫成

let headerTabs = this.data.headerTabs;

遍歷陣列的時候 修改了 v ,就把源陣列也修改了

目的就是通過點選修改定義導航中的 isActive 為 true 或 false

// pages/test08/test08.js
Page({

  /**
   * 頁面的初始資料
   */
  data: {
    headerTabs:[
      {
        id:0,
        name:"首頁",
        isActive:true
      },
      {
        id:1,
        name:"測試",
        isActive:false
      },
      {
        id:2,
        name:"測試",
        isActive:false
      },
      {
        id:3,
        name:"關於",
        isActive:false
      },
    ]
  },
  // 自定義事件 用來接收子元件傳遞的資料的
  handleItemChange(e) {
    // 接收傳遞過來的引數
    const { index } = e.detail;
    let { headerTabs } = this.data;
    headerTabs.forEach((v, i) => i === index ? v.isActive = true : v.isActive = false);
    this.setData({
      headerTabs
    })
  }
})

結尾

如果文章中有什麼不足,歡迎大家留言交流,感謝朋友們的支援!

如果能幫到你的話,那就來關注我吧!如果您更喜歡微信文章的閱讀方式,可以關注我的公眾號

在這裡的我們素不相識,卻都在為了自己的夢而努力 ❤

一個堅持推送原創開發技術文章的公眾號:理想二旬不止

相關文章