微信小程序项目中每个文件的作用

由于最近做的项目要用到小程序,于是就开始啃微信开发文档,╯﹏╰,确实有点枯燥,而且刚开始学就硬看文档,有很多东西都搞不定,创建项目时一直选的云开发,然后跳出和文档中的第一个小程序完全不一样的东西,消磨耐心。然后就到B站找视频看,微信小程序2019快速入门,虽然没有介绍小程序与后端交互的wx.request(Object object)相关的知识,但是也让我对于小程序的开发有了一定的了解,看起文档我想应该没有那么费力了。

开发的准备工作就详见开发者文档

创建一个新项目后如下图:
在这里插入图片描述

小程序中已app开头的三个定义全局的文件,是不可少的,在刚开始创建的项目中,它自动提供了一个初始的项目,首先看app.json,"pages"标签按照页面的先后顺序,将其显示到手机中,例如下列代码,打开小程序首先显示的是index页面;“window” 标签定义标题栏的样式

{
  "pages": [
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "WeChat",
    "navigationBarTextStyle": "black"
  },
  "style": "v2",
  "sitemapLocation": "sitemap.json"
}

然后看app.js,代码包含在App({)}中,里面有onLaunch:function()函数,在页面启动前执行。(生命周期)以及登录、获取用户信息的功能,我们暂且知道它是干什么的就行。

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

在index页面的四个文件的功能和app开头的定义全局,
不一样的就是index只控制index当前页面,且index.js用Page({})包裹,
我们先从视图层index.wxml开始看

<!--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>

button组件,点击button,触发事件,到js中找到相应的方法getUserInfo

WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构。各组件包裹在<view>标签下,且每个标签有开头就要有结尾,</view>,
这里出现了"{{}}",这是小程序开发中的数据绑定,可以直接从当前页面的js文件中的data域获取数据
hasUserInfo、canIUse从下面的data:{}中获取,

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

Page({
  data: {
    motto: 'Hello World',
    userInfo: {},
    hasUserInfo: false,
    canIUse: wx.canIUse('button.open-type.getUserInfo')
  },
  //事件处理函数,跳转到logs页面
  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
    })
  }
})

<button wx:if=""></button>
<block wx:else>
也可以在标签中进行逻辑判断,可以对用户提供的事件进行响应(比如点击了按钮,获取用户信息,不点击显示提示信息)。

console.log(e),在控制台显示日志信息,
在小程序中如果相要修改data域中的信息,定要在函数中用this.setData({})来修改;

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值