[关闭]
@langlibaitiao 2017-07-06T13:13:05.000000Z 字数 6787 阅读 1237

微信小程序Demo

微信小程序


一 获取小程序的AppId

1 注册微信公众平台账号,登录:https://mp.weixin.qq.com,就可以在网站的“设置”-“开发者设置”中,查看到微信小程序的 AppID 。

注意:如果要以非管理员微信号在手机上体验该小程序,那么我们还需要操作“绑定开发者”。即在“用户身份”-“开发者”模块,绑定上需要体验该小程序的微信号。本文档默认注册帐号、体验都是使用管理员微信号。

二 微信开发者工具

1 我们需要通过开发者工具,来完成小程序创建和代码编辑。开发者工具集成了开发调试、代码编辑及程序发布等功能。

2 开发者工具下载地址

三 创建项目

1 开发者工具安装完成后,打开并使用微信扫码登录。选择创建“项目”,填入上文获取到的 AppID,设置一个本地项目的名称(非小程序名称),比如“小程序demo”,并选择一个本地的文件夹作为代码存储的目录,点击“新建项目”就可以了。

2 在创建过程中,如果选择的本地文件夹是个空文件夹,开发者工具会提示,是否需要创建一个 quick start 项目。选择“是”,开发者工具会帮助我们在开发目录里生成一个简单的 demo。其中初始化了文件结构并包含了一些简单的文件。

3 项目创建成功后,我们就可以点击该项目,进入并看到完整的开发者工具界面,点击左侧导航,在“编辑”里可以查看和编辑我们的代码,在“调试”里可以测试代码并模拟小程序在微信客户端效果,在“项目”里可以发送到手机里预览实际效果。

四 小程序文件目录结构介绍

1 小程序文件格式介绍

在项目中我们可以看到四种文件类型:

.js后缀的文件是脚本文件,页面的交互等代码在这里实现;
.json后缀的文件是配置文件,主要是json数据格式存放,用于设置程序的配置效果;
.wxss后缀的是样式表文件,类似于前端中的css,用于对界面进行美化;
.wxml后缀的文件是页面结构文件,用于构建页面,在页面上增加控件。

2 pages目录介绍

pages:主要存放小程序的页面文件,其中每个文件夹为一个页面,每个页面包含四个文件,.wxml文件是界面文件,.js是事件交互文件,用于处理界面的点击事件等功能;.wxss为界面美化文件,让界面显示的更加美观;.json为配置文件,用于修改导航栏显示样式等,小程序每个页面必须有.wxml和.js文件,其他两种类型的文件可以不需要。

注意:文件名称必须与页面的文件夹名称相同,如index文件夹,文件只能是index.wxml、index.wxss、index.js和index.json.

3 utils目录介绍

3.1 该文件夹主要用于存放全局的一些.js文件,公共用到的一些事件处理代码文件可以放到该文件夹下,用于全局调用。

  1. module.exports = {
  2. formatTime: formatTime
  3. }

对于允许外部调用的方法,用module.exports进行声明,才能在其他js文件中用一下代码引入

  1. var util = require('../../utils/util.js')

然后就可以调用该方法。

4 app.js、app.json、app.wxss

app.js :小程序的脚本代码。我们可以在这个文件中监听并处理小程序的生命周期函数、声明全局变量。调用框架提供的丰富的 API,如本例的同步存储及同步读取本地数据。想了解更多可用 API,可参考 [API文档]

  1. //app.js
  2. App({
  3. onLaunch: function () {
  4. //调用API从本地缓存中获取数据
  5. var logs = wx.getStorageSync('logs') || []
  6. logs.unshift(Date.now())
  7. wx.setStorageSync('logs', logs)
  8. },
  9. getUserInfo:function(cb){
  10. var that = this
  11. if(this.globalData.userInfo){
  12. typeof cb == "function" && cb(this.globalData.userInfo)
  13. }else{
  14. //调用登录接口
  15. wx.login({
  16. success: function () {
  17. wx.getUserInfo({
  18. success: function (res) {
  19. that.globalData.userInfo = res.userInfo
  20. typeof cb == "function" && cb(that.globalData.userInfo)
  21. }
  22. })
  23. }
  24. })
  25. }
  26. },
  27. globalData:{
  28. userInfo:null
  29. }
  30. })

app.json : 是对整个小程序的全局配置。我们可以在这个文件中配置小程序是由哪些页面组成,配置小程序的窗口背景色,配置导航条样式,配置默认标题。注意该文件不可添加任何注释。更多可配置项可参考[配置详解]

部分配置解释:

此处tabBar下的list为底部列表栏配置;注意:tabBar如果设置,最少要两个,最多不能超过五个。

networkTimeout和debug可以设置各种网络请求的超时时间

debug:可以在开发者工具中开启debug模式,在开发者工具的控制台面板,调用信息以info的形式给出,其信息有page注册、页面路由、数据更新和时间触发,可以帮开发者快速定位一些常见信息。

  1. {
  2. "pages":[
  3. "pages/index/index",
  4. "pages/logs/logs",
  5. "pages/serviceList/serviceList",
  6. "pages/weather/weather"
  7. ],
  8. "window":{
  9. "backgroundTextStyle":"light",
  10. "navigationBarBackgroundColor": "pink",
  11. "navigationBarTitleText": "WeChat",
  12. "navigationBarTextStyle":"black"
  13. },
  14. "tabBar": {
  15. "list": [{
  16. "pagePath": "pages/index/index",
  17. "text": "首页"
  18. }, {
  19. "pagePath": "pages/logs/logs",
  20. "text": "日志"
  21. }, {
  22. "pagePath": "pages/weather/weather",
  23. "text": "天气"
  24. }],
  25. "color": "black",
  26. "backgroundColor": "pink",
  27. "selectedColor": "#fff",
  28. "borderStyle": "#ccc"
  29. },
  30. "networkTimeout": {
  31. "request": 20000,
  32. "connectSocket": 20000,
  33. "uploadFile": 20000,
  34. "downloadFile": 20000
  35. },
  36. "debug": true
  37. }

app.wxss : 全局的界面美化代码

  1. /**app.wxss**/
  2. .container {
  3. height: 100%;
  4. display: flex;
  5. flex-direction: column;
  6. align-items: center;
  7. justify-content: space-between;
  8. padding: 200rpx 0;
  9. box-sizing: border-box;
  10. }

5 程序与页面注册.js

1 小程序注册
App() 函数用来注册一个小程序。接受一个 object 参数,其指定小程序的生命周期函数等。

  1. //app.js
  2. App({
  3. //程序运行时执行一次
  4. onLaunch: function () {
  5. //调用API从本地缓存中获取数据
  6. var logs = wx.getStorageSync('logs') || []
  7. logs.unshift(Date.now())
  8. wx.setStorageSync('logs', logs)
  9. },
  10. //程序从后台进入前台运行时执行一次
  11. onShow: function () {
  12. },
  13. //程序进入后台时运行(按Home键)
  14. onHide: function () {
  15. },
  16. //我们自己写的代码
  17. getUserInfo:function(cb){
  18. var that = this
  19. if(this.globalData.userInfo){
  20. typeof cb == "function" && cb(this.globalData.userInfo)
  21. }else{
  22. //调用登录接口
  23. wx.login({
  24. success: function () {
  25. wx.getUserInfo({
  26. success: function (res) {
  27. that.globalData.userInfo = res.userInfo
  28. typeof cb == "function" && cb(that.globalData.userInfo)
  29. }
  30. })
  31. }
  32. })
  33. }
  34. },
  35. //全局函数,可以在其他页面通过接口获取到,全局使用的参数可以在这里进行声明
  36. globalData:{
  37. userInfo:null
  38. }
  39. })

全局参数可以在其他页面通过下面方法获取到

  1. var app = getApp();
  2. console.log(app. globalData)

2 注册一个页面

  1. Page({
  2. data:{
  3. info: 'welcome to 魔都'
  4. },
  5. onLoad:function(options){
  6. // 页面初始化 options为页面跳转所带来的参数
  7. },
  8. onReady:function(){
  9. // 页面渲染完成
  10. },
  11. onShow:function(){
  12. // 页面显示
  13. },
  14. onHide:function(){
  15. // 页面隐藏
  16. },
  17. onUnload:function(){
  18. // 页面关闭
  19. }
  20. })

Page({}),注册一个页面,这里我注册了一个欢迎页的界面,中间的代码为声明周期函数,可以不实现,但是Page({})结构必须创建。

注意:只有在data中声明的数据能够正常使用

五 本demo中的一些方法与属性

1 响应的数据绑定

整个系统分为两块视图层(View)和逻辑层(App Service)

框架可以让数据与视图非常简单地保持同步。当做数据修改的时候,只需要在逻辑层修改数据,视图层就会做相应的更新。

通过这个简单的例子来看:

index.wxml文件下:

  1. <view class="usermotto">
  2. <text class="user-motto">Hello {{motto}}</text>
  3. </view>
  4. <button bindtap="changeName">Click me!</button>
  5. <view bindtap="bindViewService" class="userservice">
  6. <text class="user-service">Hello {{serviceInfo}}</text>
  7. </view>

index.js文件下:

  1. //index.js
  2. //获取应用实例
  3. var app = getApp()
  4. Page({
  5. data: {
  6. motto: '综合服务生活平台',
  7. clickData: '点我试试',
  8. userInfo: {}
  9. },
  10. changeName: function (e) {
  11. this.setData({
  12. motto: "智橙生活",
  13. clickData: '试试就试试',
  14. })
  15. },
  16. onLoad: function () {
  17. var that = this
  18. //调用应用实例的方法获取全局数据
  19. app.getUserInfo(function(userInfo){
  20. //更新数据
  21. that.setData({
  22. userInfo:userInfo
  23. })
  24. })
  25. }
  26. })

2 页面代码

pages/weather/weather.js

  1. var util = require('../../utils/util.js')
  2. Page({
  3. data: {
  4. //数据初始化
  5. date: util.formatTime(new Date()),
  6. weather: {},
  7. loading: false
  8. },
  9. onLoad:function(options){
  10. // 页面初始化 options为页面跳转所带来的参数
  11. var vm = this;
  12. setInterval(function(){
  13. vm.setData({
  14. date: util.formatTime(new Date())
  15. });
  16. }, 1000);
  17. },
  18. onReady:function(){
  19. // 页面渲染完成
  20. },
  21. onShow:function(){
  22. // 页面显示
  23. var vm = this;
  24. //请求数据
  25. wx.request({
  26. url: 'http://apistore.baidu.com/microservice/weather',
  27. header: {
  28. 'Content-Type': 'application/json'
  29. },
  30. success: function(res) {
  31. console.log(res.data);
  32. vm.setData({
  33. weather:res.data
  34. });
  35. }
  36. });
  37. },
  38. updateWeather: function () {
  39. var vm = this;
  40. vm.setData({
  41. loading: !vm.data.loading
  42. });
  43. wx.request({
  44. url: 'http://apistore.baidu.com/microservice/weather',
  45. header: {
  46. 'Content-Type': 'application/json'
  47. },
  48. success: function(res) {
  49. vm.setData({
  50. weather:res.data,
  51. loading: !vm.data.loading
  52. });
  53. }
  54. });
  55. },
  56. onHide:function(){
  57. // 页面隐藏
  58. },
  59. onUnload:function(){
  60. // 页面关闭
  61. }
  62. })

pages/weather/weather.json

  1. {
  2. //头部标题栏
  3. "navigationBarTitleText": "全国天气查询"
  4. }

pages/weather/weather.wxml

  1. <!--pages/weather/weather.wxml-->
  2. <view class="container-weather">
  3. <text>{{weather.date}}</text>
  4. <view class="weather" style="flex-direction:row;">
  5. <text class="text-weather">{{weather.weather}}, {{weather.wind}}</text>
  6. <image class="icon-weather" src="{{weather.dayPictureUrl}}" background-size="cover"></image>
  7. </view>
  8. <text class="text-weather">温度: {{weather.temperature}}</text>
  9. <view>
  10. <text class="tips-weather">{{weather.tipt.tipt}}: </text>
  11. <text class="tips-desc">{{weather.tipt.des}}</text>
  12. </view>
  13. <view class="button-wrapper">
  14. <button bindtap="updateWeather" loading="{{loading}}">刷新</button>
  15. </view>
  16. </view>

pages/weather/weather.wxss

  1. //pages/weather/weather.wxss
  2. .container-weather {
  3. padding: 30px;
  4. }
  5. .weather {
  6. height: 30px;
  7. display: flex;
  8. }
  9. .text-weather {
  10. line-height: 30px;
  11. padding-right: 30px;
  12. }
  13. .icon-weather {
  14. width: 42px;
  15. height: 30px;
  16. border-radius: 50%;
  17. }
  18. .button-wrapper {
  19. position: absolute;
  20. bottom: 50px;
  21. left: 30px;
  22. width: 100%;
  23. }

至此:一个简单的小demo就完成了。


更多信息
[微信公众平台开发者社区]
[框架、组件、API、工具]
[微信小程序联盟]

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注