微信小程序面试题——面试整理5

一 面试题汇总

  1. 简单描述下微信小程序的相关文件类型?
  2. 小程序的双向绑定和vue哪里不一样?
  3. 小程序页面间有哪些传递数据的方法?
  4. 小程序的生命周期函数
  5. 微信小程序的优劣势
  6. 如何实现下拉刷新
  7. bindtap和catchtap的区别是什么?
  8. 简述下 wx.navigateTo(), wx.redirectTo(), wx.switchTab(), wx.navigateBack(), wx.reLaunch()的区别?
  9. 登录流程?
  10. 常用指令
  11. 微信小程序中的数据渲染与浏览器中有什么不同?
  12. 小程序中如何进行接口请求?会不会跨域,为什么?
  13. 谈谈你对微信小程序请求封装的理解?
  14. 如何优化首次加载小程序的速度?

二 面试题解答(仅供参考)

2.1 简单描述下微信小程序的相关文件类型?

微信小程序项目结构主要有四个文件类型

  • WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构。内部主要是微信自己定义的一套组件
  • WXSS (WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式
  • js 逻辑处理,网络请求
  • json 小程序设置,如页面注册,页面标题及tabBar 主要文件
  • app.json 必须要有这个文件,如果没有这个文件,项目无法运行,因为微信框架把这个作为配置文件入口,整个小程序的全局配置。包括页面注册,网络设置,以及小程序的 window 背景色,配置导航条样式,配置默认标题
  • app.js 必须要有这个文件,没有也是会报错!但是这个文件创建一下就行 什么都不需要写以后我们可以在这个文件中监听并处理小程序的生命周期函数、声明全局变量
  • app.wxss 可选

2.2 小程序的双向绑定和vue哪里不一样?

小程序直接 this.data 的属性是不可以同步到视图的,必须调用:

1
2
3
this.setData({
// 这里设置
})

2.3 小程序页面间有哪些传递数据的方法?

使用全局变量实现数据传递
在 app.js 文件中定义全局变量 globalData, 将需要存储的信息存放在里面

1
2
3
4
5
6
7
// app.js
App({
// 全局变量
globalData: {
userInfo: null
}
})

使用的时候,直接使用 getApp() 拿到存储的信息

使用 wx.navigateTo 与 wx.redirectTo 的时候,可以将部分数据放在 url 里面,并在新页面 onLoad 的时候初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Navigate
wx.navigateTo({
url: '../pageD/pageD?name=raymond&gender=male',
})

// Redirect
wx.redirectTo({
url: '../pageD/pageD?name=raymond&gender=male',
})

// pageB.js
...
Page({
onLoad: function(option){
console.log(option.name + 'is' + option.gender)
this.setData({
option: option
})
}
})

需要注意的问题:wx.navigateTo 和 wx.redirectTo 不允许跳转到 tab 所包含的页面 onLoad 只执行一次

2.4 小程序的生命周期函数

1
2
3
4
5
onLoad 页面加载时触发。一个页面只会调用一次,可以在 onLoad 的参数中获取打开当前页面路径中的参数
onShow() 页面显示/切入前台时触发
onReady() 页面初次渲染完成时触发。一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互
onHide() 页面隐藏/切入后台时触发。 如 navigateTo 或底部 tab 切换到其他页面,小程序切入后台等
onUnload() 页面卸载时触发。如 redirectTo 或 navigateBack 到其他页面时

2.5 微信小程序的优劣势

1
2
3
4
5
6
7
8
9
10
11
优势

即用即走,不用安装,省流量,省安装时间,不占用桌面
依托微信流量,天生推广传播优势
开发成本比 App 低

缺点

用户留存,即用即走是优势,也存在一些问题
入口相对传统 App 要深很多
限制较多,页面大小不能超过2M。不能打开超过10个层级的页面

2.6 如何实现下拉刷新

1
2
3
首先在全局 config 中的 window 配置 enablePullDownRefresh
在 Page 中定义 onPullDownRefresh 钩子函数,到达下拉刷新条件后,该钩子函数执行,发起请求方法
请求返回后,调用 wx.stopPullDownRefresh 停止下拉刷新

2.7 bindtap和catchtap的区别是什么?

1
2
相同点:首先他们都是作为点击事件函数,就是点击时触发。在这个作用上他们是一样的,可以不做区分
不同点:他们的不同点主要是bindtap是不会阻止冒泡事件的,catchtap是阻值冒泡的

2.8 简述下 wx.navigateTo(), wx.redirectTo(), wx.switchTab(), wx.navigateBack(), wx.reLaunch()的区别?

1
2
3
4
5
wx.navigateTo():保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面
wx.redirectTo():关闭当前页面,跳转到新的页面(类似重定向)。但是不允许跳转到 tabbar 页面
wx.switchTab():跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
wx.navigateBack():关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层
wx.reLaunch():关闭所有页面,打开到应用内的某个页面

2.9 登录流程?

1
2
3
登录流程是调wx.login获取code传给后台服务器获取微信用户唯一标识openid及本次登录的会话密钥(session_key)等)。
拿到开发者服务器传回来的会话密钥(session_key)之后,前端要保存wx.setStorageSync('sessionKey', 'value')
持久登录状态:session信息存放在cookie中以请求头的方式带回给服务端,放到request.js里的wx.request的header里

2.10 常用指令

wx:for、 wx:if

2.11 微信小程序中的数据渲染与浏览器中有什么不同?

1
2
浏览器中渲染是单线程的;
而在小程序中的运行环境分成渲染层和逻辑层, WXML 模板和 WXSS 样式工作在渲染层,JS 脚本工作在逻辑层。

2.12 小程序中如何进行接口请求?会不会跨域,为什么?

微信小程序有自带的api接口,wx.request();
不会跨域,因为微信小程序不是浏览器,没有同源策略的约束;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
wx.request({
url: 'https://xxxxxxx.com/api',
method: "POST",
data: {
pageNum: 1,
pageSize: 10
},
header: {
"content-type": "application/x-www-form-urlencoded"
},
success: res => {
console.log(res)
}
})

2.13 谈谈你对微信小程序请求封装的理解?

在小程序开发过程中,我们可能会进行许多的网络请求,如果每次请求都去写一遍 request 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
wx.request({
url: 'xxx',
data: {
a: '',
b: ''
},
header: {
'content-type': 'application/json' // 默认值
},
success(res) {
console.log(res.data)
},
fail(err){
console.log(err)
}
})

效率低下且不便于维护,所以封装一下 wx.request 接口还是有必要的。
通常以返回 promise 对象的形式进行请求的封装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const baseUrl = "123456.com"
function request(method, url, dataObj) {
return new Promise(function(resolve, reject) {
let header = {
'content-type': 'application/json',
};
wx.request({
url: baseURL + url,
method: method,
data: dataObj.data,
header: dataObj.header||header,
success(res) {
//请求成功
if (res.code == 0) {
resolve(res);
} else {
//其他异常
reject('运行时错误,请稍后再试');
}
},
fail(err) {
//请求失败
reject(err)
}
})
})
}

封装之后代码统一管理,方便维护,节省时间,提高了工作效率!

2.14 如何优化首次加载小程序的速度?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
包体积优化

分包加载(优先采用,大幅降低主包体积)。
图片优化(1.使用tinypng压缩图片素材; 2.服务器端支持,可采用webp格式)。
组件化开发(易维护)。
减少文件个数及冗余数据。



请求优化

关键数据尽早请求(onLoad()阶段请求,次要数据可以通过事件触发再请求);整合请求数据,降低请求次数。
采用cdn缓存静态的接口数据(如判断用户登录状态,未登录则请求缓存接口数据),cdn稳定且就近访问速度快(针对加载总时长波动大)。
缓存请求的接口数据。



首次渲染优化

图片懒加载(节省带宽)。
setData优化(不要一次性设置过多的数据等)。
DOM渲染优化(减少DOM节点)

三 参考

  • 掘金—微信小程序面试总结