小程序-学习笔记
目录:
- 概述
参考资料:
概述
小程序基础
目录结构

app.js
 小程序的脚本代码,处理小程序的生命周期

app.json
 小程序的全局配置,哪些页面组成,窗口结构等

app.wxss
 小程序的全局样式文件
 
pages
 配置所有页面

- wxml文件 - 配置页面结构 
- wxss文件 - 子页面的配置,会覆盖全局配置 
- js和wxml文件是必须的,其他文件可选择 
详解和参考文档
app.json
小程序根目录下的 app.json 文件用来对微信小程序进行全局配置。文件内容为一个 JSON 对象,有以下属性:
| 属性 | 类型 | 必填 | 描述 | 最低版本 | 
|---|---|---|---|---|
| entryPagePath | string | 否 | 小程序默认启动首页 | |
| pages | string[] | 是 | 页面路径列表 | |
| window | Object | 否 | 全局的默认窗口表现 | |
| tabBar | Object | 否 | 底部 tab栏的表现 | |
| networkTimeout | Object | 否 | 网络超时时间 | |
| debug | boolean | 否 | 是否开启 debug 模式,默认关闭 | |
| functionalPages | boolean | 否 | 是否启用插件功能页,默认关闭 | 2.1.0 | 
| subpackages | Object[] | 否 | 分包结构配置 | 1.7.3 | 
| workers | string | 否 | Worker代码放置的目录 | 1.9.90 | 
| requiredBackgroundModes | string[] | 否 | 需要在后台使用的能力,如「音乐播放」 | |
| plugins | Object | 否 | 使用到的插件 | 1.9.6 | 
| preloadRule | Object | 否 | 分包预下载规则 | 2.3.0 | 
| resizable | boolean | 否 | PC 小程序是否支持用户任意改变窗口大小(包括最大化窗口);iPad 小程序是否支持屏幕旋转。默认关闭 | 2.3.0 | 
| usingComponents | Object | 否 | 全局自定义组件配置 | 开发者工具 1.02.1810190 | 
| permission | Object | 否 | 小程序接口权限相关设置 | 微信客户端 7.0.0 | 
| sitemapLocation | string | 是 | 指明 sitemap.json 的位置 | |
| style | string | 否 | 指定使用升级后的weui样式 | 2.8.0 | 
| useExtendedLib | Object | 否 | 指定需要引用的扩展库 | 2.2.1 | 
| entranceDeclare | Object | 否 | 微信消息用小程序打开 | 微信客户端7.0.9 | 
| darkmode | boolean | 否 | 小程序支持 DarkMode | 2.11.0 | 
| themeLocation | string | 否 | 指明 theme.json 的位置,darkmode为true为必填 | 开发者工具 1.03.2004271 | 
| lazyCodeLoading | string | 否 | 配置自定义组件代码按需注入 | 2.11.1 | 
| singlePage | Object | 否 | 单页模式相关配置 | 2.12.0 | 
参考文档:小程序配置 /全局配置
app.js
- App(Object object),注册小程序。接受一个 - Object参数,其指定小程序的生命周期回调等。App() 必须在- app.js中调用,必须调用且只能调用一次。不然会出现无法预期的后果。
- Object object 参数 
| 属性 | 类型 | 默认值 | 必填 | 说明 | 最低版本 | 
|---|---|---|---|---|---|
| onLaunch | function | 否 | 生命周期回调——监听小程序初始化。 | ||
| onShow | function | 否 | 生命周期回调——监听小程序启动或切前台。 | ||
| onHide | function | 否 | 生命周期回调——监听小程序切后台。 | ||
| onError | function | 否 | 错误监听函数。 | ||
| onPageNotFound | function | 否 | 页面不存在监听函数。 | 1.9.90 | |
| onUnhandledRejection | function | 否 | 未处理的 Promise 拒绝事件监听函数。 | 2.10.0 | |
| onThemeChange | function | 否 | 监听系统主题变化 | 2.11.0 | |
| 其他 | any | 否 | 开发者可以添加任意的函数或数据变量到 Object参数中,用this可以访问 | 
- 示例代码
App({
  onLaunch (options) {
    // Do something initial when launch.
  },
  onShow (options) {
    // Do something when show.
  },
  onHide () {
    // Do something when hide.
  },
  onError (msg) {
    console.log(msg)
  },
  globalData: 'I am global data'
})page.js
1.  AppObject getApp(Object object) 获取到小程序全局唯一的 App 实例。
- Object object 参数
| 属性 | 类型 | 默认值 | 必填 | 说明 | 最低版本 | 
|---|---|---|---|---|---|
| allowDefault | boolean | false | 否 | 在 App未定义时返回默认实现。当App被调用时,默认实现中定义的属性会被覆盖合并到App中。一般用于独立分包 | 2.2.4 | 
- 示例代码
// other.js
var appInstance = getApp()
console.log(appInstance.globalData) // I am global data注意
- 不要在定义于 App()内的函数中,或调用App前调用getApp(),使用this就可以拿到 app 实例。
- 通过 getApp()获取实例之后,不要私自调用生命周期函数。
**2. Page(Object object) 注册小程序中的一个页面 **
接受一个 Object 类型参数,其指定页面的初始数据、生命周期回调、事件处理函数等
- Object object 参数
| 属性 | 类型 | 默认值 | 必填 | 说明 | 
|---|---|---|---|---|
| data | Object | 页面的初始数据 | ||
| options | Object | 页面的组件选项,同 Component构造器 中的options,需要基础库版本 2.10.1 | ||
| onLoad | function | 生命周期回调—监听页面加载 | ||
| onShow | function | 生命周期回调—监听页面显示 | ||
| onReady | function | 生命周期回调—监听页面初次渲染完成 | ||
| onHide | function | 生命周期回调—监听页面隐藏 | ||
| onUnload | function | 生命周期回调—监听页面卸载 | ||
| onPullDownRefresh | function | 监听用户下拉动作 | ||
| onReachBottom | function | 页面上拉触底事件的处理函数 | ||
| onShareAppMessage | function | 用户点击右上角转发 | ||
| onShareTimeline | function | 用户点击右上角转发到朋友圈 | ||
| onAddToFavorites | function | 用户点击右上角收藏 | ||
| onPageScroll | function | 页面滚动触发事件的处理函数 | ||
| onResize | function | 页面尺寸改变时触发,详见 响应显示区域变化 | ||
| onTabItemTap | function | 当前是 tab 页时,点击 tab 时触发 | ||
| 其他 | any | 开发者可以添加任意的函数或数据到 Object参数中,在页面的函数中用this可以访问 | 
- 示例代码
//index.js
Page({
  data: {
    text: "This is page data."
  },
  onLoad: function(options) {
    // Do some initialize when page load.
  },
  onShow: function() {
    // Do something when page show.
  },
  onReady: function() {
    // Do something when page ready.
  },
  onHide: function() {
    // Do something when page hide.
  },
  onUnload: function() {
    // Do something when page close.
  },
  onPullDownRefresh: function() {
    // Do something when pull down.
  },
  onReachBottom: function() {
    // Do something when page reach bottom.
  },
  onShareAppMessage: function () {
    // return custom share data when user share.
  },
  onPageScroll: function() {
    // Do something when page scroll
  },
  onResize: function() {
    // Do something when page resize
  },
  onTabItemTap(item) {
    console.log(item.index)
    console.log(item.pagePath)
    console.log(item.text)
  },
  // Event handler.
  viewTap: function() {
    this.setData({
      text: 'Set some data for updating view.'
    }, function() {
      // this is setData callback
    })
  },
  customData: {
    hi: 'MINA'
  }
})参考文档:页面 /Page
3. 其他
- 组件事件处理函数
Page 中还可以定义组件事件处理函数。在渲染层的组件中加入事件绑定,当事件被触发时,就会执行 Page 中定义的事件处理函数。
示例代码
<view bindtap="viewTap"> click me </view>
Page({
  viewTap: function() {
    console.log('view tap')
  }
})- Page.route
到当前页面的路径,类型为String。
Page({
  onShow: function() {
    console.log(this.route)
  }
})- Page.prototype.setData(Object data, Function callback)
setData 函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的 this.data 的值(同步)。
参数说明
| 字段 | 类型 | 必填 | 描述 | 最低版本 | 
|---|---|---|---|---|
| data | Object | 是 | 这次要改变的数据 | |
| callback | Function | 否 | setData引起的界面更新渲染完毕后的回调函数 | 1.5.0 | 
Object 以 key: value 的形式表示,将 this.data 中的 key 对应的值改变成 value。
其中 key 可以以数据路径的形式给出,支持改变数组中的某一项或对象的某个属性,如 array[2].message,a.b.c.d,并且不需要在 this.data 中预先定义。
注意:
- 直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的,还会造成数据不一致。
- 仅支持设置可 JSON 化的数据。
- 单次设置的数据不能超过1024kB,请尽量避免一次设置过多的数据。
- 请不要把 data 中任何一项的 value 设为
undefined,否则这一项将不被设置并可能遗留一些潜在问题。
示例代码:
<!--index.wxml-->
<view>{{text}}</view>
<button bindtap="changeText"> Change normal data </button>
<view>{{num}}</view>
<button bindtap="changeNum"> Change normal num </button>
<view>{{array[0].text}}</view>
<button bindtap="changeItemInArray"> Change Array data </button>
<view>{{object.text}}</view>
<button bindtap="changeItemInObject"> Change Object data </button>
<view>{{newField.text}}</view>
<button bindtap="addNewField"> Add new data </button>
// index.js
Page({
  data: {
    text: 'init data',
    num: 0,
    array: [{text: 'init data'}],
    object: {
      text: 'init data'
    }
  },
  changeText: function() {
    // this.data.text = 'changed data' // 不要直接修改 this.data
    // 应该使用 setData
    this.setData({
      text: 'changed data'
    })
  },
  changeNum: function() {
    // 或者,可以修改 this.data 之后马上用 setData 设置一下修改了的字段
    this.data.num = 1
    this.setData({
      num: this.data.num
    })
  },
  changeItemInArray: function() {
    // 对于对象或数组字段,可以直接修改一个其下的子字段,这样做通常比修改整个对象或数组更好
    this.setData({
      'array[0].text':'changed data'
    })
  },
  changeItemInObject: function(){
    this.setData({
      'object.text': 'changed data'
    });
  },
  addNewField: function() {
    this.setData({
      'newField.text': 'new data'
    })
  }
})- 页面间通信
如果一个页面由另一个页面通过 wx.navigateTo 打开,这两个页面间将建立一条数据通道:
被打开的页面可以通过
this.getOpenerEventChannel()方法来获得一个EventChannel对象;wx.navigateTo的success回调中也包含一个EventChannel对象。
这两个 EventChannel 对象间可以使用 emit 和 on 方法相互发送、监听事件。
4. 模块化
- 单个page中定义的元素,其他page不可访问。全局元素可以在app.js中设置
- 可以自定义一些公共模块
列如:
// common.js
function sayHello(name) {
  console.log(`Hello ${name} !`)
}
function sayGoodbye(name) {
  console.log(`Goodbye ${name} !`)
}
module.exports.sayHello = sayHello
exports.sayGoodbye = sayGoodbye参考文档:模块化
WXML
- 数据绑定:WXML 中的动态数据均来自对应 Page 的 data,数据绑定使用 Mustache 语法(双大括号)将变量包起来。
- 列表渲染:在组件上使用 wx:for控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。默认数组的当前项的下标变量名默认为index,数组当前项的变量名默认为item
- 条件渲染:在框架中,使用 wx:if=""来判断是否需要渲染该代码块
- 模板:WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用
- 引用:WXML 提供两种文件引用方式import和include
参考官方文档:WXML
WXSS
WXSS (WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式。WXSS 用来决定 WXML 的组件应该怎么显示。
为了适应广大的前端开发者,WXSS 具有 CSS 大部分特性。同时为了更适合开发微信小程序,WXSS 对 CSS 进行了扩充以及修改。
与 CSS 相比,WXSS 扩展的特性有:
- 尺寸单位
- 样式导入
参考文档:视图层 /WXSS
事件
事件的概念
- 事件是视图层到逻辑层的通讯方式。
- 事件可以将用户的行为反馈到逻辑层进行处理。
- 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
- 事件对象可以携带额外信息,如 id, dataset, touches。
事件的使用方式
- 在组件中绑定一个事件处理函数。
 如bindtap,当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数。
- 在相应的Page定义中写上相应的事件处理函数,参数是event。
事件分类
事件分为冒泡事件和非冒泡事件:
- 冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。
- 非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。
WXML的冒泡事件列表:
| 类型 | 触发条件 | 最低版本 | 
|---|---|---|
| touchstart | 手指触摸动作开始 | |
| touchmove | 手指触摸后移动 | |
| touchcancel | 手指触摸动作被打断,如来电提醒,弹窗 | |
| touchend | 手指触摸动作结束 | |
| tap | 手指触摸后马上离开 | |
| longpress | 手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发 | 1.5.0 | 
| longtap | 手指触摸后,超过350ms再离开(推荐使用longpress事件代替) | |
| transitionend | 会在 WXSS transition 或 wx.createAnimation 动画结束后触发 | |
| animationstart | 会在一个 WXSS animation 动画开始时触发 | |
| animationiteration | 会在一个 WXSS animation 一次迭代结束时触发 | |
| animationend | 会在一个 WXSS animation 动画完成时触发 | |
| touchforcechange | 在支持 3D Touch 的 iPhone 设备,重按时会触发 | 1.9.90 | 
注:除上表之外的其他组件自定义事件如无特殊声明都是非冒泡事件,如 form 的submit事件,input 的input事件,scroll-view 的scroll事件,(详见各个组件)
参考文档:事件
常见类型
触发事件是由“用户在渲染层的行为反馈”以及“组件的部分状态反馈”引起的,由于不同组件的状态不一致,所以我们这里不讨论组件相关的事件(组件的事件可以参考其参数说明,详情见官方文档 https://mp.weixin.qq.com/debug/wxadoc/dev/component/ )
- 常见的事件类型 - 类型 - 触发条件 - touchstart - 手指触摸动作开始 - touchmove - 手指触摸后移动 - touchcancel - 手指触摸动作被打断,如来电提醒,弹窗 - touchend - 手指触摸动作结束 - tap - 手指触摸后马上离开 - longpress - 手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发 - longtap - 手指触摸后,超过350ms再离开(推荐使用longpress事件代替) - transitionend - 会在 WXSS transition 或 wx.createAnimation 动画结束后触发 - animationstart - 会在一个 WXSS animation 动画开始时触发 - animationiteration - 会在一个 WXSS animation 一次迭代结束时触发 - animationend - 会在一个 WXSS animation 动画完成时触发 
- 当事件回调触发的时候,会收到一个事件对象,对象的详细属性如下表所示。 
| 属性 | 类型 | 说明 | 
|---|---|---|
| type | String | 事件类型 | 
| timeStamp | Integer | 页面打开到触发事件所经过的毫秒数 | 
| target | Object | 触发事件的组件的一些属性值集合 | 
| currentTarget | Object | 当前组件的一些属性值集合 | 
| detail | Object | 额外的信息 | 
| touches | Array | 触摸事件,当前停留在屏幕中的触摸点信息的数组 | 
| changedTouches | Array | 触摸事件,当前变化的触摸点信息的数组 | 
事件绑定与冒泡捕获
事件绑定的写法和组件属性一致,以key=”value”的形式,其中:
- key以bind或者catch开头,然后跟上事件的类型,如bindtap、catchtouchstart。自基础库版本1.5.0起,bind和catch后可以紧跟一个冒号,其含义不变,如bind:tap、catch:touchstart。同时bind和catch前还可以加上capture-来表示捕获阶段。
- value是一个字符串,需要在对应的页面Page构造器中定义同名的函数,否则触发事件时在控制台会有报错信息。
事件的参考文档:事件与事件绑定
组件
小程序提供了丰富的基础组件给开发者,开发者可以像搭积木一样,组合各种组件拼合成自己的小程序。
就像 HTML 的 div, p 等标签一样,在小程序里边,你只需要在 WXML 写上对应的组件标签名字就可以把该组件显示在界面上,例如,你需要在界面上显示地图,你只需要这样写即可:
<map></map>参考文档:文档

 
                     
                     
                        
                        