资讯专栏INFORMATION COLUMN

微信小程序开发一周总结

DDreach / 541人阅读

摘要:编辑器我直接用其它编辑器同理,预览还是用的微信开发工具,语法高亮将设置成设置成也可以安装小程序相关插件开始写代码首先需要完整看完微信小程序文档框架,组件和,方便后面用到时查找。

编辑器

我直接用 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 文件放在同一个文件夹

模板可以直接 或者需要传值的使用 +

样式使用 @import 导入

js 使用 require 引入到页面,然后使用下面的 mergePage 来加载到页面对象中。

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);
  }
  // 可以在这里注册 `onLoad`,`onShow`等页面事件
}

组件里使用可以 this.setData 来更新页面数据,或者注册 onLoadonShow等页面事件,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);
  // Object.assign 需要添加 polyfill 兼容 Android(不支持数组参数展开)
  Object.assign.apply(null, 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;
}
Object.assign Android 上兼容问题

小程序里在 Android 上没有 Object.assign 这个,除了上面的 mergePage,其它地方也会经常用到。
我们可以到 app.js 里检测是否支持,然后添加 polyfill

// polyfill for Android before app starts
if(!Object.assign) {
  Object.assign = require("./utils/object-assign")
}

utils/object-assign.js 源码

// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
module.exports = function (target) {
  // We must check against these specific cases.
  if (target === undefined || target === null) {
    throw new TypeError("Cannot convert undefined or null to object");
  }

  var output = Object(target);
  for (var index = 1; index < arguments.length; index++) {
    var source = arguments[index];
    if (source !== undefined && source !== null) {
      for (var nextKey in source) {
        if (source.hasOwnProperty(nextKey)) {
          output[nextKey] = source[nextKey];
        }
      }
    }
  }
  return output;
};
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 中可以使用变量为 obj 对象的所有 key,以及 idname

模板字符串

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

let url = `${app.globalData.API_PREFIX}/cart/add`;
更多 es 6 特性

请参考:https://uedsky.com/2016-06/es6/

其它注意

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")
参考

https://mp.weixin.qq.com/debu...

原文地址:https://uedsky.com/2016-11/weixin-app/
获取最佳阅读体验并参与讨论,请访问原文

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80883.html

相关文章

  • 前端资源系列(3)-微信小程开发资源汇总

    摘要:微信小程序应用号开发资源汇总文档工具教程代码插件组件文档从搭建一个微信小程序开始小程序开发文档小程序设计指南工具小程序开发者工具官方支持微信小程序实时预览的支持的微信小程序组件化开发框架转在线工具小程序云端增强社区微信小程序 微信(小程序or应用号)开发资源汇总-文档-工具-教程-代码-插件-组件 文档 从搭建一个微信小程序开始 小程序开发文档 小程序设计指南 工具 小程序开发者...

    paney129 评论0 收藏0
  • 微信小程开发资源汇总 awesome-wechat-weapp(不定期更新)

    摘要:本文托管在上,不定期更新最后更新时间官方文档小程序开发文档小程序设计指南小程序开发者工具新闻报道微信正式开放内测小程序,不开发的日子真的来了氪关于微信小程序应用号,我能透露的几个细节可能吧你的产品适不适合做微信小程序你需要这篇产品逻 本文托管在github上,不定期更新:justjavac/awesome-wechat-weapp 最后更新时间:2016-09-24 06:22:10 ...

    lscho 评论0 收藏0
  • 微信小程资源汇总整理

    摘要:有问题可通过微博联系我开源项目微信小程序微信小应用资源破解文档微信小应用示例代码文档简易教程开发者工具文档文档视图组件文档常见问题教程微信小程序开发文档微信公众平台文档微信小程序怎么开发玩物志用一个上午上线了电商应用爱范儿 有问题可通过微博联系我: http://weibo.com/jinfali 开源项目 wechatApp-demo - 微信小程序 DEMO weapp-ide-...

    guqiu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<