1. 程式人生 > >微信小程式填坑篇(一)

微信小程式填坑篇(一)

微信小程式淺析中講到微信小程式原理以及怎麼新建一個hello world 工程,還挖了坑。現在把坑填上,捋一捋小程式的程式碼結構。看一下截圖:

全域性檔案

看一下目錄結構:
前面也說到,全域性檔案有且只有三個app.js、app.json、app.wxss。我們瞄一瞄裡面的內容:

app.js

//app.js
App({
  onLaunch: function () {
    //呼叫API從本地快取中獲取資料
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs'
, logs) }, getUserInfo:function(cb){ var that = this if(this.globalData.userInfo){ typeof cb == "function" && cb(this.globalData.userInfo) }else{ //呼叫登入介面 wx.login({ success: function () { wx.getUserInfo({ success: function (res) {
that.globalData.userInfo = res.userInfo typeof cb == "function" && cb(that.globalData.userInfo) } }) } }) } }, globalData:{ userInfo:null } })

可以看到,app.js裡面有個app方法負責註冊小程式,該方法接收一個object物件,該object物件包含小程式的全域性資料、全域性函式和生命週期函式等。比如globalData是全域性資料,getUserInfo為全域性函式、onLaunch是啟動時呼叫的生命週期函式。值得注意的是小程式只能再裡面註冊,並且在其他地方不要呼叫生命週期函式,生命週期函式應由微信內部呼叫,我們只負責實現。

app.json

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

hello world 一共有兩個頁面,都在page項裡都進行了配置,如果沒有進行配置的話微信將無法載入頁面,還有就是頁面檔案除了字尾名外都必須同名配置項及其屬性有很多,詳見框架->配置

app.wxss

/**app.wxss**/
.container {
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-between;
  padding: 200rpx 0;
  box-sizing: border-box;
} 

這個沒什麼好說的,主要負責全域性樣式。如果頁面的子樣式有屬性和全域性屬性重合,子樣式會覆蓋全域性樣式。其實這些跟css差不多,wxss是weixin style sheets的縮寫,但是它不支援css級聯選擇器,並且為了適配,引入了rpx作為單位,詳見框架->WXSS

頁面檔案

頁面檔案除了包含js、json、wxss外,還多了一個wxml檔案。前面三個和全域性配置的功能幾乎是一樣的,只不過作用域是在頁面而不是全域性,那我們看看wxml是個什麼鬼。這裡以index頁面為例:

index.wxml

<!--index.wxml-->
<view class="container">
  <view  bindtap="bindViewTap" class="userinfo">
    <image class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image>
    <text class="userinfo-nickname">{{userInfo.nickName}}</text>
  </view>
  <view class="usermotto">
    <text class="user-motto">{{motto}}</text>
  </view>
</view>

結合預覽檢視,可以看到,這是一個類似xml格式的頁面描述檔案—-wxml(WeiXin Markup Language 微信標記語言),為了後續的介紹,把剩下的兩個檔案也貼出來:

index.js

//index.js
//獲取應用例項
var app = getApp()
Page({
  data: {
    motto: 'Hello World',
    userInfo: {}
  },
  //事件處理函式
  bindViewTap: function() {
    wx.navigateTo({
      url: '../logs/logs'
    })
  },
  onLoad: function () {
    console.log('onLoad')
    var that = this
    //呼叫應用例項的方法獲取全域性資料
    app.getUserInfo(function(userInfo){
      //更新資料
      that.setData({
        userInfo:userInfo
      })
    })
  }
})

index.wxss

/**index.wxss**/
.userinfo {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.userinfo-avatar {
  width: 128rpx;
  height: 128rpx;
  margin: 20rpx;
  border-radius: 50%;
}

.userinfo-nickname {
  color: #aaa;
}

.usermotto {
  margin-top: 200px;
}

仔細觀察上面三個檔案,可以看到,wxml頁面的樣式是通過wxss控制的,類似於html與css。沒有什麼好說的,我們關鍵看看頁面檔案資料是如何和指令碼互動的。
在wxml中:

<text class="userinfo-nickname">{{userInfo.nickName}}</text>
<text class="user-motto">{{motto}}</text>

在js中:

data: {
    motto: 'Hello World',
    userInfo: {}
  }

也就是說頁面中的內容是通過{{content}}與js中data屬性中的content相對應。我們看看具體是怎麼更改的:

在頁面的onLoad方法中,呼叫app全域性物件的getUserInfo方法,並傳遞一個函式進去:

onLoad: function () {
    console.log('onLoad')
    var that = this
    //呼叫應用例項的方法獲取全域性資料
    app.getUserInfo(function(userInfo){
      //更新資料
      that.setData({
        userInfo:userInfo
      })
    })
  }

而在app的getUserInfo方法中:

getUserInfo:function(cb){
    var that = this
    if(this.globalData.userInfo){
      typeof cb == "function" && cb(this.globalData.userInfo)
    }else{
      //呼叫登入介面
      wx.login({
        success: function () {
          wx.getUserInfo({
            success: function (res) {
              that.globalData.userInfo = res.userInfo
              typeof cb == "function" && cb(that.globalData.userInfo)
            }
          })
        }
      })
    }
  }

這裡為什麼在登入收到使用者資料的時候使用setData方法設定而不是直接改變data屬性的值呢?因為框架–>註冊頁面中規定了只有通過setData才能改變this.data的值,並且頁面也會更新,直接改變data的值會造成資料的混亂。

總結

總的來說,微信小程式和web前端開發原理差不多。邏輯層由js控制,檢視層由wxml和wxss進行描述和渲染。獲取更詳細的框架資訊,請點選框架;獲取檢視元件,請點選元件;獲取微信提供的js介面,請點選 API

寫了一個多小時,有點小累,發現寫得也蠻長了,繼續挖坑,下一篇再依葫蘆畫瓢寫DEMO。

相關推薦

程式

在微信小程式淺析中講到微信小程式原理以及怎麼新建一個hello world 工程,還挖了坑。現在把坑填上,捋一捋小程式的程式碼結構。看一下截圖: 全域性檔案 看一下目錄結構: 前面也說到,全域性檔案有且只有三個app.js、app.json、app

程式日誌

indexOf 在wxml檔案中不能使用 Object.keys() toString() indexOf() ; 其中indexOf()方法在wxml中怎麼樣都返回undefined; textarea textarea在小程式中算是一個比較大的坑了;

程式開發基礎之請求、上傳、下載

針對前幾篇的基本的瞭解,然後我們首先要先學習和了解它的基本語法,我主要從API官網上學習,然後總結在這篇部落格中。供自己後期檢視。以備不時之需。因為自己也是初學者,很多的都是按照API來學習講解。 按照API的順序,我先學習網路的模組 一、請求:wx.request(OB

程式開發框架——WXSS

    WXSS語言決定了小程式頁面的各個元素在視覺上的展示,WXSS與CSS即為相試的、為了適合微信小程式開發WXSS對CSS進行相應的修改。     width:用來設定元素'寬度' / height:用來設定元素'高度 '/

程式入門學習筆記

入門級的跳轉格式: wx.redirectTo():不能返回上一層頁面 wx.navigateTo():用於頁面的跳轉 以上兩個不能跳轉於"tabBar" 因此跳轉"tabBar": wx.switchTab 感謝大佬的教程解答 了我的問題 以下附上原文連結 作者

程式學習之路

1、前言 微信小程式所使用的是騰訊自己開發的MINA框架,MINA框架跟主流框架有很大的相似之處,是一個MVVM框架,很慶幸本人先前有學過一點點VUE所以入門MINA框架還算比較順利,由於需要完全熟悉MINA框架我還需要學習很多,所以微信小程式學習之路篇打算一

程式入門到實戰

瞭解小程式 什麼是小程式? 小程式其實就是一個工具,為人提供便捷服務的;隨時可用,用完即走,減少桌面上面的app數量; B2C(人與商品) 淘寶 JD P2P(人與人)微信 QQ C2P(人與服務)微信小程式 支付寶小程式 什

程式從0-1flex佈局之理論

目錄 這篇文章主要介紹了Flex佈局,參考了這篇文章 搭建UI介面 對於iOS開發者來說,UI佈局可以使用座標(frame),也可以使用自動佈局。對於微信小程式來說,建議使用Flex佈局。 通過上一篇的學習,我們知道了.wxss是設

程式】媒體元件audio

週四沒有課,寫個部落格慶祝一下今天記錄一下audio的基本使用,首先看下效果圖。(聲音請腦補一下~)1.介紹一下audio屬性(來自微信官方文件)屬性名型別預設值說明idStringaudio 元件的唯一識別符號srcString要播放音訊的資源地址loopBooleanfa

程式----運動社群開發

微信小程式出來很久了,一直沒時間來學習這門新技術,去年年底有人寫了一個訂票的小程式專案,開發中遇到了問題,找到我看看能不能幫忙處理,其實當時自己什麼也不清楚,就找了個做過小程式的朋友大體瞭解了一下小程式,然後把對方的程式碼拿過來看了一下,竟然發現小程式前端的程式碼和以前的ht

程式之路:佈局適配方案rpx、px、vw、vh

因為小程式是以微信為平臺執行的,可以同時執行在android與ios的裝置上,所以不可避免的會遇到佈局適配問題,特別是在iphone5上,因為螢幕尺寸小的緣故,也是適配問題最多的機型,下面就簡單介紹幾種適配方法。 rpx適配 rpx是小程式中

程式之路:text空格符號以及省略號

1、text的空格符 首先需要設定<text> 控制元件的decode值 decode可以解析的有&nbsp; &lt; &gt; &amp; &

程式之路--2016.12.21 更新

今天又一次更新,繼續填坑了。。 更新概述 新增分享、模板訊息、客服訊息、掃一掃、帶引數二維碼(當前僅限開發者和體驗者使用)等功能新增 4 個新 API, 2個新元件拓展了 10 個元件屬性,新增 6 個元件事件修復數十個 API 以及元件 bug,優化部分互動體驗開發者工

程式之路登入獲取openid、unionid

在微信小程式中,因為各種各樣的原因我們會需要獲取到使用者的openid或者unionid下面就簡單來講一下在小程式中如何獲取openid和unionid。 步驟一:微信登入獲取登入憑證

程式之路之springmvc與程式的資料互動json

springmvc框架寫到現在終於牽扯到小程式了(所以別說我“不務正業”),對於一個應用程式來說,它的本質其實就是無數個對資料進行增刪改查的操作,這裡起到至關重要的就是資料,於是這篇帖子的目的就是實現小程式與後臺資料的互動。小程式使用的是wx.request的api來提交和接

程式之路:cover-view

在一些情況下,我們需要對map、video、canvas、camera這些微信小程式的原生控制元件,進行自定義,比如在camera上新增一個矩形線框作為拍照區域,這時我們就需要使用到cover-view

程式 記錄

本文由本人簡書搬遷至此,並做小幅修改。 老闆要讓做個小程式,並且很著急。於是邊學邊幹開始做微信小程式。 過程中遇到不少坑,前期時間太緊沒有記錄,後期憑記憶簡單記一下,防止再次入坑。 1.開發工具中,本地資原始檔名(資料夾路徑未測)對大小寫不敏感,拼錯仍然能正確顯示,但在真機上敏感,拼錯不

名Android開發者的程式之路(2)

前言 上一篇是九月二十七日寫的,而這一篇我動筆的時間是十月十日(特殊的日子),中間相隔十三天——當然是因為國慶節。說老實話,這十三天裡面我都沒有碰和小程式有關的東西——畢竟學習小程式的開發也只是起於興趣,而平時的工作並不會涉及與其相關的東西——但是在這十三天裡

程式之路(三)--上傳頭像

public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static Logger logger = LoggerFactory

名Android開發者的程式之路(1)

前言 首先要宣告的是,我是一名 Android 開發者,之前基本沒有前端開發經驗,甚至連 JS ,HTML 都是為了開發小程式現學的一些皮毛——所以文章中所提到的一些點也許在資深前端開發者看來只是小case,但是站在一個 Android 開發者的角度來看確實是