1. 程式人生 > >微信小程式開發初體驗--教你開發小程式

微信小程式開發初體驗--教你開發小程式


微信小程式

微信小程式面世以來受到的關注頗多,直到最近我才動手嘗試進行了小程式的開發,總體上感覺還是不錯的,有一點不適應的就是要擺脫Web APP開發對DOM的操作。在這裡我就把我是如何利用API開發微信小程式的過程寫成教程,教大家快速上手體驗一次微信小程式的開發。

補充: 之前忘了把原始碼發上來,完成之後就已經放在Github上了 點我下載>>

在開始之前我們先來看下成品的效果圖


完成效果預覽

準備工作

我們先確定想要開發一款什麼樣的小程式,首先要符合「小」,因為我們這次是要體驗小程式的開發,所以儘量不要弄得太複雜;其次是「快」,小程式裡需要的資料啊、資源啊,最好是現成就有的,自己寫個API什麼的這就太耗時了,就不叫快速上手了。

所以呢,如果能呼叫現成的API那是極好的,經過一番挑選,我選擇了聚合資料的免費的歷史上的今天這個API,呼叫這個API獲取資料,我們只要做2個頁面就可以完全展示出來了,又「小」又「快」哈XD

注: API需要註冊之後獲得KEY才能使用,具體請檢視聚合資料官方文件,這裡預設各位已經註冊並擁有相應API所需的KEY

工程結構

微信開發者工具的安裝和使用在這裡就不多作介紹了,有疑問的話可以看微信官方的簡易教程

先建立一個工程,依次點選「新增專案」--「無AppID」,然後填好「專案名稱」並選擇「專案目錄」,點選「新增專案」


新增專案

然後我們來清理一下預設工程的目錄結構,刪除以下目錄和檔案

pages/logs/
pages/index/index.wxss

建立以下目錄和檔案

pages/detail/
pages/detail/detail.js
pages/detail/detail.wxml
pages/templates/
pages/templates/item.wxml
res/

現在你看到的目錄結構應該是這樣子的

.
├── app.js
├── app.json
├── app.wxss
├── pages
│   ├── detail
│   │   ├── detail.js
│   │   └── detail.wxml
│   ├── index
│   │   ├── index
.js │ │ └── index.wxml │ └── templates │ └── item.wxml ├── res └── utils └── util.js

目錄結構

這就是我們工程目錄的最終結構了,後面還會新增資源進去,但是整體結構還是這樣不會改變的

修改配置

微信小程式是通過修改app.json檔案改變全域性配置的,具體的可配置項請各位自行查閱小程式文件的配置一節

開啟app.json,修改成

{
  "pages":[
    "pages/index/index",
    "pages/detail/detail"
  ],
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#3e3e3e",
    "navigationBarTitleText": "歷史今日",
    "navigationBarTextStyle":"white"
  },
  "debug": true
}

我們這裡修改了導航欄的背景顏色(navigationBarBackgroundColor)、標題顏色(navigationBarTextStyle)以及標題內容(navigationBarTitleText),為了方便檢視除錯資訊,我還開啟了debug模式

全域性配置以及搞定啦,接下來正式開始編碼

首頁佈局

前面已經說了我們要做的是「歷史上的今天」這樣的一個小程式,所以同一個日期會有很多條目,最常見的佈局就是做成列表

列表裡會有很多的條目,數量是不確定的,所以我們不能在頁面裡寫死了佈局,這時候就要用到模板(template)了,我們可以在模板中定義程式碼片段,然後在不同的地方呼叫

我們來定義一個模板,開啟pages/templates/item.wxml,新增程式碼

<template name="tItem">
    <navigator url="../detail/detail?id={{item.e_id}}">
        <view class="ui-list-item ui-pure-item ui-border-b">
            <view class="ui-item-span"><text>{{item.date}}</text></view>
            <view class="ui-item-content ui-nowrap"><text>{{item.title}}</text></view>
        </view>
    </navigator>
</template>

注: 模板的使用細節請參考官方文件模板一節

接下來開啟pages/index/index.wxml刪掉裡面的內容,我們要在這裡編寫列表頁,這裡會使用到我們上面定義的模板

<import src="../templates/item.wxml"/>

<scroll-view scroll-y="true" class="flex-row ui-list ui-border-t">
    <template is="tItem" data="{{item}}" wx:for="{{events}}"/>
    <view class="ui-tips">
        <view wx:if="{{hidden}}"><text>沒有更多內容了</text></view>
        <view wx:else><text>內容載入中...</text></view>
    </view>
</scroll-view>

<loading hidden="{{hidden}}">Loading...</loading>

可以注意到第一行使用了import將模板引入到頁面中,然後再使用is屬性,宣告需要使用的模板,用data屬性傳入資料供模板使用

注: 模板擁有自己的作用域,只能使用data傳入的資料

為了測試和檢視佈局效果,我們開啟pages/index/index.js刪除裡面的程式碼,然後新增以下程式碼手動建立資料傳入給頁面渲染

Page({
  data: {
    hidden: true,
    events: [
      {
        date: "2016-10-14",
        title: "TodayOnHistory, 歷史上的今天"
      },
      {
        date: "2016-10-14",
        title: "TodayOnHistory, 歷史上的今天"
      },
      {
        date: "2016-10-14",
        title: "TodayOnHistory, 歷史上的今天"
      },
      {
        date: "2016-10-14",
        title: "TodayOnHistory, 歷史上的今天"
      },
      {
        date: "2016-10-14",
        title: "TodayOnHistory, 歷史上的今天"
      },
      {
        date: "2016-10-14",
        title: "TodayOnHistory, 歷史上的今天"
      }
    ]
  }
})

儲存後點擊開發工具左側的編譯,即可檢視到效果


首頁佈局效果

注: 佈局會用到圖示字型,匯入到res/下,樣式則寫在app.wxss全域性樣式表中,圖示字型檔案和樣式請從原始碼中獲取,這篇教程不作樣式的說明

詳細頁面

首頁的佈局已經完成了,暫時放下首頁列表,接下來開始編寫詳細內容的頁面

開啟pages/detail/detail.wxml,新增內容如下

<view class="container">
    <view class="ui-title ui-border-b"><text>{{detail.title}}</text></view>
    <view class="ui-content"><text>{{detail.content}}</text></view>
    <block wx:for="{{detail.picUrl}}">
        <view>
            <view><image mode="aspectFit" src="{{item.url}}"/></view>
            <view class="ui-pic-title"><text>{{item.pic_title}}</text></view>
        </view>
    </block>
</view>
<loading hidden="{{hidden}}">Loading...</loading>

搞定,這個頁面就這麼簡單就OK了,現在我們開啟pages/detail/detail.js手動新增資料到這個頁面中檢視效果

Page({
  data:{
      hidden: true,
      detail: {
          title: "歷史上的今天",
          content: "歷史上的今天曆史上的今天曆史上的今天曆史上的今天曆史上的今天曆史上的今天曆史上的今天曆史上的今天曆史上的今天",
          picUrl: [
              {
                  url: "http://sjbz.fd.zol-img.com.cn/t_s320x510c/g5/M00/00/04/ChMkJlfJWJCIYePaAAPdCld59MEAAU-KAP0U3gAA90i450.jpg",
                  pic_title: "這是圖片標題"
              }
          ]
      }
  }
})

詳細頁面效果

填充資料

現在頁面佈局都已經完成了,是時候呼叫API編寫邏輯層的程式碼來填充資料到頁面上了,在開始之前我們先清理一下無用的程式碼

開啟app.js刪掉無用的函式和屬性

App({

})

以上這步是額外步驟,並不影響我們接下來要做的事情

開啟utils/util.js並清空裡面的程式碼,新增如下內容

// 查詢事件列表的Base URL
const API_URL_L = "http://v.juhe.cn/todayOnhistory/queryEvent.php"
// 查詢詳細資訊的Base URL
const API_URL_D = "http://v.juhe.cn/todayOnhistory/queryDetail.php"
// 申請API獲得的KEY
const API_KEY = "YOUR API KEY"

// 獲取事件列表
function fetchEvents(today) {
    var promise = new Promise(function(resolve, reject){
        wx.request({
            url: API_URL_L,
            data: {
                key: API_KEY,
                date: today
            },
            header: {
                'Content-Type': 'application/json'
            },
            success: resolve,
            fail: reject
        })
    })
    return promise
}

function getEvents() {
    var tmpDate = new Date()
    var today = tmpDate.getMonth() + 1
    today = today + '/' + tmpDate.getDate()
    return fetchEvents(today)
        .then(function(res) {
            // console.log(res.data.result)
            return res.data.result
        })
        .catch(function(err) {
            console.log(err)
            return []
        })
}

// 獲取詳細資訊
function fetchDetail(e_id) {
    var promise = new Promise(function(resolve, reject){
        wx.request({
            url: API_URL_D,
            data: {
                key: API_KEY,
                e_id: e_id
            },
            header: {
                'Content-Type': 'application/json'
            },
            success: resolve,
            fail: reject
        })
    })
    return promise
}

function getDetail(e_id) {
    return fetchDetail(e_id)
        .then(function(res) {
            // console.log(res.data.result)
            return res.data.result
        })
        .catch(function(err) {
            console.log(err)
            return []
        })
}

module.exports = {
    getEvents: getEvents,
    getDetail: getDetail
}

注: 請將API_KEY的值替換為你申請到的KEY

我們要利用API獲取的資料有兩種,一是「事件列表」,另一種是事件對應的「詳細資訊」,上面使用到了ES6原生提供的Promise物件,具體請參考阮一峰的《JavaScript 標準參考教程(alpha)》中「Promise物件」一節

最後還用到了module.exports對外暴露兩個函式,使外部可以呼叫

我們繼續開啟pages/index/index.js檔案,修改成這樣

const util = require('../../utils/util.js')

Page({
  data: {
    hidden: false,
    events: []
  },
  onLoad:function(options){
    // 頁面初始化 options為頁面跳轉所帶來的引數
    var self = this
    util.getEvents().then(function(data) {
      self.setData({
        hidden: true,
        events: data
      })
    })
  }
})

然後開啟pages/detail/detail.js,修改如下

const util = require('../../utils/util.js')

Page({
  data:{
      hidden: false,
      detail: {}
  },
  onLoad:function(param){
    // 頁面初始化 param為頁面跳轉所帶來的引數
    var self = this
    util.getDetail(param.id).then(function(result){
        self.setData({
            detail: result[0]
        })
    })
  },
  onReady:function(){
    // 頁面渲染完成
    wx.setNavigationBarTitle({
        title: this.data.detail.title
    })
    this.setData({
        hidden: true
    })
  }
})

這裡我們呼叫了wx.setNavigationBarTitle方法動態設定導航欄的標題內容,需要注意的是必須在頁面渲染完成之後,即onReady之後才能呼叫該方法修改導航欄標題

這次教程就到這裡結束啦~涉及到的部分知識點並沒有詳細介紹和說明,如果有不明白的地方請大家根據我給出的連結去檢視詳細的介紹,此文權當快速上手的一個引子,更加深入的內容以及小程式的其他API的使用,還需要各位親自去實踐。

參考連結