一、app.json文件是对微信小程序进行全局配置,决定页面文件的路径、窗口表现、设置网络超时时间、设置多工具栏(tabBar)等。

1、新建项目里面的app.json文件里包含了一下代码,

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

文件路径问题:

pages主要存放的是文件路径,具体存放什么文件路径呢,我们点开pages,我们可以看见里面有两个文件夹,这里的文件路径就是指这里的index和logs。

ios afnetworking下载json文件 app.json文件_小程序

 如果我们想新建一个我们需要的文件,可以右键点击pages,选择“新建 目录”,输入我们想要的名字(假设我们建了一个“test”的目录),然后就可以得到下图所示:

ios afnetworking下载json文件 app.json文件_ico_02

然后这里就多了一个test的文件,通常来说,我们新建目录后,我们需要再在“test”文件夹下建立 "test.js","test.json","test.wxml",及"test.wxss"这四个文件,但是我们也可以一步创建这四个文件,那就是在“app.json”里面的pages添加里直接添加test,具体操作如下:

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

对比新建项目app.json的pages,我们发现,就多了"pages/test/test",这就可以一次创建那四个文件,可能有人会问,为什么我要把test文件下面的四个文件也命名为test.*,这是为了方便管理,且这就是微信小程序的规定。还有个小问题就是,微信小程序开发工具里没有保存这个按钮,我们就只有用快捷键“ctrl+s”进行保存,按了保存就相当于进行了编译,我们也可以直接点上方菜单栏的编译按钮进行保存及编译,完成以上的添加路径就会得到下图所示:

ios afnetworking下载json文件 app.json文件_json_03

值得注意的是,你在pages下面每 创建一个文件,记得将它对应的路径添加到pages里,这样微信小程序才会知道你所写的程序。

窗口显示问题:

窗口的代码如下:

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

仅支持"black"/"white",其实最主要我们就控制这个显示的文字就好了,其他的设置,我个人觉得都是不需要改动的。

tabBar:

如果小程序需要有多个tab应用,简单来说,就是页面切换的按钮,其实就是一个类似与链接的东西,只是把这个链接图像化了,点击下面的tab图标进行页面跳转。tabBar的配置说明如下:

1、我们要把跳转的链接进行图像化,我们要做的第一步就是要得到图像,我们可以从“寻图标”这个来找点,我们心仪的图标,如以下的图标,我们需要那个飞机,如果你不想注册登录再下载,你可以直接打开qq进行截图。

ios afnetworking下载json文件 app.json文件_ico_04

假设我们截的图如下:

ios afnetworking下载json文件 app.json文件_json_05

ios afnetworking下载json文件 app.json文件_xml_06

我们将图片分别另存为“fly.png”,“fly_on,png”,这样存的话,就能很好的区别你所存图片的作用,且将这两张图片归为一类,下面我们来说一下具体怎么使用这两张图片。

第一步:找到我们新建的项目的根目录,建立一个文件夹(与pages文件夹同级)image,然后把之前我们保存的图片复制到image文件夹下;

第二步:我们在小程序开发界面里就可以看到image文件夹了,点开它如下图所示:

ios afnetworking下载json文件 app.json文件_ico_07

第三步:就是配置tabBar,配置代码如下:

"tabBar": {
    "color": "#000",
    "selectedColor": "#56abe4",
    "backgroundColor": "#fff",
    "borderStyle": "black",
    "list": [
      {
        "pagePath": "pages/index/index",   
        "text": "首页",
        "iconPath": "image/fly.png",
        "selectedIconPath": "image/fly_on.png"
      },
      {
        "pagePath": "pages/logs/logs",
        "text": "日志",
        "iconPath": "image/fly.png",
        "selectedIconPath": "image/fly_on.png"
      },
      {
        "pagePath": "pages/test/test",
        "text": "我的",
        "iconPath": "image/fly.png",
        "selectedIconPath": "image/fly_on.png"
      }
    ]
  }

一进入“tabBar”就是对跳转栏的(“color”)文字颜色、(“selectedColor”)文字选中时的颜色、(“backgroundColor”)背景色、(“boederStyle”)tabBar上边框的颜色进行设置。然后就是重头戏“list”,这就是对tab应用的定义,“list”最少配置2个,最多配置5个。其中:“pagePath”为页面路径,这个需要现在pages里面定义,“text”就是对这个链接按钮进行命名,“iconPath”就是我们平时不点那个按钮显示的图片的路径,“selectedIconPath”就是我们选中那个跳转按钮时,所显示图片的路径。

上面的代码,我们相当于定制了3个跳转按钮,一个是跳转到“index”首页,一个是跳转到“logs”日志,另外是跳转到“test”我们新建的页面,具体实现情况如下:

ios afnetworking下载json文件 app.json文件_json_08

注意: *.json格式文件里面是不能添加注释的,*.js,*.wxml,*.wxss这三个文件是可以添加注释的,添加注释的方法是“ctrl+?”(这里的问号就是指那个按键,并不是把问号打出来哈),且这三个文件中注释的符号是不一样的,最好使用这个快捷方式。

networkTimeout:

这个是网络请求的超时时间的配置,这个配置不是必须的,你不写也是可以的,因为它这个都是有默认的值的,你如果有特别的需要,你可以按照以下的规则进行配置。

ios afnetworking下载json文件 app.json文件_xml_09

配置的代码如下:

"networkTimeout": {
    "request": 10000,
    "downloadFile": 10000
  }

完整的app.json配置代码如下:

{
  "pages":[
    "pages/index/index",
    "pages/logs/logs",
    "pages/test/test"
  ],
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "WeChat",
    "navigationBarTextStyle":"black"
  },
  "tabBar": {
    "color": "#000",
    "selectedColor": "#56abe4",
    "backgroundColor": "#fff",
    "borderStyle": "black",
    "list": [
      {
        "pagePath": "pages/index/index",
        "text": "首页",
        "iconPath": "image/fly.png",
        "selectedIconPath": "image/fly_on.png"
      },
      {
        "pagePath": "pages/logs/logs",
        "text": "日志",
        "iconPath": "image/fly.png",
        "selectedIconPath": "image/fly_on.png"
      },
      {
        "pagePath": "pages/test/test",
        "text": "我的",
        "iconPath": "image/fly.png",
        "selectedIconPath": "image/fly_on.png"
      }
    ]
  },
  "networkTimeout": {
    "request": 10000,
    "downloadFile": 10000
  }
}

需要注意的是,其中每个模块需要花括号“{}”括起来,然后每个模块以逗号结束, 如上面可以概括为四个模块:“pages”、“windows”、“tabBar”、“networkTimeout”。

总结:app.json是对全局的把控,如果你想让跳转后的页面显示不同的抬头(就是小程序最上面的文字或背景),那就需要在对应页面的json文件进行简单的配置,即将上面“windows”里面的内容拷贝到对应的json文件里,然后对里面的文件进行修改。小程序遵循的规则是:“在大环境下生活,远亲不如近邻”,就是说大的框架是小程序官方给的,是不容许修改的,而对一些配置文件的话,我们就会以最近的那个配置为准,这样就是起到一个定制页面的效果。

二、app.js

app.js就是用户刚开始进入小程序执行的内容,其中就是执行了app({}),这里面写的函数或者全局变量都会被执行。app()函数用来注册一个小程序,它必须在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()里面就会执行,onLaunch这个函数,因为这是直接触发的事件,我们最开始进来时,那个获取头像的功能就是在这里实现的。其中还有几个函数可以调用:

ios afnetworking下载json文件 app.json文件_小程序_10

 可以调用其中几个来看一下,如下:

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)
              }
            }
          })
        }
      }
    })
  },
  onShow:function(){
    console.log("从后台到前台")
  },
  onHide:function(){
    console.log("从前台到后台")
  },
  globalData: {
    userInfo: null,
    testnum:1
  }
})

其中调用了onShow,onHide等两个函数,函数面的console.log就是在调试器的console页面里打印上面写的那些“从前台到后台”等文字,可表示这个程序执行了,类似与C语音里面的print一个字符串什么的。

三、app.wxss的配置问题

wxss是一套样式语言,用于描述wxml的组件样式,app.wxss中的样式为全局样式,作用于每个页面。新建项目的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;
}

app.wxss就是对整个小程序样式的一个设置,比如一开始的那个页面,里面显示头像的位置以及用户名的文字大小及位置这些配置都是在*.wxss文件里设置,这里还是遵循“远亲不如近邻”这个规则,container正如它的名字一样,这是一个容器,可以把一些配置信息装在里面,以 (class=“container”)的形式调用。

其中,可配置的内容有:

/**app.wxss**/
.container {
  height: 100%;
  /* 高度自适应 */
  display: flex; 
  /* 纵向排列 */
  flex-direction: column;
  /* 每项居中 */
  align-items: center;  
  /* 两端居中   */
  justify-content: space-between;
  /* 两端对齐,项目之间的间隔都相等 */
  padding: 200rpx 0;
  /* padding表示内边距,就是控制上下左右的边距,
  padding:5px;带一个参数,表示上下左右都是5px距离
  padding:5px 0;带两个参数,表示上下都是5px,左右都是0px,这里容易出错,请切记
  padding:5px 4px 3px 2px;带4各参数,表示上5px,右4px,下3px,左2px */
  box-sizing: border-box;
  /* 自适应的边框 */
}

四、总结

总的来说,就是app.js和app.json、app.wxss就是一个大框架,你要确切的问到底哪个先执行,哪个是大哥,那大概就会扯到“鸡与蛋”的世界难题上吧。其实,在我的理解上来看的话,就是这三个东西都是“你中有我,我中有你”,因为在显示页面的时候,其实那个什么获取用户头像的事已经做了,也可以说在执行获取头像这个事件之前,就已经把页面显示出来了,且有样式。所以我们可以把这三个看成一个整体来理解,这样会容易些,同理我们在后面看待pages下面相同文件名的的*.js、*.json、*.wxml、*.wxss为一个整体。还有就是pages下面的文件,到底先执行哪一个,这个就要看那个时间被触发了,就比如最上面我们写的三个跳转按钮,我们只有按了对应的按钮才会触发相应的事件。默认先执行app.*,然后是执行app.json里面pages里面的第一个路径(默认为首页),接下来就看触发事件的威力了。

以上仅是我个人的理解,有什么问题可以在下面评论交流,谢谢。