微信小程式 常用元件
這裡介紹一點值得記錄的例子,最後寫一個稍複雜的介面總結
tabBar(導航欄)
程式碼:
{
"pages": [
"pages/index/index",
"pages/logs/logs"
],
"window": {
"backgroundTextStyle": "light",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "WeChat",
"navigationBarTextStyle": "black"
},
"tabBar ": {
"color": "#000000",
"selectedColor": "red",
"backgroundColor": "yellow",
"borderStyle": "black",
"position": "top",
"list": [
{
"pagePath": "pages/index/index",
"text": "首頁",
"iconPath": "images/icon1.png",
"selectedIconPath": "images/icon1s.png"
},
{
"pagePath": "pages/logs/logs",
"text": "日誌",
"iconPath": "images/icon2.png",
"selectedIconPath": "images/icon2s.png"
}
]
}
}
顯示及目錄結構如下(色調比較醜,能分析問題要緊…哈哈我就是懶)
tabBar屬性:
- color:tab 上的文字預設顏色
- selectedColor:tab 上的文字選中時的顏色
- backgroundColor:tab 的背景色
- borderStyle:tabbar上邊框的顏色, 僅支援 black/white
- list:tab 的列表
- position:導航欄的位置
list屬性
- pagePath:頁面路徑,必須在 pages 中先定義
- text:tab 上按鈕文字
- iconPath:預設圖片路徑
- selectedIconPath:選中時的圖片路徑
注意:
- tabBar需要在app.json裡配置
- tabBar 中的 list 是一個數組,只能配置最少2個、最多5個 tab,tab 按陣列的順序排序
- 細心的同學發現沒有,我們配置的圖示並沒有顯示出來?是因為position屬性只有為bottom時才顯示圖示,寫寫試試吧
- list裡必須包含啟動頁(即app.json的pages節點下的一個元素),tabBar的設定才有效
textview限制文字顯示多行,多餘的用…代替
-webkit-line-clamp 是一個 不規範的屬性(unsupported WebKit property),它沒有出現在 CSS 規範草案中。
限制在一個塊元素顯示的文字的行數。 為了實現該效果,它需要組合其他外來的WebKit屬性。常見結合屬性:
- display: -webkit-box:必須結合的屬性 ,將物件作為彈性伸縮盒子模型顯示 。
- -webkit-box-orient: 必須結合的屬性 ,設定或檢索伸縮盒物件的子元素的排列方式 。
- text-overflow:可以用來多行文字的情況下,用省略號“…”隱藏超出範圍的文字 。
- -webkit-line-clamp: number用於顯示的行數
- -webkit-box-orient 預設是水平的,當值設為vertical時為垂直排列
overflow : hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
swiper (輪播圖)
wxml中:
<swiper indicator-dots="true" autoplay="true" interval="5000" duration="1000" style='width: 100%'>
<swiper-item wx:for="{{imgUrls}}" wx:for-item="imgItem">
<image src='{{imgItem}}' class="slide-image" width="355" height="150" />
</swiper-item>
</swiper>
.js中
data: {
text: null,
imgUrls: [
'http://img02.tooopen.com/images/20150928/tooopen_sy_143912755726.jpg',
'http://img06.tooopen.com/images/20160818/tooopen_sy_175866434296.jpg',
'http://img06.tooopen.com/images/20160818/tooopen_sy_175833047715.jpg'
]
}
...
看下效果:
上面用到了wx:for即列表渲染,在元件上使用 wx:for 控制屬性繫結一個數組,即可使用陣列中各項的資料重複渲染該元件。
預設陣列的當前項的下標變數名預設為 index,陣列當前項的變數名預設為 item。
- 使用 wx:for-item 可以指定陣列當前元素的變數名
- 使用 wx:for-index 可以指定陣列當前下標的變數名
如上我們改變預設下表變數名item->imgItem
我們繫結的陣列可以在對應的.js中data下設定,即可將檢視和資料繫結。
是時候來介紹下swiper的常用屬性了,當然還有其他的屬性,敬請查閱官方文件
常用屬性
- indicator-dots Boolean 是否顯示面板指示點
- autoplay Boolean 是否自動切換
- interval Number 自動切換時間間隔
- duration Number 滑動動畫時長
form (表單)
wxml:表單裡有輸入框、滑動選擇器、開關和提交表單重置表單按鈕
<form bindsubmit='formSubmit' bindreset='formReset'>
<input name='input' placeholder='請輸入內容'>{{inputText}}</input>
<slider name='slider' value='{{sliderValue}}'></slider>
<switch name='switch' checked='{{isChecked}}'></switch>
<button form-type='submit'>提交表單</button>
<button form-type='reset'>重置表單</button>
</form>
form的兩個屬性:
- bindsubmit 表單提交時會攜帶 form 中的資料觸發其繫結的函式
- bindreset 表單重置時會觸發 reset 事件
提交表單時,需要在表單元件中加上 name 來作為 key
.js
Page({
/**
* 頁面的初始資料
*/
data: {
inputText: '',
sliderValue: 0,
isChecked: false,
},
//表單提交
formSubmit: function (event) {
//列印日誌
console.log(event)
},
//表單重置
formReset: function (event) {
console.log(event)
}
})
輸入一些內容,並改變slider和開關的狀態,提交表單看列印的日誌如下
可以看到input,slider,switch是元件的name屬性,被當做key提交
點選reset,可以看到表單中的元件狀態被重置
ActionSheet(底部彈出框)
先學習下bindtap屬性,就是點選事件,當元件被點選時,會觸發繫結的函式。
wxml:
簡單介紹下:點選按鈕時,action-sheet即底部彈出框顯示,其中的action-sheet-item為彈出框的條目,最後一個條目為action-sheet-cancel,顧名思義,此條目用於取消操作,其外觀會和其它條目不同,會觸發action-sheet的bindchange事件(點選彈出框外面空白地方也會觸發bindchange事件),點選每一個條目(包括取消)時,將action-sheet隱藏。
<button bindtap='showActionSheet'>showActionSheet</button>
<action-sheet hidden="{{actionSheetHidden}}" bindchange="actionSheetChange">
<action-sheet-item bindtap="actionSheetItem" data-name="name1" data-value='我是第1條資料'>item1</action-sheet-item>
<action-sheet-item bindtap="actionSheetItem" data-name="name2" data-value='我是第2條資料'>item2</action-sheet-item>
<action-sheet-item bindtap="actionSheetItem" data-name="name3" data-value='我是第3條資料'>item3</action-sheet-item>
<action-sheet-cancel bindtap="actionSheetItem" data-name="cancel" data-value='我是取消'>取消</action-sheet-cancel>
</action-sheet>
.js
Page({
/**
* 頁面的初始資料
*/
data: {
actionSheetHidden: true,
},
//顯示action-sheet
showActionSheet: function () {
this.setData({ actionSheetHidden: false })
},
//點選取消
actionSheetChange: function () {
console.log("actionSheetChange")
this.setData({ actionSheetHidden: true })
},
//條目點選事件
actionSheetItem: function (event) {
console.log(event)
this.setData({ actionSheetHidden: true })
}
})
先點選按鈕,讓action-sheet顯示
點選item1,會觸發actionSheetItem函式,看下actionSheetItem函式中列印的日誌:
可以看到條目1中攜帶的資料name和value傳到了actionSheetItem的引數中,真實案例中就可以拿到被點選條目的資料,進行下一步的操作了
回到上一步,再看看點選取消會有什麼不同吧
注意看,我們先打印出actionSheetChange日誌,可以得出,當點選取消時,先被觸發的時action-sheet的bindchange函式,然後才執行的取消條目的bindtap函式,同時可以也可以拿到取消條目所傳遞的資料,但取消一般是不怎麼需要的。
modal:(對話方塊)
wxml:
點選按鈕顯示對話方塊,點選確認按鈕或取消按鈕隱藏對話方塊
<button bindtap='modalShow'>modalShow</button>
<modal title='我是標題' confirm-text='確認' cancle-text='取消' hidden="{{modalHidden}}" bindconfirm="modalConfirm" bindcancel="modalCancel">我是內容</modal>
.js
Page({
/**
* 頁面的初始資料
*/
data: {
modalHidden: true,
},
modalShow: function () {
this.setData({ modalHidden: false })
},
modalConfirm: function () {
this.setData({ modalHidden: true })
},
modalCancel: function () {
this.setData({ modalHidden: true })
}
})
看下顯示結果吧:
很簡單,還是先介紹下屬性吧
- title 標題
- confirm-text 確認按鈕上的字
- cancle-text 取消按鈕上的字
- bindconfirm 點選確認時觸發的事件
- bindcancel 點選取消時觸發的事件
toast(吐司)
wxml:
點選按鈕顯示吐司,本例中吐司的持續時間為2秒,2秒後會觸發bindchange函式,手動隱藏toast(其中的duration為吐司的持續時間)
<button bindtap='toastShow'>toastShow</button>
<toast hidden="{{toastHidden}}" bindchange="toastChange" duration="2000">我是吐司</toast>
.js
Page({
/**
* 頁面的初始資料
*/
data: {
toastHidden: true,
},
//點選按鈕
toastShow: function () {
this.setData({ toastHidden: false })
},
//吐司的持續時間到了自動觸發
toastChange: function () {
this.setData({ toastHidden: true })
}
})
看下效果吧,屬性就不再介紹咯
loading(載入框)
wxml:
點選按鈕顯示載入框,模擬資料請求,兩秒後隱藏載入框(不同於toast,沒有duration屬性)
<button bindtap='loadingShow'>loadingShow</button>
<loading hidden="{{loadingHidden}}">載入中...</loading>
.js
Page({
/**
* 頁面的初始資料
*/
data: {
loadingHidden: true,
},
loadingShow: function () {
this.setData({ loadingHidden: false })
var that = this
setTimeout(function () {
that.setData({
loadingHidden: true
})
}, 2000)
}
})
其實目前的微信公眾平臺元件列表已經沒有上述的四個元件了,我們可以呼叫微信的api來使用以上四個操作反饋元件,就不多分析了,直接上程式碼吧。
wxml:
<button bindtap="showToast">showToast</button>
<button bindtap="showLoading">showLoading</button>
<button bindtap='showModal'>showModal</button>
<button bindtap='showActionSheet'>showActionSheet</button>
.js
Page({
/**
* 頁面的初始資料
*/
data: {
},
//展示吐司
showToast: function () {
wx.showToast({
title: '我是吐司',
duration: 2000,
icon: "loading"
})
},
//展示等待框,請求資料完成後需要手動呼叫wx.hideLoading()隱藏
showLoading: function () {
wx.showLoading({
title: '我是loading',
})
setTimeout(function () {
wx.hideLoading()
}, 2000);
},
//展示對話方塊
showModal: function () {
wx.showModal({
title: '提示',
content: '這是一個對話方塊',
success: function (res) {
if (res.confirm) {
console.log('使用者點選確定')
} else if (res.cancel) {
console.log('使用者點選取消')
}
}
})
},
//顯示操作選單
showActionSheet: function () {
wx.showActionSheet({
itemList: ['A', 'B', 'C'],
//使用者點選的按鈕,從上到下的順序,從0開始
success: function (res) {
console.log("success" + res.tapIndex)
},
//點選取消會走fail
fail: function (res) {
console.log("fail" + res.errMsg)
}
})
}
})
實現gridview效果
實現思路:
- 定義父容器佈局方式為flex,主軸方向為由左往右,flex-wrap為wrap,當條目顯示不下時,就會換行顯示從而實現gridview效果
- 我是案例背景框居於條目底部,採用絕對定位的方式(絕對定位的元素時相對離它最近的一個已定位的父級元素進行定位),那我們需要讓它的父佈局即條目view 已定位(條目view的position:relative),然後給bottom為0就好了
其它的就沒什麼了,程式碼如下:
效果:
wxml:
<view class='case'>
<view class='case-head'>
<view class='case-head-line'></view>
<text class='case-head-point'>·</text>
<text class='case-head-text'>案例</text>
<text class='case-head-point'>·</text>
<view class='case-head-line'></view>
</view>
<view class='case-list'>
<view class='case-item' wx:for="{{caseList}}">
<image class='case-item-image'>
</image>
<view class='case-item-bottom'>
<text class='case-item-text'>我是案例</text>
</view>
</view>
</view>
</view>
wxss:
/*頁面 */
.case {
width: 100%;
height: 100vh;
display: flex;
flex-direction: column;
}
/*案例 頭部父佈局 */
.case-head {
width: 100%;
height: 80rpx;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-items: center;
justify-content: space-between;
font-size: 10;
}
/*案例 頭部線 */
.case-head-line {
width: 260rpx;
height: 3rpx;
background-color: #3791ca;
}
/*案例 頭部點 */
.case-head-point {
font-size: 30pt;
color: #3791ca;
}
/*案例 頭部文字 */
.case-head-text {
font-size: 11pt;
color: #3791ca;
}
/*案例 列表 */
.case-list {
width: 100%;
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-around;
}
/*案例 列表條目 */
.case-item {
width: 350rpx;
height: 200rpx;
margin-top: 20rpx;
background-color: red;
display: flex;
position: relative;
flex-direction: column;
}
/*案例 列表條目中圖片 */
.case-item-image {
width: 350rpx;
height: 200rpx;
}
/*案例 列表條目底部佈局 */
.case-item-bottom {
width: 100%;
height: 50rpx;
background-color: #636363;
position: absolute;
bottom: 0;
display: flex;
opacity: 0.9;
flex-direction: row;
justify-content: center;
align-items: center;
}
/*案例 列表條目中文字 */
.case-item-text {
font-size: 9pt;
color: white;
}
.js:
Page({
/**
* 頁面的初始資料
*/
data: {
caseList: ["", "", "", "", "", "", "", "", "", "", "", "", "", ""]
},
})
綜合專案
需求:
開啟小程式顯示首頁,點選個人中心判斷appData中是否有個人資訊,若有則展示,若無則跳轉到登入頁面,登入頁面加相關邏輯判斷,輸入使用者名稱密碼成功後(本例不為空即為成功)儲存使用者資訊到appData中,跳轉到個人中心介面。
貼幾張專案的效果圖: