微信小程式開發(1)
微信小程式開發(1)
目錄程式碼結構與基本配置
程式碼結構與基本配置
- App.js 註冊一個微信小程式
- App.json 小程式全域性配置(網路請求的超時時間、視窗表現、各個頁面的註冊路徑
- App.wxss 小程式全域性樣式
- Project.config.json 儲存微信開發者工具的配置資訊,重新安裝工具時可用
- Pages 所有頁面,每個頁面最多由四個檔案組成:
- js:處理頁面邏輯和一些資料互動
- json:頁面配置資訊
- wxml:展示頁面元素和內容
- wxss:設定頁面元素樣式
- Utils
Util.js 存放工具函式(達到程式碼複用的目的)
基本HelloWorld建立
App.js:註冊小程式的應用,呼叫App()函式,傳入Object型別引數 App({})
App.json:註冊小程式所有頁面的路徑,通過pages屬性,值為list型別,list中是所有頁面的路徑
{ "pages": [ ] }
Helloworld.wxml:描述頁面的內容,view標籤。
Helloworld Helloworld.js:註冊小程式頁面,類似於app.js,通過page()函式,傳入object型別引數(頁面的生命週期鉤子、時間處理函式、頁面的預設資料等等)
Page({})
Helloworld.json:helloworld的頁面一些配置
{}
Helloworld.wxss:描述小程式頁面的樣式
開發框架——基本構成
微信開發者工具
版本控制
- console:列印小程式頁面除錯log資訊
- sources:所有指令碼檔案,可進行斷點除錯
- network:展示各個網路請求的狀態資訊、所請求資源的響應資料
WXML
wxml語法
wxml(weixin markup language)是框架設計的一套標籤語言,結合元件、 wxs和時間系統,可以構建處頁面的結構。
語法
<標籤名 屬性名="屬性名1" 屬性名="屬性名2" …>
//屬性值大小寫敏感 …
</標籤名>
案例
<!-- index.wxml -->
<view class="classname" data-name="A">
Hello woeld!
<view>
Hello China!
</view>
</view>
注意:
① view標籤必須嚴格閉合
② 屬性值大小寫敏感
wxml特性
四個主要特性:資料繫結、列表渲染、條件渲染、模板引用
資料繫結
實現對資料的實時更新,使我們擁有動態改變頁面的能力
案例
1.文字內容繫結
<!--index.wxml-->
<view>
<text>{{message}}</text>
</view>
{{Mustache}} 繫結語法,把變數包起來
//index.js
Page({
data:{
message:"Hello world"
}
})
2.屬性繫結
<!--index.wxml-->
<view>
<text data-name="{{theName}}">
</text>
</view>
注意:所有的元件和屬性都必須是小寫
//index.js
Page({
data:{
theName:"Jack"
}
})
頁面渲染結果:
3.運算子繫結
<!--index.wxml-->
<view hidden="{{flag ? true : false}}">
Hidden
</view>
hidden屬性:值為 true 時隱藏 view 標籤內容
//index.js
Page({
data:{
flag: false
}
})
view 標籤屬性
屬性名 | 型別 | 描述 | 註解 |
---|---|---|---|
id | String | 元件的唯一標示 | 保持整個頁面唯一 |
class | String | 元件的樣式類 | 在對應的 wxss 中定義的樣式類,靜態設定屬性 |
style | String | 元件的內聯樣式 | 可以動態設定的內聯樣式 |
hidden | Boolean | 元件是否隱藏 | 預設值 false ,所有元件預設顯示 |
data-* | Any | 自定義屬性 | 元件上觸發的事件時,會發送給事件處理函式 |
bind* / catch* | EventHandler | 元件的事件 |
列表渲染
案例
<!--index.wxml-->
<view>
<block wx:for="{{items}}" wx:for-item="item" wx:key="index">
<view>{{index}}:{{item.name}}</view>
</block>
</view>
- 用 wx:for 繫結陣列,從而使用列表渲染特性;
- index 變數:當前元素在陣列中的下標
- item 變數:當前元素
- wx:key 列表中的唯一識別符號,若是靜態列表,或不需要維護列表狀態,可忽略該屬性
- block 標籤:不是元件,而是包裝元素,在頁面渲染時不會被渲染
//index.js
Page({
data:{
items:[
{name:"商品A"},
{name:"商品B"},
{name:"商品C"},
{name:"商品D"},
{name:"商品A"}
]
}
})
條件渲染
案例
<!--index.wxml-->
<view>今天吃什麼?</view>
<view wx:if="{{condition === 1}}">
餃子
</view>
<view wx:elif="{{condition === 2}}">
米飯
</view>
<view wx:else>
麵食
</view>
- condition 傳入 1-3 隨機整數
- hidden 始終渲染,wx:if 在切換程式碼塊時區域性渲染;相比之下,hidden 有更高的初始化渲染消耗,wx:if 有更高的切換消耗,因此,當元素需要頻繁切換顯示時,使用 hidden 屬性更好。
//index.js
Page({
data:{
condition: Math.floor(Math.random()*3+1)
}
})
模板及引用
在模板中自定義程式碼片段,在不同的地方呼叫或引用
案例
1.模板引用
<!--index.wxml-->
<template name="tempItem">
<view>
<view>收件人:{{name}}</view>
<view>聯絡方式:{{phone}}</view>
<view>地址:{{address}}</view>
</view>
</template>
<template is="template" data="{{...item}}"></template>
- is 屬性:進行動態繫結模板
- data 屬性:向模板中傳入資料資訊,模板擁有自己的作用域,只能通過 data 屬性傳值
//index.js
Page({
data:{
item:{
name:"張三",
phone:"11122223333",
address:"中國"
}
}
})
2.檔案引用
import
- import 只能引用模板檔案中的模板內容塊
<!--index.wxml-->
<import src="a.wxml"></import>
<template is="a"></template>
- src 屬性:宣告模板檔案路徑
- is 屬性:宣告所引用的模板名
<!--a.wxml-->
<view>Hello world</view>
<template name="a">
Hello,World!
</template>
- import 作用域:只能引用目標檔案中定義的 template 模板,如果目標檔案中還嵌套了其他檔案的 template 模板,那麼其他檔案中的模板就不會被引用
<!--index.wxml-->
<import src="a.wxml"></import>
<template is="a"></template>
<!--a.wxml-->
<import src="b.wxml"></import>
<template name="a">
This is a.wxml
</template>
<template is="b"></template>
<!--b.wxml-->
<template name="b">
This is b.wxml
</template>
include
include 是把目標檔案內除了模板程式碼塊之外的所有程式碼都引入,相當於將程式碼拷貝到了 include 的位置
<!--index.wxml-->
<include src="a.wxml"></include>
<template is="a"></template>
<!--a.wxml-->
<template name="a">
<view>
This is a.wxml
</view>
</template>
<view>Hello,world</view>
執行之後可以發現,並沒有將 a.wxml 檔案中的 a 模板渲染出來。
WXSS
WXSS(WeiXin Style Sheets) 是一套樣式語言,用於描述 WXML 的元件樣式,與 Web 開發中的 CSS(Cascading Style Sheets) 極為相似,為了適合小程式的開發, wxss 對 css 做了一定的修改和補充。
- 尺寸單位 rpx
- 樣式匯入
- 內聯樣式
- 選擇器
wxss特性
響應式畫素
-
裝置畫素(device pixels):裝置螢幕的畫素點,即螢幕解析度
-
css 畫素(css pixels):css樣式程式碼中所使用的邏輯畫素
-
PPI/DPI(pixel per inch):每英寸的畫素數,數值越大,表示顯示屏能以越高的密度顯示影象,計算公式如下:
$$
螢幕解析度:x * y
$$
$$
PPI = √(x² + y²) / 螢幕尺寸
$$
以 iPhone6 為例:
$$
PPI = √(750² + 1334²) / 4.7 =325.6
$$
iPhone6 的螢幕尺寸為 4.7 英寸,計算得出 PPI=325.6,約等於官方值 326 。
-
DPR(device pixel Ratio):指手機在某一方向上的裝置畫素與 css 畫素之比
-
rpx :微信團隊規定手機螢幕寬度為 750rpx ,從而可以根據螢幕寬度實現自適應
樣式
案例
外聯樣式匯入
<!--index.wxml-->
<view class="container">
Hello,world!
</view>
/** index.wxss **/
@import './assets.wxss';
.container {
color: red;
}
/** assets.wxss **/
.container {
border: 1px solid #000;
}
注意:樣式檔案執行順序為”從上到下,從左到右“,若將 index.wxss 中 container 的 border 顏色設定為 yellow,那麼就會覆蓋 assets.wxss 中的border 設定
內聯樣式
<!--index.wxml-->
<view style="width:500rpx; height:30px; background-color:{{colorValue}};">
Hello,world!
</view>
- class :靜態樣式
- style :動態樣式
//index.js
Page({
data:{
colorValue: 'red'
}
})
選擇器
選擇器 | 樣例 | 樣例描述 |
---|---|---|
.class | .intro | 選擇所有擁有 class="intro" 的元件 |
#id | #firstname | 選擇擁有 id="firstname" 的元件 |
element | view | 選擇所有 view 元件 |
element, element | view, checkbox | 選擇所有文件的 view 元件和所有的 checkbox 元件 |
::after | view::after | 在 view 元件後邊插入內容 |
::before | view::before | 在 view 元件前邊插入內容 |
選擇器優先順序
選擇器 | 權重 |
---|---|
!important(提升選擇器的權重,嚴格來講不是選擇器) | ∞ |
style(標籤內聯屬性,也可以理解為一個選擇器) | 1000 |
#element(id 選擇器) | 100 |
.element(class 選擇器) | 10 |
element(元素標籤選擇器) | 1 |
!important 權重最高,會破壞掉樣式表中固有的權重值比較規則,使得除錯 bug 變得更加困難,因此使用時應當謹慎
!important 使用案例:
/** index.wxss **/
.title {
color: red !important;
}
JavaScript
JavaScript介紹
JavaScript是一種輕量的、解釋型的、面向物件的頭等函式語言,是一種動態的基於原型的多正規化的指令碼語言,支援面向物件、命令式和函式式的程式設計風格。
圖書推薦:
小程式JavaScript實現
不同環境中的 JavaScript 對比
Nodejs 中的 JavaScript
- ECMAScript
- Native:原生模組,通過 Native 使用 JavaScript 不具備的能力
- NPM:包管理系統
小程式中的 JavaScript
- ECMAScript
- 小程式框架
- 小程式API
- 無法使用 jQuery 和 Nodejs 中的 Native 、NPM
瀏覽器中的 JavaScript
- ECMAScript
- DOM:瀏覽器的文件物件模型,是 HTML 和 xml 的應用程式介面,通過 js 讀取當前網頁的 DOM 物件
- BOM:瀏覽器的物件模型,處理瀏覽器的視窗和框架
小程式宿主環境差異
IOS | Android | IDE |
---|---|---|
JavaScriptCore | X5核心 | nwjs |
WXS
WXS 介紹
wxs(WeiXin Script),和 wxml 共同構建頁面檢視的結構內容
WXS 特性
模組
wxs 有獨立的作用域,其中定義的變數和函式預設是私有的
<!--index.wxml-->
<wxs module="m1">
module.exports = {
message: 'Hello,world!'
}
</wxs>
<view> {{m1.message}} </view>
module.exports 屬性:將 wxs 中的變數暴露,讓外部可呼叫
<!--index.wxml-->
<wxs src="./m2.wxs" module="m2"></wxs>
<view> {{m2.message}} </view>
// m2.wxs
module.exports = require('./m1.wxs')
// m1.wxs
module.exports= {
message: "hello world!"
}
- src :宣告外部 wxs 檔案路徑
- module :宣告所使用的外部 wxs 檔案中的模組名
- require() 函式 :在 wxs 中引用其他 wxs 檔案
注意:儘量不要重複宣告模組名,否則後面定義的模組會覆蓋前面的模組
變數
與 ES5 標準的 JavaScript 變數用法一致
註釋
<!--index.wxml-->
<wxs module+"m3">
var v = 1;
module.exports.value = v;
//單行註釋
/*多行註釋
v += 1;
*/
console.log(v);
/*
var d = 3;
console.log(d);
*/
</wxs>
<view> {{m3.value}} </view>
運算子
wxs 中運算子語句與 JavaScript 基本一致,但不支援 try ... catch 語句
運算子 | |
---|---|
基本運算子 | |
一元運算子 | |
位運算子 | |
比較運算子 | |
等值運算子 | |
賦值運算子 | |
二元邏輯運算子 |
資料型別
資料型別 | |
---|---|
number | 數字 |
string | 字串 |
boolean | 布林 |
object | 物件 |
array | 陣列 |
function | 函式 |
date | 日期 |
regexp | 正則 |
- 生成 date 物件使用 getdate() 函式
- 生成 regexp 物件使用 getregexp() 函式
基礎類庫
基礎類庫 | |
---|---|
Number | |
Date | |
Global | |
console | |
Math | |
JSON |
與 ES5 標準的 JavaScript 基礎類庫基本一致,區別在於:
console 基礎類庫只提供 console.log()
date 基礎類庫只提供
date.pase() :解析字串形式的日期時間,返回 UNIX 時間戳
date.now() :返回當前日期時間的 UNIX 時間戳
date.utc() :返回指定時間的 UNIX 時間戳
MINA 框架
小程式開發框架
小程式執行機制
啟動
熱啟動
將後臺切換到前臺
冷啟動
首次啟動或被微信銷燬後再次啟動
若冷啟動時發現有新版本,則非同步下載新版程式碼包
載入
小程式啟動時,向 CDN 請求最新的程式碼包,首次啟動時,需等待程式碼包下載完畢,並注入到 web view 容器內執行之後,才能看到小程式的頁面;客戶端會將程式碼包快取到本地,下次啟動時,首先從 CDN 請求是否有最新版本程式碼包,若有,執行舊版本程式碼包的同時,非同步下載最新版程式碼包。
CDN
內容分發網路,作用是將請求的內容分發到最近的網路節點伺服器,提高使用者訪問的響應速度和成功率,解決頻寬、伺服器效能帶來的延遲問題
生命週期
應用生命週期
首次啟動時,客戶端會初始化小程式的執行環境,同時從 CDN 下載,或從本地快取拿到程式碼包,並注入到執行環境;
onLaunch:初始化完畢後,客戶端會給邏輯層 App.js 的 app 例項派發 onLaunch 事件
onHide:當點選小程式右上角關閉,或點選手機 Home 鍵時,小程式被切入後臺,這時呼叫 onHide
onShow:從後臺重新開啟小程式時,呼叫 onShow
onError:發生指令碼錯誤,或 API 呼叫失敗時,呼叫 onError,這時會給 onError 方法中傳入一些錯誤資訊
globalData:表示小程式應用的全域性資料
頁面生命週期
onLoad:頁面初次載入時,客戶端派發 onLoad 事件,在頁面被銷燬之前,只調用一次
onShow:頁面開啟後,或從另一個頁面返回當前頁面時,當前頁的 onShow 方法被呼叫
onReady:當頁面初次渲染完之後,呼叫 onReady 方法,在頁面被銷燬之前,只調用一次;onReady 觸發之後,邏輯層就可以和檢視層進行互動了
onHide:當開啟新頁面時,當前頁的 onHide 方法被呼叫
onUnload:關閉當前頁面時呼叫
data:表示當前小程式的頁面資料
案例
頁面路由
在一個多頁面的小程式中,所有頁面路由由框架進行管理,框架以棧的形式維護小程式的頁面
路由方式 | 頁面棧表現 |
---|---|
初始化 | 新頁面入桟 |
開啟新頁面 | 新頁面入桟 |
頁面重定向 | 當前頁面出桟,新頁面入桟 |
頁面返回 | 頁面不斷出桟,直到目標返回頁,新頁面入桟 |
Tab 切換 | 頁面全部出桟,只留下新的 Tab 頁面 |
重載入 | 頁面全部出桟,只留下新的頁面 |
路由觸發方式以及對應頁面生命週期函式
路由方式 | 觸發時機 | 路由前頁面 | 路由後頁面 |
---|---|---|---|
初始化 | 小程式開啟的第一個頁面 | onLoad onShow | |
開啟新頁面 | 呼叫 API wx.navigateTo 或使用元件 < navigator open-type="navigateTo"/> | onHide | onLoad onShow |
頁面重定向 | 呼叫 API wx.redirectTo 或使用元件 < navigator open-type="redirectTo"/> | onUnload | onLoad onShow |
頁面返回 | 呼叫 API wx.navigateBack 或使用元件 < navigator open-type="navigateBack"/> | onUnload | onShow |
Tab 切換 | 呼叫 API wx.switchTab 或使用元件 < navigator open-type="switchTab"/> | 各種情況參考下表 | |
重啟動 | 呼叫 API wx.reLaunch 或使用元件 < navigator open-type="reLaunch"/> | onUnload | onLoad onShow |