微信小程序初体验
小程序最近太火,不过相比较刚发布时,已经有点热度散去的感觉,不过这不影响我们对小程序的热情,开发之前建议通读下官网文档,附链接:https://mp.weixin.qq.com/debug/wxadoc/dev/?t=201716
接下来,我们要实现的小程序效果如下,源码地址:https://github.com/caiya/weapp-ywgo:

1、注册
打开微信公众平台,单击“小程序”,按步骤开始注册即可,附地址:https://mp.weixin.qq.com/cgi-bin/registermidpage?action=index&lang=zh_CN

这里要注意的就是,小程序目前个人开发者无法单独注册,需要进行企业等资格认证,不过认证那里我们随意填写,认证通不通过并不影响我们开发,只是不能正式发布而已。

2、初始化项目
注册成功后,进入后台,有个appid、密钥,这两个添加到这里,最后点击确定即可:
3、项目结构
来看下wx自动生成的项目结构:

其中,pages用来放小程序中的各个页面,这些页面必须在app.json文件的pages参数中进行配置,static是我们自定义的用来存放静态文件的目录,比如一些image、style等,utils是工具文件夹,放置一些公共类方法,比如request请求封装、时间处理等,下面来主要介绍一下几个文件:
- app.js or page.js:app.js是全局的小程序类,page.js是各个页面层级的类,app.js的代码格式如下:
//app.js
const utils = require('./utils/util.js')
App({
onLaunch: function () {
},
getUserInfo(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)
}
})
}
})
}
},
getNewsInfo(typeId) {
var that = this;
return new utils.Promise((resolve, reject) => {
if (that.globalData.newsInfo && that.globalData.newsInfo["" + typeId]) {
resolve(that.globalData.newsInfo["" + typeId])
}
return utils.get({ "type": typeId }).then(res => {
if (!that.globalData.newsInfo) that.globalData.newsInfo = {};
that.globalData.newsInfo["" + typeId] = res.result.data;
resolve(res.result.data);
})
});
},
globalData: {
newsInfo: null,
userInfo: null
}
})
- 其中globalData属性是全局对象,各个page层级的都可以访问,getUserInfo、getNewsInfo是全局方法,所有page下均可调用,onLaunch事件是小程序app启动调用的事件,只走一次,类似的还有page下的onLoad、onShow等,分别表示页面加载后调用、页面显示即调用等。app.json文件是用来配置页面、窗体、tabBar等,比如我们这里配置底部工具栏四个,可如下配置:
{
"pages": [
"pages/hot/index",
"pages/my/index",
"pages/my/feedback/index",
"pages/my/information/index",
"pages/dynamic/index",
"pages/dynamic/detail"
],
"window": {
"backgroundTextStyle":"light",
"navigationBarBackgroundColor": "#4BC1D2",
"navigationBarTitleText": "业务GO",
"navigationBarTextStyle": "white"
},
"tabBar": {
"color": "#353535",
"selectedColor": "#4BC1D2",
"borderStyle": "black",
"backgroundColor": "#FFF",
"list": [
{
"pagePath": "pages/hot/index",
"text": "热点",
"iconPath": "static/images/icon@hot.png",
"selectedIconPath": "static/images/icon@hot-hover.png"
},
{
"pagePath": "pages/circle/index",
"text": "圈子",
"iconPath": "static/images/icon@coterie.png",
"selectedIconPath": "static/images/icon@coterie-hover.png"
},
{
"pagePath": "pages/tool/index",
"text": "工具",
"iconPath": "static/images/icon@tool.png",
"selectedIconPath": "static/images/icon@tool-hover.png"
},
{
"pagePath": "pages/my/index",
"text": "我的",
"iconPath": "static/images/icon@my.png",
"selectedIconPath": "static/images/icon@my-hover.png"
}
]
},
"networkTimeout": {
"request": 60000,
"downloadFile": 60000
}
}
- app.wxss:全局样式类,相同样式会被各个page下的样式覆盖。比较坑的一点是wxss中的样式部分特性不支持,比如background-image属性不支持项目本地路径,可使用base64或者网络图片地址替换,样式不支持层级调用等。默认有个page样式可修改页面层级的部分显示。
4、关于wx.request请求
小程序下面暂不支持es6语法,但是我们可以使用一些promise工具函数实现promise调用,比如可以自己封装promise版本的request请求如下:
const DOMAIN = 'https://v.juhe.cn/toutiao/index';
const KEY = 'c419699e576519892ebf87bbd3c8158c'; // 小程序上线需要https
function request(method, data = {}) {
data.key = KEY;
// wx.showNavigationBarLoading()
wx.showToast({
title: '加载中',
icon: 'loading',
duration: 10000
})
return new Promise((resolve, reject) => {
wx.request({
url: DOMAIN,
method: method,
data: data,
header: { 'content-type': 'application/json' },
method: method.toUpperCase(), // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
success: function (res) {
// wx.hideNavigationBarLoading()
wx.hideToast();
resolve(res.data)
},
fail: function (msg) {
console.log('reqest error', msg)
// wx.hideNavigationBarLoading()
wx.hideToast();
reject('fail')
}
})
})
}
然后导出即可外部使用:
module.exports = {
categories, Promise,
get: requestGet, post: requestPost, request,showLoading,requestDynamic
}
这里我们可以为每次请求添加“加载中”效果,很简单在每次请求前面添加如下代码:
wx.showToast({
title: '加载中',
icon: 'loading',
duration: 10000
})
请求结束后再次隐藏toast即可:
wx.hideToast();
5、关于免费api调用
小程序开发时我们难免会进行服务调用,首先必须在这里设置request请求的域名地址(wx规定域名必须是https的才行):

当然,免费的api还是有很多,不过大多数都是要进行认证的,不认证的话使用会有部分限制,不过短期不影响。
6、关于项目上传、审核
项目上传需要使用wx的开发工具:

扫码上传之后在这里我们就能看到上传的版本信息:

当然,上传之后是“开发版”,可以直接在此基础上进行提交审核或者选为体验版,体验版的话管理员账户可以自行指定体验者的微信账号,这样的话,即使小程序不发布,体验者也可以和开发者一样扫码预览项目效果,体验者的设置在这里进行:

7、关于数据渲染及页面传参
首先是数据渲染,每个页面的数据来源是page对象下的data属性,然后在页面里通过双大括号的方式进行数据渲染,了解模板引擎的一看就知道了,觉得小程序这种做法类似于一些mvvm框架,数据层修改数据会直接同步到视图层。当然渲染时支持条件判断、循环处理等,这些基本的功能没有少。
其次是页面跳转及传参,这里主要有2种方式,分别介绍如下:
一是使用navigator组件,该组件里面可包含一系列的view组件,navigator组件必须指定url属性,代表单击跳转地址(微信小程序不支持外链跳转,有点失望),使用如下:
<navigator url="detail?id={{item.id}}">
<template is="mainTabCell" data="{{item}}" />
</navigator>
这里detail即为某页面名称,参数传递类似get请求时参数拼接传递的方式,当然在js中进行数据获取也比较简单:
onLoad:function(options){
data_id = options.id;
//页面初始化 options为页面跳转所带来的参数
this.refreshNewData();
}
onLoad事件默认有个options参数,该参数navigator组件传过来的参数,然后进行处理即可。
二是页面跳转,小程序支持如下4种导航跳转:

参数传递的话直接写在其url属性上,类似如下:
wx.navigateTo({
url: 'test?id=1'
})
8、关于事件处理及分类
小程序中的事件总得分为2种,一种是冒泡、一种是非冒泡事件,使用bind开头绑定的事件为冒泡事件,意思是说如果同一个事件名称,上下两个页面层组件均绑定了该事件的话,那么底下组件的事件处理会先执行,然后再继续执行上层组件的相应代码;使用catch开头绑定的事件不冒泡,事件只会被处理一次。然后是事件对象,事件处理到达page下的js后,会默认传一个event对象,该对象类似如下:

比如如下代码:
<view class="sv__item {{ currentTab ==item.id ? 'active':'' }}" bindtap="changeCategory" data-id="{{ item.id }}" data-index="{{ item.index }}">
{{ item.name }}
</view>
我们使用了bindTap事件处理view单击,参数传递使用data-xxx='yyyy'的形式,其中xxx为key,相应的yyyy为传入的参数值,在事件处理中我们可以这样获取参数:
changeCategory: function (ev) {
var that = this;
var id = ev.currentTarget.dataset.id;
this.setData({
currentTopItem: ev.currentTarget.dataset.index
});
}
通过ev事件对象的currentTarget.dataset.xxx的形式获取xxx参数值即可,顺便说下,页面的参数设置一般使用setData方法进行,而globalData的设置可以直接通过getApp().globalData=xxx的形式即可。
9、关于模板使用
小程序提供模板功能,个人感觉类似于vue中的组件概念,模板可以被各个需要的页面进行引入调用,模板的定义使用如下方式:
<template name="msgItem">
<view>
<text> {{index}}: {{msg}} </text>
<text> Time: {{time}} </text>
</view>
</template>
在需要调用模板的页面通过以下代码片段使用:
<template is="msgItem" data="{{...item}}"/>
其中msgItem为模板定义时指定的name,item为传入的参数对象,该对象下有idnex、msg、time三个键值对。注意如果模板文件与调用不在同一个文件的话必须先进行模板文件的导入,直接在页面中使用import导入模板页面即可。
10、关于小程序调试
wx开发者工具自带调试功能,可直接对代码、样式文件、缓存等进行编辑查看,还支持console控制台打印:

总结:
1、流畅性:比H5的应用流畅性好,个人觉得相比原生还差一点,介乎两者之间
2、开发者工具:自动提示功能有限,大部分情况下要开发者自己手码
3、开发者工具里面看到的效果偶尔和微信里面看到的不同:比如图片预览、background-image图片显示等
4、登录方式各异:很多小程序都直接使用微信登录,也有自己做登录的,不是很统一
5、布局:小程序使用css3的flex布局,灵活性较高
6、巧用工具:小程序开发有些工具可以方便实用,比如wept,可以支持在浏览器中实时预览小程序页面布局效果,这样开发和设计可以分工开来了;又如wxParse,这个觉得比较强大,可以用来处理一些复杂详情页的数据显示等。
微信小程序初体验的更多相关文章
- 微信小程序初体验,入门练手项目--通讯录,部署上线(二)
接上一篇<微信小程序初体验,入门练手项目--通讯录,后台是阿里云服务器>:https://www.cnblogs.com/chengxs/p/9898670.html 开发微信小程序最尴尬 ...
- 【尝新】微信小程序初体验
文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/?t=1474644089434 根据文档地址中下载微信开发工具后,按照文档指引可以创建一个快速体验的小d ...
- 微信小程序初体验(上)
版权声明:本文由练小习原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/204 来源:腾云阁 https://www.qclo ...
- 微信小程序初体验,入门练手项目--通讯录,后台是阿里云服务器(一)
内容: 一.前言 二.相关概念 三.开始工作 四.启动项目起来 五.项目结构 六.设计理念 七.路由 八.部署线上后端服务 同步交流学习社区: https://www.mwcxs.top/page/4 ...
- 微信小程序初体验--封装http请求
最近看了一下微信小程序,大致翻了一下,发现跟angular很相似的,但是比angular简单的很多具体可参考官方文档 https://mp.weixin.qq.com/debug/wxadoc/dev ...
- 微信小程序初体验与DEMO分享
前言 前一段时间微信公布小程序,瞬间引来了大量的关注.博主的公司也将其定为目标之一,遂派本菜为先头兵(踩坑侠). 这次开发了一个比较完整的DEMO,模仿自某个APP首页,由于保护隐私的目的我把数据拷贝 ...
- 微信小程序初体验遇到的坑
今天,2017年1月9日凌晨,微信小程序如约上线.2007年1月9日,整整10年前的今天,苹果的iPhone手机正式问世! 经不起新技术的诱惑了,想试着开发一下看看.刚开始遇到很多坑,在这里记录一下, ...
- 微信小程序初使心得【微信小程序快速入门】
摘要: 2016年推出微信小程序,时至今日,历经几个版本的更新,已形成了相对实用和稳定的服务平台.本文简单的介绍了微信小程序的入门用法,今后会继续关注和实践. 2016年推出微信小程序,时至今日,历经 ...
- wx小程序初体验
小程序最近太火,不过相比较刚发布时,已经有点热度散去的感觉,不过这不影响我们对小程序的热情,开发之前建议通读下官网文档,附链接:https://mp.weixin.qq.com/debug/wxado ...
随机推荐
- GO学习笔记 - 包内首字母大写的名称是被导出的,才能被其它包代码调用!
在GO语言的任意包内,如果名称的首字母是大写的,意味着这个名称被导出,在其它包中可以使用“包名.名称”方式来调用,如果名称首字母不是大写,那么只能在这个包内部使用!这个概念还真是和以往接触的编程语言的 ...
- 超详细!CentOS 7 + Hadoop3.0.0 搭建伪分布式集群
超详细!CentOS 7 + Hadoop3.0.0 搭建伪分布式集群 ps:本文的步骤已自实现过一遍,在正文部分避开了旧版教程在新版使用导致出错的内容,因此版本一致的情况下照搬执行基本不会有大错误. ...
- Sublime关于tab转空格的设置技巧
在编写大的工程的代码的时候,会要求一些多余的字符不应该存在,比如说末尾不应该有空格或者Tab这样的字符,比如说所有的Tab应该变成空格,这样工程不管在什么样的编辑器下看,格式都会比较统一,等等,可是如 ...
- linux将指令加入开机启动或加入环境变量
以mongodb运行指令为例,/usr/local/webserver/mongodb/bin/mongo 1,linux将指令加入环境变量PATH 简单说PATH就是一组路径的字符串变量,当你输入的 ...
- var在PHP和JS中的使用
一,var在PHP中的使用 var在PHP中使用很少,只在类中声明成员变量时候,可以使用var,其相当于public,而且以后逐渐用public替代var,所以在PHP中尽量不使用var声明变量. 二 ...
- 干货 | 精选《SQL注入、渗透、反病毒》学习总结集锦给你们~
学到手的都是本事,如果觉得对你有帮助也欢迎分享给身边的基友们吧! 分享干货,手留余香哦~ 本次“开学季拜师活动”的徒弟们在师父的精心指导下,在短短5天内得到了迅速地成长,以前或当时遇到的问题都能够柳暗 ...
- sqlmap注入之tamper绕过WAF脚本列表
本文作者:i春秋作者——玫瑰 QQ2230353371转载请保留文章出处 使用方法--tamper xxx.py apostrophemask.py用UTF-8全角字符替换单引号字符 apostrop ...
- 为IEnumerable类型添加Add方法
IEnumerable类型原生是没有Add方法的,你可以用Contact方法去为它添加元素, 1 items = items.Concat(new[] { "foo" }); 也可 ...
- 使用服务器上的Jupyter notebook。
1.jupyter notebook --generate-config #产生配置文件 2.from notebook.auth import passwd #进入python环境,生成密码密文.第 ...
- VS 2010 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
终极解决方案:VS2010在经历一些更新后,建立Win32 Console Project时会出“error LNK1123” 错误,解决方案为将 项目|项目属性|配置属性|清单工具|输入和输出|嵌入 ...

