微信小程序開發(fā)入門實戰(zhàn) (二)小程序代碼構成與基礎知識

在上一章 微信小程序開發(fā)入門實戰(zhàn) (一)準備階段與vant-ui使用 中靖苇,我們通過開發(fā)者工具快速創(chuàng)建了一個 QuickStart 項目骑晶。當你打開這個項目你會發(fā)現(xiàn)不同類型的文件:

  • .json 后綴的 JSON 配置文件
  • .wxml 后綴的 WXML 模板文件
  • .wxss 后綴的 WXSS 樣式文件
  • .js 后綴的 JS 腳本邏輯文件

你可以看到:小程序由配置代碼JSON文件匣吊、模板代碼 WXML 文件盒件、樣式代碼 WXSS文件以及邏輯代碼 JavaScript文件組成刽严。

接下來我們分別看看這4種文件的作用昂灵。

小程序代碼構成

JSON 配置

在小程序中,JSON扮演的靜態(tài)配置的角色。

我們可以看到在項目的根目錄有一個 app.json 和 project.config.json眨补,此外在 pages/logs 目錄下還有一個 logs.json管削,我們依次來說明一下它們的用途。

小程序配置 app.json

app.json 是當前小程序的全局配置撑螺,包括了小程序的所有頁面路徑含思、界面表現(xiàn)、網絡超時時間甘晤、底部 tab 等含潘。QuickStart 項目里邊的 app.json 配置內容如下:

{
  "pages":[
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "WeChat",
    "navigationBarTextStyle":"black"
  }
}

我們簡單說一下這個配置各個項的含義:

  • pages字段 —— 用于描述當前小程序所有頁面路徑,這是為了讓微信客戶端知道當前你的小程序頁面定義在哪個目錄线婚。
  • window字段 —— 定義小程序所有頁面的頂部背景顏色调鬓,文字顏色定義等。
    其他配置項細節(jié)可以參考文檔: 小程序的配置 app.json 酌伊。

我們可以通過一個例子弄懂它腾窝。

修改第 9 行為 "navigationBarTitleText": "MiniProgram" ,如圖:

修改 navigationBarTitleText

保存代碼居砖,開發(fā)者工具自動刷新后虹脯,注意到模擬器頂部 bar 的文本字段由 Wechat 變?yōu)榱?MiniProgram徙垫。

Wechat 變?yōu)榱?MiniProgram
工具配置 project.config.json

通常大家在使用一個工具的時候唧领,都會針對各自喜好做一些個性化配置倒堕,例如界面顏色窥妇、編譯配置等等党饮,當你換了另外一臺電腦重新安裝工具的時候吩跋,你還要重新配置苗分。

考慮到這點劈伴,小程序開發(fā)者工具在每個項目的根目錄都會生成一個 project.config.json咒精,你在工具上做的任何配置都會寫入到這個文件镶柱,當你重新安裝工具或者換電腦工作時,你只要載入同一個項目的代碼包模叙,開發(fā)者工具就自動會幫你恢復到當時你開發(fā)項目時的個性化配置歇拆,其中會包括編輯器的顏色、代碼上傳時自動壓縮等等一系列選項范咨。

其他配置項細節(jié)可以參考文檔 開發(fā)者工具的配置 故觅。

頁面配置 page.json

這里的 page.json 其實用來表示 pages/logs 目錄下的 logs.json 這類和小程序頁面相關的配置。

如果你整個小程序的風格是藍色調渠啊,那么你可以在 app.json 里邊聲明頂部顏色是藍色即可输吏。實際情況可能不是這樣,可能你小程序里邊的每個頁面都有不一樣的色調來區(qū)分不同功能模塊替蛉,因此我們提供了 page.json贯溅,讓開發(fā)者可以獨立定義每個頁面的一些屬性拄氯,例如剛剛說的頂部顏色、是否允許下拉刷新等等盗迟。

其他配置項細節(jié)可以參考文檔 頁面配置 坤邪。

WXML 模板

WXML 全稱是 WeiXin Markup Language,是小程序框架設計的一套標簽語言罚缕,結合小程序的基礎組件艇纺、事件系統(tǒng),可以構建出頁面的結構邮弹。

從事過網頁編程的人知道黔衡,網頁編程采用的是 HTML + CSS + JS 這樣的組合,其中 HTML 是用來描述當前這個頁面的結構腌乡,CSS 用來描述頁面的樣子盟劫,JS 通常是用來處理這個頁面和用戶的交互。

同樣道理与纽,在小程序中也有同樣的角色侣签,其中 WXML 充當?shù)木褪穷愃?HTML 的角色。

WXML 文件后綴名是 .wxml 急迂,打開 pages/wxml/index.wxml 文件影所,有過 HTML 的開發(fā)經驗的讀者應該會很熟悉這種代碼的書寫方式,簡單的 WXML語句在語法上同 HTML 非常相似僚碎。

<view class="container">
  <view class="userinfo">
    <button wx:if="{{!hasUserInfo && canIUse}}"> 獲取頭像昵稱 </button>
    <block wx:else>
      <image src="{{userInfo.avatarUrl}}" background-size="cover"></image>
      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
    </block>
  </view>
  <view class="usermotto">
    <text class="user-motto">{{motto}}</text>
  </view>
</view>

和 HTML 非常相似猴娩,WXML 由標簽、屬性等等構成勺阐。但是也有很多不一樣的地方卷中,我們來一一闡述一下:

  • 標簽名字有點不一樣,他們是小程序的標簽組件渊抽,小程序的 WXML 用的標簽是 view, button, text 等等蟆豫,這些標簽就是小程序給開發(fā)者包裝好的基本能力,我們還提供了地圖腰吟、視頻无埃、音頻等等組件能力。更多標簽組件看這里:小程序的標簽組件
  • 多了一些 wx:if 這樣的屬性以及 {{ }} 這樣的表達式毛雇,小程序采用了 MVVM 的開發(fā)模式(例如 React, Vue),提倡把渲染和邏輯分離侦镇。

如果你需要把一個 Hello World 的字符串顯示在界面上灵疮。WXML 是這么寫 :

<text>{{msg}}</text>

JS 只需要管理狀態(tài)即可:

this.setData({ msg: "Hello World" })

更多關于WXML的看這里:WXMLWXML 語法參考壳繁。

WXSS 樣式

WXSS 具有 CSS 大部分的特性震捣,小程序在 WXSS 也做了一些擴充和修改荔棉。

  • 新增了尺寸單位。在寫 CSS 樣式時蒿赢,開發(fā)者需要考慮到手機設備的屏幕會有不同的寬度和設備像素比润樱,采用一些技巧來換算一些像素單位。WXSS 在底層支持新的尺寸單位 rpx 羡棵,開發(fā)者可以免去換算的煩惱壹若,只要交給小程序底層來換算即可,由于換算采用的浮點數(shù)運算皂冰,所以運算結果會和預期結果有一點點偏差店展。
  • 提供了全局的樣式和局部樣式。和前邊 app.json, page.json 的概念相同秃流,你可以寫一個 app.wxss 作為全局樣式赂蕴,會作用于當前小程序的所有頁面,局部頁面樣式 page.wxss 僅對當前頁面生效舶胀。
  • 此外 WXSS 僅支持部分 CSS 選擇器

更詳細的文檔可以參考 WXSS 概说、WXSS 樣式

JS 邏輯交互

一個服務僅僅只有界面展示是不夠的,還需要和用戶做交互:響應用戶的點擊嚣伐、獲取用戶的位置等等糖赔。在小程序里邊,我們就通過編寫 JS 腳本文件來處理用戶的操作纤控。

<view>{{ msg }}</view>
<button bindtap="clickMe">點擊我</button>

點擊 button 按鈕的時候挂捻,我們希望把界面上 msg 顯示成 "Hello World",于是我們在 button 上聲明一個屬性: bindtap 船万,在 JS 文件里邊聲明了 clickMe 方法來響應這次點擊操作:

Page({
  clickMe: function() {
    this.setData({ msg: "Hello World" })
  }
})

響應用戶的操作就是這么簡單刻撒,更詳細的事件可以參考文檔 WXML - 事件

此外你還可以在 JS 中調用小程序提供的豐富的 API耿导,利用這些 API 可以很方便的調起微信提供的能力声怔,例如獲取用戶信息、本地存儲舱呻、微信支付等醋火。在前邊的 QuickStart 例子中,在 pages/index/index.js 就調用了 wx.getUserInfo 獲取微信用戶的頭像和昵稱箱吕,最后通過 setData 把獲取到的信息顯示到界面上芥驳。更多 API 可以參考文檔 小程序的API

在了解完這些基本的代碼構成后茬高,下面再了解一些基礎知識兆旬。

目錄結構

小程序包含一個描述整體程序的 app 和多個描述各自頁面的 page。

一個小程序主體部分由三個文件組成怎栽,必須放在項目的根目錄丽猬,如下:

文件 必需 作用
app.js 小程序邏輯
app.json 小程序公共配置
app.wxss 小程序公共樣式表

一個小程序頁面由四個文件組成宿饱,分別是:

文件類型 必需 作用
js 頁面邏輯
wxml 頁面結構
json 頁面配置
wxss 頁面樣式表

注意:為了方便開發(fā)者減少配置項,描述頁面的四個文件必須具有相同的路徑與文件名脚祟。

允許上傳的文件

在項目目錄中谬以,以下文件會經過編譯,因此上傳之后無法直接訪問到:.js由桌、app.json为黎、.wxml、*.wxss(其中 wxml 和 wxss 文件僅針對在 app.json 中配置了的頁面)沥寥。除此之外碍舍,只有后綴名在白名單內的文件可以被上傳,不在白名單列表內文件在開發(fā)工具能被訪問到邑雅,但無法被上傳片橡。具體白名單列表如下:

  • wxs
  • png
  • jpg
  • jpeg
  • gif
  • svg
  • json
  • cer
  • mp3
  • aac
  • m4a
  • mp4
  • wav
  • ogg
  • silk

小程序配置

全局配置

小程序根目錄下的 app.json 文件用來對微信小程序進行全局配置,決定頁面文件的路徑淮野、窗口表現(xiàn)捧书、設置網絡超時時間、設置多 tab 等骤星。

完整配置項說明請參考小程序全局配置

以下是一個包含了部分常用配置選項的 app.json

{
  "pages": [
    "pages/index/index",
    "pages/logs/index"
  ],
  "window": {
    "navigationBarTitleText": "Demo"
  },
  "tabBar": {
    "list": [{
      "pagePath": "pages/index/index",
      "text": "首頁"
    }, {
      "pagePath": "pages/logs/index",
      "text": "日志"
    }]
  },
  "networkTimeout": {
    "request": 10000,
    "downloadFile": 10000
  },
  "debug": true,
  "navigateToMiniProgramAppIdList": [
    "wxe5f52902cf4de896"
  ]
}

完整配置項說明請參考小程序全局配置

頁面配置

每一個小程序頁面也可以使用同名 .json 文件來對本頁面的窗口表現(xiàn)進行配置经瓷,頁面中配置項會覆蓋 app.jsonwindow 中相同的配置項。

完整配置項說明請參考小程序頁面配置

例如:

{
  "navigationBarBackgroundColor": "#ffffff",
  "navigationBarTextStyle": "black",
  "navigationBarTitleText": "微信接口功能演示",
  "backgroundColor": "#eeeeee",
  "backgroundTextStyle": "light"
}

視圖層

WXML

上面我們簡單介紹了一下WXML洞难,接下來我們用簡單的例子來看看 WXML 具有什么能力:

數(shù)據(jù)綁定
<!--wxml-->
<view> {{message}} </view>
// page.js
Page({
  data: {
    message: 'Hello MINA!'
  }
})
列表渲染
<!--wxml-->
<view wx:for="{{array}}"> {{item}} </view>
// page.js
Page({
  data: {
    array: [1, 2, 3, 4, 5]
  }
})
條件渲染
<!--wxml-->
<view wx:if="{{view == 'WEBVIEW'}}"> WEBVIEW </view>
<view wx:elif="{{view == 'APP'}}"> APP </view>
<view wx:else="{{view == 'MINA'}}"> MINA </view>
// page.js
Page({
  data: {
    view: 'MINA'
  }
})
模板
<!--wxml-->
<template name="staffName">
  <view>
    FirstName: {{firstName}}, LastName: {{lastName}}
  </view>
</template>

<template is="staffName" data="{{...staffA}}"></template>
<template is="staffName" data="{{...staffB}}"></template>
<template is="staffName" data="{{...staffC}}"></template>
// page.js
Page({
  data: {
    staffA: {firstName: 'Hulk', lastName: 'Hu'},
    staffB: {firstName: 'Shang', lastName: 'You'},
    staffC: {firstName: 'Gideon', lastName: 'Lin'}
  }
})

具體的能力以及使用方式在以下章節(jié)查看:
數(shù)據(jù)綁定舆吮、列表渲染條件渲染队贱、模板色冀、引用

WXSS

WXSS 用來決定 WXML 的組件應該怎么顯示。

為了適應廣大的前端開發(fā)者柱嫌,WXSS 具有 CSS 大部分特性锋恬。同時為了更適合開發(fā)微信小程序,WXSS 對 CSS 進行了擴充以及修改编丘。

與 CSS 相比与学,WXSS 擴展的特性有:

  • 尺寸單位
  • 樣式導入
尺寸單位
  • rpx(responsive pixel): 可以根據(jù)屏幕寬度進行自適應。規(guī)定屏幕寬為750rpx嘉抓。如在 iPhone6 上索守,屏幕寬度為375px,共有750個物理像素抑片,則750rpx = 375px = 750物理像素蕾盯,1rpx = 0.5px = 1物理像素。
設備 rpx換算px (屏幕寬度/750) px換算rpx (750/屏幕寬度)
iPhone5 1rpx = 0.42px 1px = 2.34rpx
iPhone6 1rpx = 0.5px 1px = 2rpx
iPhone6 Plus 1rpx = 0.552px 1px = 1.81rpx

建議: 開發(fā)微信小程序時設計師可以用 iPhone6 作為視覺稿的標準蓝丙。

注意: 在較小的屏幕上不可避免的會有一些毛刺级遭,請在開發(fā)時盡量避免這種情況。

樣式導入

使用@import語句可以導入外聯(lián)樣式表渺尘,@import后跟需要導入的外聯(lián)樣式表的相對路徑挫鸽,用;表示語句結束。

示例代碼:

/** common.wxss **/
.small-p {
  padding:5px;
}
/** app.wxss **/
@import "common.wxss";
.middle-p {
  padding:15px;
}
內聯(lián)樣式

框架組件上支持使用 style鸥跟、class 屬性來控制組件的樣式丢郊。

  • style:靜態(tài)的樣式統(tǒng)一寫到 class 中。style 接收動態(tài)的樣式医咨,在運行時會進行解析枫匾,請盡量避免將靜態(tài)的樣式寫進 style 中,以免影響渲染速度拟淮。
<view style="color:{{color}};" />
  • class:用于指定樣式規(guī)則干茉,其屬性值是樣式規(guī)則中類選擇器名(樣式類名)的集合,樣式類名不需要帶上.很泊,樣式類名之間用空格分隔角虫。
<view class="normal_view" />
選擇器

目前支持的選擇器有:

選擇器 樣例 樣例描述
.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 組件前邊插入內容
全局樣式與局部樣式

定義在 app.wxss 中的樣式為全局樣式,作用于每一個頁面委造。在 page 的 wxss 文件中定義的樣式為局部樣式戳鹅,只作用在對應的頁面,并會覆蓋 app.wxss 中相同的選擇器昏兆。

至此枫虏,小程序代碼構成與基礎知識就完成了,更多的內容請看:小程序開發(fā)框架

結語

提示:后面還有精彩敬請期待爬虱,請大家關注我的專題:web前端隶债。如有意見可以進行評論,每一條評論我都會認真對待饮潦。

下篇:微信小程序開發(fā)入門實戰(zhàn) (三)在熟悉vue的情況下燃异,快速切換為小程序開發(fā)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市继蜡,隨后出現(xiàn)的幾起案子回俐,更是在濱河造成了極大的恐慌,老刑警劉巖稀并,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仅颇,死亡現(xiàn)場離奇詭異,居然都是意外死亡碘举,警方通過查閱死者的電腦和手機忘瓦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來引颈,“玉大人耕皮,你說我怎么就攤上這事境蜕。” “怎么了凌停?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵粱年,是天一觀的道長。 經常有香客問我罚拟,道長台诗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任赐俗,我火速辦了婚禮拉队,結果婚禮上,老公的妹妹穿的比我還像新娘阻逮。我一直安慰自己粱快,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布夺鲜。 她就那樣靜靜地躺著皆尔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪币励。 梳的紋絲不亂的頭發(fā)上慷蠕,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音食呻,去河邊找鬼流炕。 笑死,一個胖子當著我的面吹牛仅胞,可吹牛的內容都是我干的每辟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼干旧,長吁一口氣:“原來是場噩夢啊……” “哼渠欺!你這毒婦竟也來了?” 一聲冷哼從身側響起椎眯,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挠将,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后编整,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舔稀,經...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年掌测,在試婚紗的時候發(fā)現(xiàn)自己被綠了内贮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖夜郁,靈堂內的尸體忽然破棺而出什燕,到底是詐尸還是另有隱情,我是刑警寧澤拂酣,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布秋冰,位于F島的核電站,受9級特大地震影響婶熬,放射性物質發(fā)生泄漏。R本人自食惡果不足惜埃撵,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一赵颅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暂刘,春花似錦饺谬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至森缠,卻和暖如春拔鹰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贵涵。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工列肢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宾茂。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓瓷马,卻偏偏與公主長得像,于是被迫代替她去往敵國和親跨晴。 傳聞我的和親對象是個殘疾皇子欧聘,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359