微信小程序開發一周總結

編輯器

我直接用 vscode(其它編輯器同理,預覽還是用的微信開發工具),語法高亮將 wxml 設置成 html, wxss 設置成 css

"files.associations": {
  "*.wxss": "css",
  "*.wxml": "html"
}

也可以安裝小程序相關插件

開始寫代碼

  • 首先需要完整看完微信小程序文檔(框架,組件和 API),方便后面用到時查找。

  • view 組件對應 html 里的 div

  • text 對應 span

  • wxss 里選擇器只支持 element, #id, .className, ::after, ::before

公用組件

項目目錄里新建 components ,按類似 pages 目錄結構,將每個組件的模板,樣式和 js 文件放在同一個文件夾

  • 模板可以直接 <include/> 或者需要傳值的使用 <import/> + <template></template>

  • 樣式使用 @import 導入

  • js 使用 require 引入到頁面,然后使用下面的 mergePage 來加載到頁面對象中。

    <!--more-->

mergePage

  • 組件的加載

const ErrorMsg = require('../../../components/error-msg/error-msg');
Page(util.mergePage({
  // 頁面 Page 方法...
  onLoad() {
    // 可以直接在頁面方法中調用 showErrorMsg 方法
  }
}, ErrorMsg/* 更多組件也可以*/));

使用 mergePage 方法將所有組件方法及頁面事件注冊到頁面對象

  • 組件的編寫方式

var errorTimer;

module.exports = { showErrorMsg(msg, cb) { clearTimeout(errorTimer); this.setData({ errorMsg: msg }); errorTimer = setTimeout( () => { this.setData({ errorMsg: false }); cb && cb(); }, 2000); } // 可以在這里注冊 onLoadonShow等頁面事件 }</code></pre>

組件里使用可以 this.setData 來更新頁面數據,或者注冊 onLoad , onShow 等頁面事件, mergePage 的最后一個參數的事件會最先調用。

  • mergePage 的源碼

/**

  • 合并 Page 對象所有的方法及事件
  • 子對象不能使用 data 屬性,請在 onLoad 中使用 setData 方法設置 */ function mergePage(dest, ...src) { let args = arguments; let eventsStack = { onLoad: [], onReady: [], onShow: [], onHide: [], onUnload: [], onPullDownRefresh: [], onReachBottom: [], }; // 保存所有的事件,最后一個參數的事件會最先調用。 for(let name in eventsStack) { for(let i = args.length - 1; i >= 0; i--) { args[i][name] && eventsStack[name].push(args[i][name]) } } Object.assign(...args); for(let name in eventsStack) { dest[name] = function() { for(let i = 0; i < eventsStack[name].length; i++) {
     eventsStack[name][i].apply(this, arguments);
    
    } } } return dest; }</code></pre>

    es 6

    箭頭函數,函數參數默認值及解析構

    wx.request({
    complete: ({data= {}}) => {
     // 1. 因為 wx.request 返回的接口數據是在 data 屬性里,這里我們只要 data 屬性就行了,所以直接參數解析構
     // 2. 如果 failed,無 data 時,data 將為默認值 {}
     if(data.code !== 0) {
       // do something if request failed
       return;
     }
     // 請求正常處理代碼
     // 3. 因為用的箭頭函數,回調里可以正常使用 this, 訪問 Page 對象的方法
     // 比如 this.setData(...)
    }
    })

    一些函數參數也可以直接使用默認參數。

    拓展運算符 和 對象屬性簡寫

    在給 template 傳 data 參數時,可以使用對象屬性簡寫,如

    <template is="..." data="{{...obj, id: otherIdVariable, name}}"></template>

    這樣 template 中可以使用變量為 obj 對象的所有 key,以及 id 和 name

    模板字符串

    小程序里可以直接方便的使用 es 6 模板字符串

    let url = `${app.globalData.API_PREFIX}/cart/add`;

    更多 es 6 特性

    其它注意

    • wx.showToast 圖標只支持"success"、"loading",錯誤提示得自定義

    • 如果 template 里面的變量沒值,請看 data 傳進來沒有。

    • 開發工具(v0.10.102800)可以用下面方法添加接口請求域名,遺憾的是微信里不行。

    // 放到 app.js 前面
    __wxConfig.projectConfig.Network.RequestDomain.push('https://weapp.juanpi.com');
    • 所有頁面的 JS 會在啟動時立即執行,而不是打開頁面才執行,所以一些寫在全局的代碼應該盡量放到 onLoad 之后,下面是從調試 source 里看到加載的代碼:

    define("pages/index/index.js", function(require, module, exports, window,document,frames,self,location,navigator,localStorage,history,Caches,screen,alert,confirm,prompt,XMLHttpRequest,WebSocket ){ 'use strict';

var app = getApp();

var util = require('../../../utils/util'); var ErrorMsg = require('../../../components/error-msg/error-msg'); var AddressPicker = require('../../../components/address-picker/address-picker');

Page(util.mergePage({ // 頁面代碼省略 }, AddressPicker, ErrorMsg)); //# sourceMappingURL=data:application/json;... });require("pages/index/index.js")</code></pre>

參考

 

來自:https://segmentfault.com/a/1190000007468931

 

 本文由用戶 FerminWRM 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!