- 基础使用
- 工程化开发小程序
- 登录流程
- 面试题与坑
- 组件
- 1、自定义tabbar 在页面下拉更新的时候,页面被下拉,tabbar也会跟着下拉
- 2、require在小程序中不支持绝对路径,只能用相对路径去选取
- 3、组件引用的资源路径不能解析特殊字符或者汉字
- 4、{{}} 模板中不能执行特殊方法,只能简单处理四则运算。
- 5、.wxs文件中无法使用 new Date()
- 6、setData 过程中需要注意对象覆盖
- 7、wx.rwquest不支持promise
- 手写封装一个promise化的接口
- 8、IOS不支持2020-06-26这个格式的,必须要转成2020/06/26
- 9、promise 初始化时候的入参是什么,new Promise(executor() 且立即执行)
- 10、promise成功状态下的value:undefind, thenable , promise
- 11、promise失败状态下的reason
- 12、then 的参数 onFulfilled(value) ,onRejected(reason)
- 组件
- 小程序实战
基础使用
pwa
发布订阅模式:有中间调度层
观察者模式
17316485341
1、小程序的生命周期
2、双线程的运行机制(官网有一张图)
链接
View thread + appService thread
notify /setData 对应周期,一个渲染周期内所需要做的事情
双线程运行机制,渲染层和逻辑层通过 native进行通讯
多次setData的时候,通信的次数是一次还是多次?
一次渲染周期内,多次setData会合并成一次,,一个事件循环,当前执行栈会合并一次。异步\setTimeout不算
jscore—>native—>webview
渲染周期,如何优化小程序数据通信,提升页面性能
减少setData的使用,合并多个setData
与页面渲染无关的数据不要放在data里
有些数据不在页面中显示,包含复杂数据结构或者超长字符串,则不应该使用setData来设置这些数据
有哪些地方可以放置页面渲染无关的数据
为什么data设置成字符串,不显示也会影响页面性能
evaluateJavascript :检测长数据
wepy 如何做数据绑定优化的
wepy内部实现了一个脏数据的检查机制,函数执行完之后,进行data-check
newValue 和 oldValue做比较,如果有变化,就会加入到readyToSet队列中,最后统一做一个setData
同一时间自允许一个脏数据检查流程进行 ,用这个说标识this.$$phase
wepy中异步数据如何更新
setTimeout(()=>{
this.label = 'label'
this.$apply();//额外做一步脏值检查
})
文件分布
网络层,网络请求
双重登录态维护,维护第二层登录的登录态?拦截器
小程序和h5的交互
结构层—-mixin混合
wepy实现了同vue一样复用抽离的方式
默认式混合—-data\components
vue中的data是个函数:单独的实例,防止污染
wepy源码分析:预编译型框架
第一步,先拆解 .wpy文件,拆成 template,style,script 3部分,然后分别执行不同的compile,编译成适应各个平台的代码(原生,支付宝,百度小程序)
关注点 ,slot ,以及updateBind
入口: wepy-cli/src/complie.js
适配器
应用vue 代码转 Vue3???
数据同步代码实现
$$phase :脏值检查标识
$apply : 应用更新(1、通过phase做状态检查,2.调用$digest做值统一更新)
$digest — 遍历originData,做脏值对比,如果值有更新,放到readyToSet。循环之后统一调用serData
工程化开发小程序
登录流程
术语
openId:用户在当前小程序下的唯一标识
unionid :微信开放平台下的唯一标识,比如说公众号跳转到小程序:getuserInfo中可以拿到
session_key:本次登录会话的密钥
以前的getuserInfo :拿到unionId ,拿到用户信息
现在的getuserInfo :只能拿到用户的匿名信息,加密后的身份标识
现在需要使用getUserProfile,弹出个人信息授权弹框,每次调用此接口均需用户确认
静默登录
1、wx.login()获取到code ,还能获取到unionId
2、带上code去请求业务后台
3、业务后台根据code,appId,appSecret 去请求微信后台服务
4、微信后台返回session_key + openId,业务后台根据session_key + openId + code 返回小程序token
5、小程序拿到token,存入 session,后续请求带上 token
业务中checkSession,过期后,走静默登录
正常登录
账号密码登录
微信授权登录
1、点击微信授权登录,getPhoneNumber(),弹出是否授权手机号。
面试题与坑
组件
1、自定义tabbar 在页面下拉更新的时候,页面被下拉,tabbar也会跟着下拉
2、require在小程序中不支持绝对路径,只能用相对路径去选取
解决方案
App({
require:function(url){
return require(url)
}
})
//组件中使用时
let app = getApp()
app.require('utils/tool.js')
//原理:利用require返回url时带上 /
3、组件引用的资源路径不能解析特殊字符或者汉字
解决方案:规范命名
4、{{}} 模板中不能执行特殊方法,只能简单处理四则运算。
vue中是利用的filter 管道符
//组件中定义filter
filters: {
capitalize: function (value) {
if (!value) return ''
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
},
capitalizeB :function(){
}
}
{{ money | capitalize | capitalizeB }}
//也可以在创建 Vue 实例之前全局定义过滤器
Vue.filter('capitalize', function (value) {
if (!value) return ''
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
})
new Vue({
// ...
})
//当全局过滤器和局部过滤器重名时,会采用局部过滤器。
小程序中利用 wxs
也可以直接 写在 wxml文件中,像这样
<wxs module="tool">
module.exports = {
formatDist: function (m) {
return m > 1000 ? (m / 1000).toFixed(1) + 'km' : m + 'm';
},
formatAddress: function (str) {
if (!str) return '';
var arr = str.split('<br'); // split 不支持正则 /\<\w+\/?\>/
return arr[0];
}
}
</wxs>
//使用的时候
<text>距离{{tool.formatDist(item.dist)}}</text>
5、.wxs文件中无法使用 new Date()
解决方案:使用getData()
6、setData 过程中需要注意对象覆盖
方案:
this.setData({
a:{
b:3,
c:4
}
})
let {a }= this.data
a.b = 5
this.setData{a}
//还可以使用wx-update-data 这个库
7、wx.rwquest不支持promise
手写封装一个promise化的接口
function request(opt){
return new Promise((resolve,reject)=>{
wx.request({
...opt,
success:res=>{
resolve(res)
},
fail:err=>{
reject(err)
}
})
})
}
//再抽象一点
function promisefy(api){
return (opt = {})=>{
return new Promise((resolve,reject)=>{
api({
...opt,
success:resolve,
fail:reject
})
})
}
}
promisefy(wx.request)(opt)
手写一个server ,模仿express封装一下ajax请求
8、IOS不支持2020-06-26这个格式的,必须要转成2020/06/26
这个是IOS兼容性问题。不是小程序的问题,h5中这个问题也是一样
9、promise 初始化时候的入参是什么,new Promise(executor() 且立即执行)
10、promise成功状态下的value:undefind, thenable , promise
11、promise失败状态下的reason
12、then 的参数 onFulfilled(value) ,onRejected(reason)
小程序实战
dataset考点
node属性名不能用 data开头,比如说dataxyz,会被当成 dataset处理
云开发
getApp
可以通过getApp()来获取全局的app()
- 如果在app()内部函数中,在调用APP之前用 getApp,直接使用this即可
获取getApp()之后,可以拿到app的生命周期么?可以的,但是禁止操作
getCurrentPage
getCurrentPage获取当前的page,不要修改页面栈,不要在app.onLaunch调用(page还没生成)
- wx.navigateTo(),被打开的页面可以调用 this.getOpenEventChannel()来获取eventChannel对象,打开方可以在回调中拿到这个对象,完成页面通信??
keep-live :http长连接