人的一生90%的时间都在做着无聊的事情,社会的发展使得我们的闲暇时间越来越多,我们把除了工作的其他时间放在各种娱乐活动上。

程序员有点特殊,他们把敲代码看成娱乐活动的一部分,以此打发时间的不占少数。这不最近无聊搞了一个口袋吉他小程序,使用bmob后端云提供数据存储服务,除吉他谱图片,其他图片存储在七牛

关于bmob小程序开发文档请戳这里,文档详细简练,主要是缩短了开发周期,不过对于复杂的项目,还是推荐使用自己服务器提供数据服务。

使用微信扫描二维码预览



源码地址:https://github.com/alex1504/wx-guita_tab

下面分点分享下小程序的开发过程中的关键点及感受,说明:

  1. 小程序标签统称组件,Html标签统称元素。
  2. 部分内容会与vuejs及jQuery作对比

使用iconfont字体图标

新建项目并添加图标



在app.wxss中以unicode方式引入

  1. @font-face {
  2. font-family: 'iconfont'; /* project id 431644 */
  3. src: url('//at.alicdn.com/t/font_431644_aahynh26y6lp7gb9.eot');
  4. src: url('//at.alicdn.com/t/font_431644_aahynh26y6lp7gb9.eot?#iefix') format('embedded-opentype'),
  5. url('//at.alicdn.com/t/font_431644_aahynh26y6lp7gb9.woff') format('woff'),
  6. url('//at.alicdn.com/t/font_431644_aahynh26y6lp7gb9.ttf') format('truetype'),
  7. url('//at.alicdn.com/t/font_431644_aahynh26y6lp7gb9.svg#iconfont') format('svg');
  8. }

定义通用icon样式,定义伪元素

  1. .icon{
  2. display: inline-block;
  3. font-family: 'iconfont';
  4. }
  5. .icon-home::before{
  6. content: "\e600";
  7. }

使用

  1. <view class="icon icon-home"</view>

小程序事件绑定及处理器

小程序并没有类似vuejs的v-model进行双向绑定,使用bindinput类似jQuery监听input事件在事件处理器中更新数据,通过event对象e.data.value即可获得input的值。

  1. // bindconfirm监听键盘回车事件,focus属性聚焦渲染组件时会自动弹出手机软键盘
  2. <input type='text' placeholder='歌曲名 / 歌手' bindinput='bindSearchInput' bindconfirm='onSearch' focus></input>
  1. bindSearchInput(e) {
  2. this.setData({
  3. searchTxt: e.detail.value
  4. })
  5. }

小程序中的事件处理器并不能像vue一样传入参数,因为事件处理器只有一个默认的参数event对象,在for循环的组件中如果要想获取元素绑定的id,可以通过和jQuery相同的方式绑定data属性。

  1. <!-- 轮播图 -->
  2. <swiper indicator-dots="{{indicatorDots}}" autoplay="{{autoplay}}" interval="{{interval}}" duration="{{duration}}">
  3. <block wx:for="{{banner_list}}" wx:key="{{index}}">
  4. <swiper-item bindtap="navigateToDetail" data-id="{{item.href}}">
  5. <image src="{{item.image}}" class="slide-image" mode="widthFix"></image>
  6. </swiper-item>
  7. </block>
  8. </swiper>

获取id:

  1. //事件处理函数
  2. navigateToDetail: function (e) {
  3. const id = e.currentTarget.dataset.id;
  4. }

阻止事件冒泡

  1. bindtapbindlongtapbindtouchstartbindtouchmovebindtouchendbindtouchcancle

对应阻止冒泡事件将bind用catch替代

setData

小程序的视图更新需要调用setData修改绑定数据,直接对数据进行修改是不会触发视图层更新的。setData接受一个对象,为需要添加或修改的属性。属性名有点特殊,[]中的值会被识别为变量,因此如果要对对象数组中的某个属性进行修改,只能预先拼接好属性名。

错误做法:

  1. // 视图不更新
  2. this.data.searchSongs[index].love_flag': 2
  3. // SyntaxError: unknown: Unexpected token
  4. this.setData({
  5. 'searchSongs[' + index + '].love_flag': 2
  6. })

正确做法:

  1. setSongFlag(e) {
  2. // 注意setData属性名[]中的非整数值会被识别为变量
  3. let key = 'searchSongs[' + index + '].love_flag'
  4. this.setData({
  5. [key]: 2
  6. })

关于image组件

小程序wxss的background-image及image组件都不支持本地url

在H5的开发中,通常我们会将页面一些不需要根据容器大小来选择显示方式的图片使用img标签,需要一些特殊显示方式的使用background。但小程序只需要image组件便可。它提供的mode属性和背景定义图片及img元素控制图片显示方式对比

mode属性 background-size html img元素
scaleToFill 100%,100%(默认) width:100%;height:100%
aspectFit contain js实现
aspectFill cover js实现
widthFix 100%, auto width: 100%;

其他的top、bottom、right、left等不缩放图片调整位置的属性与background-position作用相同,img元素则只能通过定位控制。

小程序API异步方案

如果没有强迫症,小程序API使用默认回调的方式即可;另外由于小程序只支持es6,不支持async及await,也可以将API封装成promise的方式,参考funnycoder的这篇文章

  1. function promiseify(func) {
  2. return (args = {}) => {
  3. return new Promise((resolve, reject) => {
  4. func.call(wx, Object.assign(args, {
  5. success: resolve,
  6. fail: reject,
  7. }));
  8. })
  9. }
  10. }
  11. for (const key in wx) {
  12. if (Object.prototype.hasOwnProperty.call(wx, key) && typeof wx[key] === 'function') {
  13. wx[`_${key}`] = promiseify(wx[key]);
  14. }
  15. }

小程序问题

  • 调试器没有css快捷提示功能和颜色面板,影响布局及颜色调整效率(随性派)
  • 无法引入第三方js库
  • 内置组件单调,没有考虑字体数量比较多时的自适应情况
  • 不支持跳转外部链接
  • 背景图片或者image组件不能用本地图片

关于小程序审发布或更新

小程序上线需要经过审核、发布两个过程。

审核通过后有全量更新、或者分阶段发布,小程序才会更新,首次发布没有选项。

全量发布:即时向全量微信用户发布新版小程序。

分阶段发布:新版小程序将在15天内以开发者自定义比例,向微信用户发布更新

详情见知乎:发布小程序时选择全量发布和分阶段发布是什么意思?

不得不说小程序审核速度是非常快的,即便是个人申请(相比以企业账号申请会有应用服务类型限制),通常小程序没有涉及政策不允许的内容或者超过小程序允许的应用服务类型,都是可以顺利通过,初次体验,即便在国庆期间,也是有工作团队进行审核,审核时间通常在几小时内。

未完待续

一直关注着小程序,一直处于不愠不火的状态,但微信团队一直坚持在更新。从小程序的历史更新日志可以看到,无论是开发工具、基础库、与原生硬件交互API都在不断的更新或者修复异常bug,有时间希望做些与硬件交互更有趣的小程序和大家分享。

这个简易小程序将加入评论功能,用户系统功能、曲谱本地收藏、分享、改善图片加载、滑动位置保存等功能及问题,借此熟悉小程序开发以便做出更有趣的东西出来,因此本篇文章随开发过程持续更新。

希望这篇分享对你有所帮助,更希望能与同样热爱前端的你交流心得体会抑或工作经历、困扰等,欢迎知乎私信或邮件交流。

知乎:https://www.zhihu.com/people/huzerui

邮箱:me@huzerui.com

基于bmob后端云小程序开发——口袋吉他的更多相关文章

  1. $微信小程序开发实践点滴——接入Bmob后端云

    Bmob后端云官网:http://www.bmob.cn/ 微信公众平台官网:https://mp.weixin.qq.com/ 微信小程序官方开发文档:https://mp.weixin.qq.co ...

  2. 微信小程序 + Bmob后端云

    闲暇之余,写了一个私人的小程序,但由于带有商品.订单功能被拒了(腾讯太狗带了,只有商家才可以使用这种功能),没办法,不给过审,那就拿出来分享一下. 原本想的是做一个超市类的电商平台,带有下单支付等功能 ...

  3. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

    Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...

  4. $微信小程序开发实践点滴——Bmob基本REST API的python封装

    Refer:Bmob后端云REST API接口文档:http://docs.bmob.cn/data/Restful/a_faststart/doc/index.html 本文使用python对Bmo ...

  5. $微信小程序开发实践点滴——Bmob常用API的使用

    Bmob后端云官网:http://www.bmob.cn/ Bmob后端云微信小程序开发文档:http://docs.bmob.cn/data/wechatApp/b_developdoc/doc/i ...

  6. 小程序开发初体验,从静态demo到接入Bmob数据库完全实现

    之前我胖汾公司年会.问我能不能帮忙搞个小程序方便他们进行游戏后的惩罚/抽奖使用.出了个简单的设计图.大概三天左右做了个简单的小程序.目前提交审核了.对于写过一小段时间vue来说小程序很容易上手.写法和 ...

  7. 【好好编程-技术博客】微信小程序开发中前后端的交互

    微信小程序开发中前后端的交互 微信小程序的开发有点类似与普通网页的开发,但是也不尽然相同.小程序的主要开发语言是JavaScript,开发同普通的网页开发有很大的相似性,对于前端开发者而言,从网页开发 ...

  8. 微信小程序开发平台新功能「云开发」快速上手体验

    微信小程序开发平台刚刚开放了一个全新的功能:云开发. 简单地说就是将开发人员搭建微信小程序后端的成本再次降低,此文刚好在此产品公测时,来快速上手看看都有哪些方便开发者的功能更新. 微信小程序一直保持一 ...

  9. 微信小程序开发(三)----- 云开发案例

    1.发送请求 2.云函数中发送请求,例子request https://github.com/request/request-promise    创建云函数movielist,右键在终端打开,输入  ...

随机推荐

  1. 【风马一族_软件】微软卸载工具_msicuu2.exe

    msicuu2.exe是微软的Windows Installer清理工具,可以用来清理微软安装包软件产生的垃圾,当然也可以拿来作为修复相关软件的卸载准备使用 下载链接:http://files.cnb ...

  2. Python中的动态继承

    所谓动态继承,是指代码运行时再决定某个类的父类.某些场景下会用到,比如threading.Thread和multiprocessing.Process这两个类有很多同名的接口,可以实现某个子类动态继承 ...

  3. python爬虫:一些爬虫常用的技巧

    1.基本抓取网页 get方法 import urllib2 url = "http://www.baidu.com" response = urllib2.urlopen(url) ...

  4. Pycurl介绍

    pycurl — A Python interface to the cURL library Pycurl包是一个libcurl的Python接口.pycurl已经成功的在Python2.2到Pyt ...

  5. hdu2516 博弈

    找规律,发现时斐波那契数列:打表上. #include<stdio.h> #include<string.h> #define maxn 2147483647 __int64 ...

  6. 洛谷P4126 [AHOI2009]最小割

    题目:洛谷P4126 [AHOI2009]最小割 思路: 结论题 在残余网络上跑tarjan求出所有SCC,记id[u]为点u所在SCC的编号.显然有id[s]!=id[t](否则s到t有通路,能继续 ...

  7. 【uml】之类图中的关系 标签: uml图形类 2014-11-29 09:02 1198人阅读 评论(23)

    uml早就画完了图,但是自己迟迟没有总结,因为总觉的自己把握的不到位,虽然现在也还是不到位,废话少说,上篇博客总结了用例图中的几种关系,这篇就讨论一下类图中的几种关系. 在uml的所有图中,就我目前的 ...

  8. datetimepicker —— 日期选择控件

    一.依赖 <link rel="stylesheet" href="css/bootstrap.min.css"> <link rel=&qu ...

  9. 1<<33这种写法是错的!!!

    1<<33不能这么写,1默认int类型,应该改为(long long)1<<33

  10. Android Service Summary

     In the Androird, service is a none-UI background process that is doing some specific jobs.   6.1 Ex ...