美文网首页
20180725 理解小程序demo

20180725 理解小程序demo

作者: 瑶九九 | 来源:发表于2019-03-19 13:03 被阅读0次

project.config.json

{
    "description": "项目配置文件。",
    "packOptions": {
        "ignore": []
    },
    "setting": {
        "urlCheck": true,
        "es6": true,
        "postcss": true,
        "minified": true,
        "newFeature": true
    },
    "compileType": "miniprogram",
    "libVersion": "2.2.0",
    "appid": "wxda53c29f7eac23e5",
    "projectname": "%E5%8F%AE%E5%92%9A%E4%B8%80%E4%B8%80",
    "isGameTourist": false,
    "condition": {
        "search": {
            "current": -1,
            "list": []
        },
        "conversation": {
            "current": -1,
            "list": []
        },
        "game": {
            "currentL": -1,
            "list": []
        },
        "miniprogram": {
            "current": -1,
            "list": []
        }
    }
}

设置该小程序的配置文件

app

app.json

小程序启动前,会加载代码到本地。

 "pages":[
    "pages/index/index",
    "pages/logs/logs"
  ]

首先顺序读取全局app.json里的pages,按顺序依次了解小程序所有将要用到的页面及其相对路径。

"window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "WeChat",
    "navigationBarTextStyle":"black"
  }

通过window的设置,对导航栏标题风格、文字风格等以及背景字的风格进行设置

app.wxss

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

类似html上的css,设置页面的公共样式

app.js

//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.js代码全部由onLaunch一个方法参数构成,当小程序启动后,onLaunch函数就会自动执行,用来判断用户是否取得权限及后续的获取用户信息,并设置globalData参数

index

按照app.json中pages的顺序
第一个页面为pages/index/index
由于index文件下没有设置json,即沿用app.json配置生成一个界面

index.wxml+index.wxss

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

用wxml设置页面结构

/**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;
}

利用wxss设置页面结构内各个组成部分的大小、颜色等性质

index.js

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

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

这个页面最后载入index.js进行渲染
通过getApp()函数获得当前的app实例,page作为页面构造器,把data和wxml一起渲染,渲染完成后即为第一个页面
如果用户还没有登录,会出现一个按钮,点击“获取头像昵称”的按钮,出发index.js中的getUserInfo函数,获取用户信息并将这些信息传到视图层
如果用户已经登陆过,并点击头像,会触发index.js中的bindViewTap函数,然后该页面将被隐藏,logs页面开始加载并显示出来

logs

logs.json

{
  "navigationBarTitleText": "查看启动日志"
}

更改和app.json不同的地方,重新配置生成一个界面

logs.wxml+logs.wxss

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

装载这个页面的wxml结构和wxss样式
这里已经提出了logs数组,遍历该数组并输出

logs.js

//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))
      })
    })
  }
})

最后装载logs.js
在这里的data下才申明logs为空数组
并利用onLoad函数,获取当前的登陆时间
在该js开头引用了utils文件下的util.js,用来格式化时间

utils

util.js

const formatTime = date => {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()

  return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}

const formatNumber = n => {
  n = n.toString()
  return n[1] ? n : '0' + n
}

module.exports = {
  formatTime: formatTime
}

创建多个变量获取年月日时分秒
并确定时间输出标准格式
格式化时间

最后退出小程序,两个页面都将被卸载

相关文章

网友评论

      本文标题:20180725 理解小程序demo

      本文链接:https://www.haomeiwen.com/subject/rtegmqtx.html