程式架構:包括邏輯層、視圖層和flex模型。邏輯層由javascript編寫,視圖層由WXML和WXSS配合元件組成,flex布局確定頁面适應不同螢幕尺寸時在恰當的位置。本篇主要介紹視圖層。
邏輯層介紹見https://blog.csdn.net/maidu_xbd/article/details/102491766
flex布局介紹見https://blog.csdn.net/maidu_xbd/article/details/102566583
1.WXML(WeiXin Markup Language)微信标記語言
WXML是架構設計的一套标簽語言,結合基礎元件+自定義元件;可以建構出頁面的結構。
- (1)資料綁定:簡單綁定 ,組合屬性綁定,控制屬性綁定,運算綁定,組合綁定,依次如下。
<view>{{msg}}</view>
<view id='{{id}}'></view>
<view wx:if='{{age>=18}}'>成年人</view> //控制屬性綁定
<view wx:if='{{true}}'>為true顯示</view> //控制屬性綁定
<view>{{a+b}}</view>
<view wx:for='{{[1,2,array]}}'>{{item}}</view>
- (2)清單渲染---【wx:for】
【buding.wxml】
<view wx:for='{{student}}' wx:key='student{{index}}'>
<view>學生{{index+1}}:{{item}}</view>
</view>
【buding.js】
Page({
/**
* 頁面的初始資料
*/
data: {
student:['小李','Tom','Sarry']
}
})
- (3)條件渲染---【wx:if="{{condition}}"】
【buding.wxml】
<view wx:if="{{age<18}}">青少年</view>
<view wx:elif="{{age>=18 && age<35}}">青壯年</view>
<view wx:elif="{{age>=35 && age<55}}">中年</view>
<view wx:else>老年</view>
【buding.js】
Page({
/**
* 頁面的初始資料
*/
data: {
age:36
}
})
wx:if與hidden:均可以控制元件的顯示與隐藏,差別在于wx:if是惰性的,如果初始渲染條件為false,架構什麼也不做,在條件第一次變成true時才開始局部渲染,具有更高的切換消耗。而hidden無論條件為true或false,初始就會被渲染,具有更高的初始消耗。是以,如果需要頻繁的切換元件,用hidden更好;如果在運作時條件很少發生改變,則使用wx:if更好。
- (4)模闆--【<template>】
is屬性用于指定正确的模闆名稱才能成功引用,引用<template>标簽必須帶有is屬性
<template name="myTemp">
<view wx:for="{{student}}" wx:key="student{{index}}">
<view>學生{{index+1}}:{{item}}</view>
</view>
</template>
<template is="myTemp" data="{{student}}"></template>
- (5)事件:事件是視圖層到邏輯層的通信方式,特點有①可以将使用者的行為回報到邏輯層進行處理;②可以綁定在元件上,當觸發事件就會執行對應的事件處理函數;③對象可以攜帶額外資訊,例如id,dataset,touches。
---事件使用---
//buding.wxml
<button id="myBtn" bindtap="myTap">按鈕</button>
//buding.js
Page({
myTap:function(e){
console.log(e)
}
})
控制台輸出如下
---事件分類---
事件分為冒泡事件和非冒泡事件。
冒泡事件:當一個元件上的事件被觸發後,該事件會向父節點傳遞,由内向外傳遞。
非冒泡事件:當一個元件上的事件被觸發後,該事件不會向父節點傳遞。
WXML中支援的冒泡事件
類型 | 觸發條件 |
touchstart | 手指觸摸動作開始 |
touchmove | 手指觸摸後移動 |
touchcancel | 手指觸摸動作被打斷,如來電提醒,彈窗 |
touchend | 手指觸摸動作結束 |
tap | 手指觸摸後馬上離開 |
longpress | 手指觸摸後,超過350ms再離開,如果指定了事件回調函數并觸發了這個事件,tap事件将不被觸發 |
longtap | 手指觸摸後,超過350ms再離開(推薦使用longpress事件代替) |
transitionend | 會在 WXSS transition 或 wx.createAnimation 動畫結束後觸發 |
animationstart | 會在一個 WXSS animation 動畫開始時觸發 |
animationiteration | 會在一個 WXSS animation 一次疊代結束時觸發 |
animationend | 會在一個 WXSS animation 動畫完成時觸發 |
---事件綁定和冒泡---
事件綁定的寫法同元件的屬性,都是以 key=value 的形式。
- 1)key 以bind或catch開頭,然後跟事件的類型,如bindtap、catchtouchstart。自基礎庫版本 1.5.0 起,bind和catch後可以緊跟一個冒号,其含義不變,如bind:tap、catch:touchstart。
- 2)value 是一個字元串,需要在對應的 Page 中定義同名的函數,不然當觸發事件的時候會報錯。
bind事件和catch事件的差別:bind事件綁定不會阻止冒泡事件向上冒泡;catch事件綁定可以阻止冒泡事件向上冒泡。
【wxml】
<view>事件冒泡-bind事件綁定不會阻止冒泡事件向上冒泡</view>
<view class="outBox" bindtap="onOutBoxClick">
<view class="innerBox" bindtap="onInnerBoxClick">
</view>
</view>
【wxss】
.outBox{
margin:0 auto;
width: 200px;
height: 200px;
background: rgb(110, 110, 201);
padding:50px;
box-sizing: border-box;
}
.innerBox{
width: 100px;
height: 100px;
background: rgb(113, 201, 110);
}
【js】
Page({
onInnerBoxClick:function(e){
console.log("内層盒子被點選了")
},
onOutBoxClick:function(e){
console.log("外層盒子被點選了")
}
})
當把【<view class="innerBox" bindtap="onInnerBoxClick">】替換為【<view class="innerBox" catchtap="onInnerBoxClick">】,則點選内層盒子,控制台隻輸出“内層盒子被點選了”,因為catch事件綁定可以阻止冒泡事件向上冒泡。
---事件的捕獲階段---
自基礎庫版本 1.5.0 起,觸摸類事件支援捕獲階段。可以在元件的冒泡事件被觸發前進行事件的捕獲。捕獲階段事件的順序與冒泡階段完全相反,由外向内進行捕獲。采用
capture-bind
、
capture-catch
進行捕獲,
capture-catch會
中斷捕獲和取消冒泡。捕獲的優先級大于冒泡。
示例
<view id="A" bindtap="tap1" capture-bind:tap="tap2">
view A
<view id="B" bindtap="tap3" capture-bind:tap="tap4">
view B
</view>
</view>
如果如果單擊【view A】先後調用tap2,tap1
如果單擊【view B】先後調用tap2,tap4,tap3,tap1,如下
如果把圖中28行的“capture-bind”替換為“capture-catch”,則隻會觸發tap2,捕獲被中斷,冒泡被取消。
---事件對象---
事件對象分為基礎事件(BaseEvent)、自定義事件(CustomEvent)、觸摸事件(TouchEvent)
基礎事件(BaseEvent)對象屬性清單
屬性 | 類型 | 說明 |
type | String | 事件類型 |
timeStamp | Integer | 事件生成時的時間戳 |
target | Object | 觸發事件的元件的一些屬性值集合 |
currentTarget | Object | 目前元件的一些屬性值集合 |
自定義事件(CustomEvent)對象屬性清單:
屬性 | 類型 | 說明 |
detail | Object | 額外的資訊 |
觸摸事件(TouchEvent)對象屬性清單:
屬性 | 類型 | 說明 |
touches | Array | 觸摸事件,目前停留在螢幕中的觸摸點資訊的數組 |
changedTouches | Array | 觸摸事件,目前變化的觸摸點資訊的數組 |
- (6)引用
包括【import】和【include】兩種方式
<import src="temp.wxml" />
<template is="temp01" data="{{text:'hello'}}"></template>
注意:<import>有作用域的概念,即隻會引用目标檔案自己定義的template,不會引用目标檔案中用<import>引用的第三方模闆。這樣做的目的是為了避免多個頁面彼此互相連接配接引用陷入邏輯錯誤。
使用<include>将目标檔案除了<template>以外的代碼引入,相當于複制代碼作用。
<include src="header.wxml" />
<view>正文</view>
<include src="footer.wxml" />
<import>更适合統一樣式但内容需動态變化的情況;<include>更适合無需改動目标檔案的情況。
2.WXSS(WeiXin Style Sheets)微信樣式表
wxss類似于css,用來描述頁面結構對應的樣式。它具有css大部分特性,對css進行了擴充和修改,主要有尺寸機關、樣式導入等擴充和修改。
- (1)尺寸機關:
rpx(responsive pixel),可以根據螢幕寬度自适應,規定螢幕寬為750rpx。一般以iphone6螢幕做為視覺設計标準。
rpx 與 px機關換算如下:
裝置 | rpx換算px (螢幕寬度/750) | px換算rpx (750/螢幕寬度) |
iPhone5 | 1rpx = 0.42px | 1px = 2.34rpx |
iPhone6 | 1rpx = 0.5px | 1px = 2rpx |
iPhone6s | 1rpx = 0.552px | 1px = 1.81rpx |
- (2)樣式導入:
【@import "../../templates/common.wxss"】
- (3)常用屬性
樣式屬性 | 說明 |
background-color | 背景色 |
color | 前景色 |
font-size | 字型大小 |
border | 邊框 |
width | 寬度 |
height | 高度 |
- (4)内聯樣式
style 和class
【<view style="color:red;background-color:#ccc">測試1</view>】
【<view style="color:{{color}}">測試2</view>】
【<view class="style1">測試3</view>】
- (5)選擇器
選擇器 | 示例 | 說明 |
.class | .style1 | 選擇所有擁有class=”style1”屬性的元件 |
#id | #test | 選擇所有擁有id=”test”屬性的元件 |
element | view | 選擇所有view元件 |
element,element | view,text | 選擇所有view元件和test元件 |
::after | view::after | 在view元件後插入内容 |
::before | view:before | 在view元件前插入内容 |
- (6)全局樣式與局部樣式
在app.wxss中的樣式為全局樣式,作用于每個頁面。在每個頁面的wxss檔案中定義的樣式為局部樣式,隻作用于對應的頁面,并會覆寫app.wxss中的相同的選擇器。
3.元件
元件是wxml頁面上的基本機關,例如按鈕,圖檔等,具體