1. 程式人生 > >微信小程式初步入坑指南

微信小程式初步入坑指南

微信小程式初步入坑小指南

安裝工具

app.json

為json格式的檔案,為一個配置檔案,屬於全域性的
初始化的檔案內容

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

pages

各個引數的解釋,pages為頁面,每一次更改頁面,增加或者新增加頁面都需要修改pages引數。不需要加字尾名,微信框架會自動新增字尾名。

window

對於全域性導航欄的設定。
navigationBarBackgroundColor 設定全域性的導航欄的顏色
navigationBarTitleText 設定導航欄的文字內容
navigationStyle 設定導航欄的樣式
backgroundColor 設定窗體的顏色,即下拉重新整理透露出的顏色
即需要設定 “enablePullDownRefresh”: true, 其布林值為true即可進行漏出設定的窗體顏色。
backgroundTextStyle 設定下拉的loding樣式

tabBar

app.json檔案如下

{
  "pages":[
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window":{
    "backgroundTextStyle":"dark",
    "navigationBarBackgroundColor": "#c7dbc8",
    "navigationBarTitleText": "小小",
    "navigationBarTextStyle":"whiter",
    "enablePullDownRefresh": true,
    "backgroundColor
": "#fceaea" }
, "tabBar": { "list": [{ "text": "ming", "pagePath": "pages/logs/logs" }, { "text":"home", "pagePath": "pages/index/index" }], "color": "#f8fcea", "backgroundColor": "#ff9999", "selectedColor": "#c5ff99", "borderStyle": "white", "position": "top" }, "functionalPages": true }

project.config.json

該檔案為一個本地的配置檔案
就是對於微信的一些設定

wxml模板

wxml ≈ html

感覺很像ejs,好吧

wxml中內容

<text>{{mesg}}</text>

在同路下的js檔案中

Page({
  data: {
    msg: "hello world"
  }
})

渲染出來的結果

js互動

Page({
  data: {
    msg: "hello world"
  },
  clickMe: function() {
    this.setData({msg: "3333"});
  }
})

wxml

<text>{{msg}}</text>
<button bindtap="clickMe">點選按鈕</button>

點選按鈕將會自動更新頁面的資料

小程式的啟動

客戶端開啟小程式之前,會把小程式全部下載到本地。
通過app.json可以知道頁面的啟動地址。
小程式只有一個app的例項,全域性共享。
啟動完成後觸發onLaunch事件,然後執行回撥函式
在小程式啟動完畢以後控制檯輸出內容

App({
  onLaunch: () => {
    console.log('小程式啟動完畢')
  }
})

上方進行了一次回撥

小程式的頁面

一個頁面有四個檔案,分別是json(配置檔案),wxml(頁面檔案,類似於html),js檔案(處理頁面的相關互動,和網頁類似)
js中有一個page,為一個頁面的構造器,渲染頁面的時候先裝載json檔案,配置當前的頂部導航,接著裝載wxml檔案,配置頁面的DOM,在裝載wxss,進行對頁面樣式的處理

和網頁的類似,都是同樣的

最後將會讀取js檔案,根據頁面中的page函式即構造器中的內容,將wxml和data進行繫結,渲染出結果,為mvvm

mvc 分別是模型層,檢視層,和控制器,當用戶請求到達以後,將會先經過路由,即入口檔案,即主檔案中的server.js檔案,接著進入lib目錄下的route.js檔案,對路由進行分發,路由在將資料傳遞給控制器,controller ,controller 收到請求以後再向model 索要資料,索要完成以後,在將資料導向view層,即ejs檔案的地方,渲染完成檔案以後返回給使用者。

 mvp 在mvc的基礎上,view中不寫邏輯,,在原先控制器的地方完成頁面的合併

mvvm 和mvp類似,只不過view和原先的控制器雙向繫結,即使用get 和 set方式,達到當資料更改的時候,進行回撥

元件

是滴,小程式採用元件化,例如生成地圖map即可

ps 在網頁中,生成地圖,需要引入第三方的js檔案,以及第三方的api,達到生成地圖的目的。

api 實現呼叫api的能力

api的回撥為非同步操作,所以呢,依舊要進行回撥

釋出者-訂閱模型

小程式的邏輯層

小程式使用的是js引擎進行渲染,邏輯層將資料傳送給檢視層,檢視層接受事件的反饋,開發者寫的所有檔案都會打包成為一份js檔案,小程式執行時啟動,小程式離開時銷燬,

吐槽 一些瀏覽器裡的js在微信小程式無法使用,小程式還有npm? 天哪,

註冊程式

app()函式,必須在app.js檔案中呼叫,接受一個object的引數

前臺後臺定義,當用戶點選左上角關閉的時候, 或者按住home離開微信,小程式,沒有銷燬,將會進入後臺,再次開啟進入前臺,當小程式進入後臺一段時間以後,系統資源佔用過高將會不定時的銷燬

onLaunch

程式碼如下

//app.js
App({
  onLaunch: (onlaunch) => {
    console.log(onlaunch)
  }
})

效果如下

即獲取頁面的引數

相比較網頁好輕鬆,,網頁還需要進行先字串分隔,然後再次以=進行分隔,然後將其迴圈,遍歷該陣列,將其儲存進入物件,完成。如果使用json字串進行傳,可能稍微方便一點

getAPP

getApp函式能獲取小程式的各種函式,即onLaunch等其他的一些函式
即獲取到小程式的一個例項

註冊頁面

page為一個建構函式,接受物件,用來對頁面進行初始化

data

data和渲染層,進行資料的繫結

onLoad

進行引數的傳值

Page({
  data: {
    msg: "hello world"
  },
  clickMe: function() {
    this.setData({msg: "3333"});
  },
  onLoad: (query) => {
    console.log(query);
  }
})

onShow

頁面切入的時候,將會進行顯示。
例: 按住home按鍵,在回到小程式介面的時候,將會回撥該註冊的函式

onReady

頁面渲染完成以後,將會回撥該函式

onHide

頁面切換的時候,將會回撥註冊的函式

onUnload

頁面解除安裝的時候,將會觸發

頁面事件

onPullDownRefresh

使用者下拉,需要設定onReachBottomDistance,即使用者下拉到頁面底部多少的時候,觸發該事件

onPageScroll

使用者滑動的距離,沒有正負之分

onShareAppMessage

使用者轉發的介面
在button元件中設定

open-type="share"

即可設定為轉發按鈕
需要有return進行返回引數

onTabItemTap

單擊tab將會觸發該內容

  onTabItemTap: (item)=>{
    console.log(item.index)
    console.log(item.pagePath)
    console.log(item.text)
  }

如果按住導航,將會進行輸出

當單擊元件的時候,發生事件

這一點終於和網頁類似了。網頁中也可以實現一個元素和事件進行相互的繫結

  viewTap: () => {
    console.log('您已經單擊按鈕')
  }
<button bindtap="viewTap">這是按鈕</button>

Page.route

當前頁面的路徑,類似於網頁的

window.location.href

可以獲取到當前頁面的url

  onShow: function() {
    console.log('頁面進行顯示切入前臺');
    console.log(this.route);
  },

當用戶切換tab的時候,將會立馬輸出當前頁面的path值
其中this指代當前的page,因為是在一個page函式內部

Page.prototype.setData

為page的繼承函式,將資料從邏輯層傳送到檢視層(非同步),this.data的值,(同步

ps 單純的改變this.data的值,不會起作用,因為頁面已經渲染完成,需要進行傳送到檢視層,進行更新檢視
ps 是的。小程式使用的就是mvvm

js

Page({
  data: {
    text0: "11111",
    text1: "22222",
    text2: "333333",
    text3: "444444"
  },
  changeText0: function() {
    this.setData({text0: "22222"})
  },
  changeText1: function () {
    this.setData({ text1: "33333" })
  },
  changeText2: function () {
    this.setData({ text2: "44444" })
  },
  changeText3: function () {
    this.setData({ text3: "55555" })
  },
})

wxml

<view>{{text0}}</view>
<button bindtap="changeText0">更改上方文字</button>
<view>{{text1}}</view>
<button bindtap="changeText1">更改上方文字</button>
<view>{{text2}}</view>
<button bindtap="changeText2">更改上方文字</button>
<view>{{text3}}</view>
<button bindtap="changeText3">更改上方文字</button>

路由

小程式中的路由是有框架達到的
框架用棧的方式維護了當前的所有頁面

ps 又見到棧了

getCurrentPages

該函式用於獲取當前頁面的棧,返回的是一個數組
適用於獲取上一個返回的頁面

全域性變數

js檔案中宣告的變數,和函式只在檔案中有用,不同檔案可以宣告相同的

ps 如果載入到一個頁面的時候,將會發生命名衝突

可以在app.js檔案中設定全域性的資料

// a.js
var app = getApp();
console.log(app.globalData)
//app.js
App({
  onLaunch: (onlaunch) => {
    console.log(onlaunch)
  },
  globalData: 333
})

模組化

類似於node.js的包
使用的同樣是exports進行介面的暴露

是滴,類比node.js即可,是滴,小程式還不支援引入npm包

然後就可以歡快的引入npm包了。

ps 貌似有個小坑。