小程序学习(一)

Author Avatar
Eric Yin 8月 22, 2017
  • 在其它设备中阅读本文章

通过本节的学习对小程序有个大概的认识和了解,具体见本节知识点。

本节知识点

  • 初步了解小程序
  • 下载开发工具
  • 获取APPID
  • 了解对应文件的作用

小程序的概述

微信小程序是运行在微信环境中的应用,它只能在微信中运行。不能运行在浏览器中,微信小程序提供了专门的开发工具。用于微信小程序的开发,还提供了丰富的API,让我们的小程序能够具备与手机设计和微信交互的能力。比如获取摄像头拍照,访问文件系统等等。那么与微信交互主要体现在三个方面

  • 获取登录微信用户的用户信息
  • 微信支付
  • 使用模板消息向微信发送通知消息

第一步 获取开发小程序的APPID

  • 点击注册选择小程序即可。这里需要用户手拿身份证注册拍照,获取认证。具体步骤请见百度
  • 点击 登陆就可在网站的”设置” - “开发者设置”中,查看到微信小程序的AppId,注意不可直接使用服务号或者订阅号的APPID

查到APPID

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

第二步 下载小程序的开发工具

  • 为了更简单,更方便的开发小程序只有使用微信自带的开发者工具了,WeStrom,SublimeText,等等都不支持. 点击下载此工具
  • 安装不用多说了。直接下一步就好了。安装好以后每次登陆的时候必须要联网,必须要扫码。单机无法操作 具体使用步骤请看第二节开发工具的使用

第三步 创建第一个项目

  • 当用微信扫码登陆,选择创建”项目”,填入刚才获取的APPID,设置一个本地项目的名称(非小程序名称),比如”我的第一个项目”,并选择一个本地的文件夹作为代码的存储的目录,点击”新建项目”就可以了.
  • 在创建过程中,如果选择的本地文件夹是个空文件夹,开发者工具会提示:是否需要创建一个quick start目录,在这个项目上选择勾,开发者工具会自动在开发目录里生成一个简单的demo

创建项目

第四步 简要说说个个文件的作用。后续会说明的。

文件的作用

小程序项目在根目录必不可少的3个文件:

  • app.js
  • app.json
  • app.wxss

app.js

app.js是小程序的脚本代码,我们可以在文件中监听并处理小程序的生命周期函数,声明全局变量,调用框架提供的丰富的API,具体的后续请参照小程序API文档。

//app.js
App({
  onLaunch: function () {
    // 展示本地存储能力
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)

    // 登录
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
      }
    })
    // 获取用户信息
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
          wx.getUserInfo({
            success: res => {
              // 可以将 res 发送给后台解码出 unionId
              this.globalData.userInfo = res.userInfo

              // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
              // 所以此处加入 callback 以防止这种情况
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res)
              }
            }
          })
        }
      }
    })
  },
  globalData: {
    userInfo: null
  }
})

app.json

app.json是对整个小程序的全局配置。我们可以在这个文件中配置小程序是由哪些页面组成,配置小程序的窗口背景色,配置导航条样式,配置默认标题。(JSON包)

重要的事情说三遍。这里特别注意不可以加任何注释! 不能加任何注释! 不能加任何注释!

{
  "pages":[
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "WeChat",
    "navigationBarTextStyle":"black"
  }
}

app.wxss

app.wxss是整个小程序的公共样式表。我们可以在页面组件的class属性上直接使用app.wxss样式规则
(类似里面的CSS文件)

/**app.wxss**/
.container {
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-between;
  padding: 200rpx 0;
  box-sizing: border-box;
}

上面3个是通配每见一个小程序都必须要有的。下面说的是单独怎么建页面


自创页面

自创的页面都只能在pages目录下面。微信小程序的每一个页面的[路径+页面名]都需要写在app.json的pages中,且pages中的第一个页面是小程序的首页.

每一个小程序是由同路径下同名的四个不同后缀文件的组成:如index.js,index.wxml,index.wxss,index.json
.js后缀的文件是脚本文件。
.json后缀的文件是配置文件
.wxss后缀是样式表文件
.wxml后缀的文件就是页面结构文件.

index.wxml是页面的结构文件

<!--index.wxml-->
<view class="container">
  <view class="userinfo">
    <block wx:if="{{hasUserInfo}}">
      <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image>
      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
    </block>
    <button wx:else open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
  </view>
  <view class="usermotto">
    <text class="user-motto">{{motto}}</text>
  </view>
</view>

本例中使用了 来搭建页面结构,绑定数据和交互处理函数。

index.js是页面的脚本文件,在这个文件中我们可以监听并处理页面的生命周期函数,获取小程序实例,声明并处理数据,响应页面交互事件等。

//index.js
//获取应用实例
const app = getApp()

Page({
  data: {
    motto: 'Hello World',
    userInfo: {},
    hasUserInfo: false
  },
  //事件处理函数
  bindViewTap: function() {
    wx.navigateTo({
      url: '../logs/logs'
    })
  },
  onLoad: function () {
    if (app.globalData.userInfo) {
      this.setData({
        userInfo: app.globalData.userInfo,
        hasUserInfo: true
      })
    } else {
      // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
      // 所以此处加入 callback 以防止这种情况
      app.userInfoReadyCallback = res => {
        this.setData({
          userInfo: res.userInfo,
          hasUserInfo: true
        })
      }
    }
  },
  getUserInfo: function(e) {
    this.setData({
      userInfo: e.detail.userInfo,
      hasUserInfo: true
    })
  }
})

index.wxss是页面的样式表:

/**index.wxss**/
.userinfo {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.userinfo-avatar {
  width: 128rpx;
  height: 128rpx;
  margin: 20rpx;
  border-radius: 50%;
}

.userinfo-nickname {
  color: #aaa;
}

.usermotto {
  margin-top: 200px;
}

页面的样式表是非必要的,当有页面样式表时,页面的样式表中的样式规则会层叠覆盖app.wxss中的样式规则,如果不指定页面的样式表,也可以在页面的结构文件中直接使用app.wxss中指定的样式规则

index.json是页面的配置文件

页面的配置文件是非必要的。当有页面的配置文件时,配置项在该页面会覆盖app.json的window中相同的配置项。如果没有指定的页面配置文件,则在该页面直接使用app.json中的默认配置。

logs的页面结构

<!--logs.wxml-->
<view class="container log-list">
  <block wx:for="{{logs}}" wx:for-item="log">
    <text class="log-item">{{index + 1}}. {{log}}</text>
  </block>
</view>

logs页面使用控制标签来组织代码,在上使用wx:for绑定logs数据,并将logs数据循环展开节点

//logs.js
const util = require('../../utils/util.js')

Page({
  data: {
    logs: []
  },
  onLoad: function () {
    this.setData({
      logs: (wx.getStorageSync('logs') || []).map(log => {
        return util.formatTime(new Date(log))
      })
    })
  }
})

运行结果如下:
运行结果

手机预览

开发者工具左侧菜单栏选择”项目”点击预览,扫码后即可在微信客户端中体验。
运行结果