微信小程序入门
小程序的文件结构
app.js: 设置一些项目的全局变量
app.json: 每一个新页面都必须在这个页面注册
app.wxss: 项目全局样式
project.config.json: 项目配置文件
一个页面主要是包含以下四个文件,这四个文件的名字应该都是一样的,最好以页面所在的文件夹名字为标准:
xxx.wxml: 页面结构
xxx.wxss: 页面样式
xxx.json: 页面配置文件
xxx.js: 页面脚本文件
通过新建目录,新建 component.可以快速建立上述同名称文件.
页面可以嵌套,但不能超过 5 个层级.
app.json中tabBar可以设置导航栏颜色背景,下属的list中可以设置下标按钮的信息.
设备分辨率和 RPX
pt: 视觉单位.与屏幕的物理尺寸有关系,也叫做逻辑分辨率,与移动端的栅格渲染有关.
px: 像素点,物理分辨率.随着屏幕变化不会变化.一般设计稿以 px 为单位.iphone6 的分辨率是 375,设计稿一般是 750,那么
rpx : px = 2:1.
rpx 是响应式像素,可以根据屏幕宽度进行自适应。规定屏幕宽为 750rpx.
当需要的元素大小适应屏幕尺寸,就选择 rpx 作为单位,否则使用 px 作为单位。
小程序的事件
冒泡事件: 当一个组件上的事件被触发,该事件会向父节点传递.
非冒泡事件: 与之相反,不向父节点传递.
事件绑定
key 以 bind 或者 catch 开头,然后跟上事件的类型,如bindtap,catchtouchstart.
value 是一个字符串,需要在对应的 page 中定义同名的函数,不然当触发时会报错.
区别: bind 事件绑定不会阻止冒泡事件向上冒泡,catch 事件绑定可以阻止.
下拉刷新
监听用户下拉刷新事件
- 在 app.json 的 window 选项或者页面配置中开启
enablePullDownRefresh. - 可以通过
wx.startPullDownRefresh触发下拉刷新,调用后触发下拉刷新动画. - 当处理完数据刷新后,
wx.stopPullDownRefresh可以停止当前页面的下拉刷新.
小程序更新数据的值
函数用于将数据从逻辑层更新到视图层(异步)
1 | this.setData(object data, function callback) |
data: 传一个 object,是这次要改变的数据
callback: 传一个 function,是 setData 引起页面更新渲染完毕后的回调函数
//赋值的方式
1 | this.setData({ arr: this.data.arr }); |
小程序中 push 方法基本失效.
改变 object 中的值
1 | this.setData({ "obj.text": "message2" }); |
小程序的路由方式
打开新页面: wx.navigateTo 或使用组件<navigator open-type="navigateTo" />
页面重定向: wx.redirectTo 或使用组件<navigator open-type="redirectTo"/>
压面返回: wx.navigateBack 或使用组件<navigator open-type="navigateBack"/>
Tab 切换: wx.switchTab或使用组件<navigator open-type="switchTab"/>
重启动: wx.reLauch或使用组件<navigator open-type="reLauch"/>
小程序请求接口方式
HTTPS 请求: wx.request
上传文件: wx.uploadFile
下载文件: wx.downloadFile
webSocket 通信: wx.connectSocket
小程序的生命周期
onLoad: 页面加载时触发.一个页面只会调用一次.可以在onLoad的参数中获取打开当前页面路径中的参数
onShow: 页面显示/切入前台时触发
onReady: 页面初次渲染时触发.一个页面只调用一次.
onHide: 页面隐藏/切入后台时触发.如navigateTo或底部 tab 切换到其他页面,小程序切入后台.
onUnload: 页面卸载时触发.如navigateTo或navigateBack时触发.
组件通信
父传子: properties
子传父: triggerEvent('自定义事件名', {})
AppID(小程序 ID)
也是开发者 ID,路径:
微信公众平台-小程序-开发-开发设置
标签
微信小程序采用自有的标签,但是基本和 h5 标签有对应
| 小程序标签 | h5 标签 |
|---|---|
| view | div |
| text | span |
| scroll-view | 可以滚动的 div |
数据绑定
数据绑定采用双大括号语法.
1 | <view>{{ message }}</view> |
数据来自对应Page的 data 中.
1 | Page({ |
组件属性(需要在双大括号内)
1 | <view id="item-{{id}}"></view> |
1 | Page({ |
条件判断
wx: if="{{判断传入的文本用双括号}}"
wx: else="{{判断传入的文本用双括号}}"
wx: if 和hidden
类似于v-if和v-show,hidden是始终渲染的,wx: if只有为true才渲染.
列表渲染
wx: for
在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。
默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item
1 | <view wx:for="{{array}}"> |
1 | Page({ |
使用 wx:for-item 可以指定数组当前元素的变量名,
使用 wx:for-index 可以指定数组当前下标的变量名:
1 | <view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName"> |
注意: 当
wx:for的值为字符串时,会将字符串解析成字符串数组.
花括号和引号之间如果有空格,将最终被解析成为字符串.
wx:key
wx:key 的值以两种形式提供
- 字符串,代表在 for 循环的 array 中 item 的某个 property,该 property 的值需要是列表中唯一的字符串或数字,且不能动态改变。
key 是字符串,所以不用双大括号.
item是默认值,可以不加.
- 保留关键字 *this 代表在 for 循环中的 item 本身,这种表示需要 item 本身是一个唯一的字符串或者数字,如:
当数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件,框架会确保他们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。
组件中的样式
组件对应 wxss 文件的样式,只对组件 wxml 内的节点生效。编写组件样式时,需要注意以下几点:
组件和引用组件的页面不能使用 id 选择器(#a)、属性选择器([a])和标签名选择器,请改用 class 选择器。
组件和引用组件的页面中使用后代选择器(.a .b)在一些极端情况下会有非预期的表现,如遇,请避免使用。
子元素选择器(.a>.b)只能用于 view 组件与其子节点之间,用于其他组件可能导致非预期的情况。
继承样式,如 font 、 color ,会从组件外继承到组件内。
除继承样式外, app.wxss 中的样式、组件所在页面的的样式对自定义组件无效(除非更改组件样式隔离选项)。
1 | #a { } /* 在组件中不能使用 */ |
除此以外,组件可以指定它所在节点的默认样式,使用 :host 选择器(需要包含基础库 1.7.2 或更高版本的开发者工具支持)。
1 | /* 组件 custom-component.wxss */ |
1 | <!-- 页面的 WXML --> |
模板
WXML 提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用。
##定义模板
使用 name属性,作为模板的名字。然后在<template/>内定义代码片段,如:
1 | <template name="msgItem"> |
使用模板
使用is属性,声明需要的使用模板,然后将模板所需要的 data 传入,
1 | <template is="msgItem" data="{{..item}}"> |
1 | Page({ |
is属性可以用双大括号,来动态决定渲染哪个模板.
1 | <template name="odd"> |
模板的作用域
模板拥有自己的作用域,只能使用 data 传入的数据以及模板定义文件中定义的 <wxs /> 模块。
WXS语法(WeiXin Script)
- WXS 不依赖于运行时的基础库版本,可以在所有版本的小程序中运行。
- WXS 与 JavaScript 是不同的语言,有自己的语法,并不和 JavaScript 一致。
- WXS 的运行环境和其他 JavaScript 代码是隔离的,WXS 中不能调用其他 JavaScript 文件中定义的函数,也不能调用小程序提供的 API。
- WXS 函数不能作为组件的事件回调。
- 由于运行环境的差异,在 iOS 设备上小程序内的 WXS 会比 JavaScript 代码快 2 ~ 20 倍。在 android 设备上二者运行效率无差异
封装小程序 wx.request
1 | // 官方例子 |
Promsie 封装
1 | const baseUrl = "https://api.it120.cc"; |
使用
1 | const api = require("../../utils/api.js"); |
登录
1 | //app.js |
授权
1 | getUserInfo: function () { |
小程序的双向绑定和 vue 哪里不一样
小程序直接this.data的属性不可以直接同步到视图,必须调用this.data
data 和 params 的区别
哪些方法可以用来提高微信小程序的应用速度
- 提高页面加载速度
- 用户行为预测
- 减少默认 data 的大小
- 组件化方案
番茄闹钟的问题
- 组件内 css 选择器不能有 id,target,attr 选择器,一律使用 class 选择器.
wx:key后跟字符串,不能是双大括号.- 页面 wxss 样式名不要和
app.wxss重复,容易使设置样式失效. - 没有出现登录页的情况是需要在
app.json中将pages/login/login放在最前面. - 登录页面中跳转时,使用
wx.reLaunch并未跳转,使用wx.switchTab可以.
1 | //原因:reLaunch必须写相对路径才能正确跳转 |
- 登录验证中的
encrypted_data,event返回的是encryptedData.注意 - 请求头里的设置
't-app-id': t_app_id,注意横线. - 登录存储 storage 时,
wx.setStorageSync('me', response.res.data.resource),注意是response.res - 创建任务时,第一个按照后端 api 文档写的报错,第二个正确
1 | req.post("/todos", { |
1 | req.post("/todos", { |
- 创建时多一个空白,并且没有 id 和 index.原因:将 resource 写成 resources.有些有 s,有些没有.
11.登录时显示 500 报错,解决方法: 清缓存,全部清除,编译.即可.