## 微信小程序
### 开发语言
小程序采用 WXML + WXSS + JS 三种开发语言组合,其和网页编程采用的 HTML + CSS + JS 类似,WXML 用来描述当前这个页面的结构,WXSS 用来描述页面的样式,JS 用来处理这个页面和用户的交互。
#### WXML
WXML(WeXin Markup Language)和 HTML 类似,也有标签和属性,但针对小程序平台做了些优化。
相较 HTML,小程序的标签显得更加简洁,比如 `div`、`section` 、`header`等块级标签统一为 `view`,`p`、`span`、`b` 等文案类标签统一为 `text`,同时也新增了很多实用标签,比如 `picker` 滚动选择器、`map` 地图、`web-view` 网页容器等。
可以简单理解为,小程序所有的标签都是[原生组件](https://link.juejin.im/?target=https%3A%2F%2Fdevelopers.weixin.qq.com%2Fminiprogram%2Fdev%2Fcomponent%2F)。
WXML 支持数据绑定:
~~~
<view> {{message}} </view>
~~~
在 JS 中定义 `message` 变量:
~~~
Page({
data: {
message: 'Hello MOBIKE!'
}
})
~~~
更多关于 WXML 的介绍请见 [WXML · 小程序](https://link.juejin.im/?target=https%3A%2F%2Fdevelopers.weixin.qq.com%2Fminiprogram%2Fdev%2Fframework%2Fview%2Fwxml%2F)。
#### WXSS
WXSS(WeXin Style Sheets)是微信定义的一套样式语言,其具有 CSS 大部分特性,同时为了更适合开发微信小程序,WXSS 对 CSS 进行了扩充以及修改。
小程序使用 rpx(responsive pixel)作为尺寸单位。屏幕宽度固定为 750rpx,设置了 rpx 单位的元素可以根据屏幕宽度进行自适应,所以设计稿统一以 750px 输出(iPhone 6 标准)。
小程序没有 `html` 、`body`标签,如果想要设置页面的样式,可以直接使用 `page` 选择器:
~~~
page{
background: #FFFFFF;
}
~~~
WXSS 对选择器的支持并没有 Web 那么丰富,比如属性选择器 `[attr]`、相邻选择器 `h1 + p` 等都不被支持,只支持以下几种:
![wxss](https://user-gold-cdn.xitu.io/2018/7/1/16453d1e8569d462?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)
同时,我们也可以在 WXML 中写内联样式:
~~~
<view style="color: #FF9900;" />
~~~
也支持变量:
~~~
<view style="color: {{color}};" />
~~~
更多关于 WXSS 的介绍请见 [WXSS · 小程序](https://link.juejin.im/?target=https%3A%2F%2Fdevelopers.weixin.qq.com%2Fminiprogram%2Fdev%2Fframework%2Fview%2Fwxss.html)。
#### JS
小程序 JS 中没有 `window`、`document` 等变量,大部分浏览器中全局方法会被禁用,比如 `alert`。但也有部分被支持,比如 `setTimeout`、`encodeURIComponent`等,具体可以在开发者工具中尝试使用,官方文档并没有详细的介绍。
小程序 JS 添加了“全局”的 `wx` 命名空间,其挂载了很多实用的函数方法,比如 `wx.request` 用来发送网络请求,`wx.setStorage` 用来本地存储,`wx.getLocation` 用来获取用户位置信息等。
更多 `wx` 提供的方法请见 [API · 小程序](https://link.juejin.im/?target=https%3A%2F%2Fdevelopers.weixin.qq.com%2Fminiprogram%2Fdev%2Fapi%2F)。
### 生命周期
和大多数前端框架类似,小程序也有生命周期。
#### App 生命周期
整个小程序的生命周期如下图所示:
![app life](https://user-gold-cdn.xitu.io/2018/6/29/1644b72f98d7617a?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)
说明:
| 属性 | 类型 | 描述 | 触发时机 |
| --- | --- | --- | --- |
| onLaunch | Function | 生命周期函数--监听小程序初始化 | 当小程序初始化完成时,会触发 onLaunch(全局只触发一次) |
| onShow | Function | 生命周期函数--监听小程序显示 | 当小程序启动,或从后台进入前台显示,会触发 onShow |
| onHide | Function | 生命周期函数--监听小程序隐藏 | 当小程序从前台进入后台,会触发 onHide |
App 的生命周期是在小程序启动后全局监控的,不随着页面切换变化而变化。通过 `App()` 注册小程序,传入对应的生命周期函数,具体文档见[注册程序](https://link.juejin.im/?target=https%3A%2F%2Fdevelopers.weixin.qq.com%2Fminiprogram%2Fdev%2Fframework%2Fapp-service%2Fapp.html)。
#### Page 生命周期
除了整个小程序 App 的生命周期,每个页面(Page)也有自己的生命周期:
![app life](https://user-gold-cdn.xitu.io/2018/6/29/1644b72f98a9b055?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)
说明:
| 属性 | 类型 | 描述 |
| --- | --- | --- |
| onLoad | Function | 生命周期函数--监听页面加载 |
| onReady | Function | 生命周期函数--监听页面初次渲染完成 |
| onShow | Function | 生命周期函数--监听页面显示 |
| onHide | Function | 生命周期函数--监听页面隐藏 |
| onUnload | Function | 生命周期函数--监听页面卸载 |
当页面状态发生变化时,会触发对应的生命周期函数,可以通过 `Page()` 注册页面并传入监听函数。具体文档见[注册程序 · 小程序](https://link.juejin.im/?target=https%3A%2F%2Fdevelopers.weixin.qq.com%2Fminiprogram%2Fdev%2Fframework%2Fapp-service%2Fpage.html)。
* * * * *
[摩拜单车小程序开发实践与框架分析 - 摩拜前端团队 - 掘金小册](https://juejin.im/book/5b30c3b351882574957a788f/section/5b337860f265da59bf7a09b9?from=singlemessage)
[mobikeFE/xiaoce-demo: 掘金小册 demo (🚧施工中)](https://github.com/mobikeFE/xiaoce-demo)
* * * * *
[简易教程 · 小程序](https://developers.weixin.qq.com/miniprogram/dev/)
* * * * *
last update:2018-7-29 19:17:28
- 开始
- 微信小程序
- 获取用户信息
- 记录
- HTML
- HTML5
- 文档根节点
- 你真的了解script标签吗?
- 文档结构
- 已经落后的技术
- form表单
- html实体
- CSS
- css优先级 & 设计模式
- 如何编写高效的 CSS 选择符
- 笔记
- 小计
- flex布局
- 细节体验
- Flex
- Grid
- tailwindcss
- JavaScript
- javascript物语
- js函数定义
- js中的数组对象
- js的json解析
- js中数组的操作
- js事件冒泡
- js中的判断
- js语句声明会提前
- cookie操作
- 关于javascript你要知道的
- 关于innerHTML的试验
- js引擎与GUI引擎是互斥的
- 如何安全的修改对象
- 当渲染引擎遇上强迫症
- 不要使用连相等
- 修改数组-对象
- 算法-函数
- 事件探析
- 事件循环
- js事件循环中的上下文和作用域的经典问题
- Promise
- 最佳实践
- 页面遮罩加载效果
- 网站静态文件之思考
- 图片加载问题
- 路由及转场解决方案
- web app
- 写一个页面路由转场的管理工具
- 谈编程
- 技术/思想的斗争
- 前端技术选型分析
- 我想放点html模板代码
- 开发自适应网页
- 后台前端项目的开发
- 网站PC版和移动版的模板方案
- 前后端分离
- 淘宝前后端分离
- 前后端分离的思考与实践(一)
- 前后端分离的思考与实践(二)
- 前后端分离的思考与实践(三)
- 前后端分离的思考与实践(四)
- 前后端分离的思考与实践(五)
- 前后端分离的思考与实践(六)
- 动画
- 开发小技巧
- Axios
- 屏幕适配
- 理论基础
- 思考
- flexible.js原理
- 实验
- rem的坑,为什么要设置成百分比,为什么又是62.5%
- 为什么以一个标准适配的,其它宽度也能同等适配
- 自适应、响应式、弹性布局、屏幕适配
- 适配:都用百分比?
- 番外篇
- 给你看看0.5px长什么样?
- 用事实证明viewport scale缩放不会改变rem元素的大小
- 为什么PC端页面缩放不会影响rem元素
- 究竟以哪个为设备独立像素
- PC到移动端初试
- 深入理解px
- 响应式之栅格系统
- 深入理解px(二)
- 一篇搞定移动端适配
- flex版栅格布局
- 其他
- 浏览器加载初探
- 警惕你的开发工具
- JS模块化
- webpack
- 打包原理
- 异步加载
- gulp
- 命名规范
- 接口开发
- sea.js学习
- require.js学习
- react学习
- react笔记
- vue学习
- vue3
- 工具、技巧
- 临时笔记
- 怎么维护好开源项目
- 待办
- 对前端MVV*C框架的思考
- jquery问题
- 临时
- 好文
- 节流防抖