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

一 面试题汇总

  1. 请谈谈微信小程序作用?
  2. 简单描述下微信小程序的相关文件类型?
  3. 请谈谈wxml与标准的html的异同?
  4. 请谈谈WXSS和CSS的异同?
  5. 你是怎么封装微信小程序的数据请求的?
  6. 小程序页面间有哪些传递数据的方法?
  7. 请谈谈小程序的双向绑定和vue的异同?
  8. 请谈谈小程序的生命周期函数?
  9. 简述微信小程序原理?
  10. 请谈谈原生开发小程序、wepy、mpvue 的对比?
  11. 哪些方法来提高微信小程序的应用速度?
  12. 分析微信小程序的优劣势?
  13. 怎么解决微信小程序的异步请求问题?
  14. 小程序关联微信公众号如何确定用户的唯一性?
  15. 使用webview直接加载要注意哪些事项?
  16. 小程序调用后台接口遇到哪些问题?
  17. 微信小程序如何实现下拉刷新?
  18. webview中的页面怎么跳转回小程序?
  19. bindtap和catchtap的区别?
  20. 简述五个路由的区别
  21. 微信小程序与H5的区别?
  22. 小程序如何更新页面中的值 ?
  23. 如何实现登录数据的持久化 ?
  24. 微信小程序和app有什么不同之处
  25. 微信小程序如何进行双向绑定
  26. 如何自定义toobar

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

2.1 请谈谈微信小程序作用?

1
2
3
4
5
6
7
8
9
project.config.json 项目配置文件,用得最多的就是配置是否开启https校验;
App.js 设置一些全局的基础数据等;
App.json 底部tab, 标题栏和路由等设置;
App.wxss 公共样式,引入iconfont等;
pages 里面包含一个个具体的页面;
index.json (配置当前页面标题和引入组件等);
index.wxml (页面结构);
index.wxss (页面样式表);
index.js (页面的逻辑,请求和数据处理等);

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

1
2
3
4
5
6
7
8
9
10
11
12
13
1.wxml 模板文件,是框架设计的一套标签语言,结合基础组件、事件系统、可以构建出页面的结构
2.wxss 样式文件,是一套样式语言,用于描述WXML的组件样式
3.js 脚本逻辑文件,逻辑处理网络请求
4.json 配置文件,小程序设置,如页面注册,页面标题及tabBar
5.app.json 整个小程序的全局配置,包括:

pages:[所有页面路径]
网络设置(网络超时时间)
界面表现(页面注册)
window:{背景色、导航样式、默认标题}
底部tab等
app.js 监听并处理小程序的生命周期函数、声明全局变量
app.wxss 全局配置的样式文件

2.3 请谈谈wxml与标准的html的异同?

1
2
3
4
5
6
7
- 都是用来描述页面的结构;
- 都由标签、属性等构成;
- 标签名字不一样,且小程序标签更少,单一标签更多;
- 多了一些 wx:if 这样的属性以及 {{ }} 这样的表达式
- WXML仅能在微信小程序开发者工具中预览,而HTML可以在浏览器内预览
- 组件封装不同, WXML对组件进行了重新封装,
- 小程序运行在JS Core内,没有DOM树和window对象,小程序中无法使用window对象和document对象。

2.4 请谈谈WXSS和CSS的异同?

1
2
3
4
5
6
- 都是用来描述页面的样子;
- WXSS 具有 CSS 大部分的特性,也做了一些扩充和修改;
- WXSS新增了尺寸单位,WXSS 在底层支持新的尺寸单位 rpx;
- WXSS 仅支持部分 CSS 选择器;
- WXSS 提供全局样式与局部样式
- WXSS 不支持window和dom文档流

2.5 你是怎么封装微信小程序的数据请求的?

1
2
3
4
5
6
7
8
9
10
1. 将所有的接口放在统一的js文件中并导出
2. 在app.js中创建封装请求数据的方法
3. 在子页面中调用封装的请求数据



1. 在根目录下创建utils目录及api.js文件和apiConfig.js文件;
2. 在appConfig.js封装基础的get\post\put\upload等请求方法,设置请求体,带上token和异常处理等;
3. 在api.js中引入apiConfig.js封装好的请求方法,根据页面数据请求的urls,设置对应的方法并导出;
4. 在具体页面导入;

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

1
2
3
4
5
6
7
8
9
10
11
1. 给html元素添加data-*属性来传递值,然后通过e.currentTarget.dataset或onload的param参数获取。注:data-名称不能有大写字母、不可以存放对象
2. 设置id的方法标识来传值,通过e.currentTarget.id获取设置的id的值,然后通过设置全局对象的方式来传递数值
3. 在navigator中添加参数数值



1. 使用全局变量实现数据传递
2. 页面跳转或重定向时,使用url带参数传递数据
3. 使用组件模板template传递参数
4. 使用缓存传递参数
5. 使用数据库传递参数

2.7 请谈谈小程序的双向绑定和vue的异同?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
大体相同,但小程序直接this.data的属性是不可以同步到视图的,必须调用this.setData()方法!

1.双向绑定:vue默认支持双向绑定,微信小程序需要借助data。
2.取值:vue中,通过this.reason取值。小程序中,通过this.data.reason取值。
3.定义方法:小程序使用 在app.js中定义即可,vue的方法通过写在method中进行定义。

1. 去变量的时候:
- 小程序 wx:for = "lists"
- Vue是 v-for = "item in lists"
2. 调用data模型(赋值)的时候:
- 小程序:this.data.item //调用 this.setData({item:1}) //赋值
- vue: this.item //调用 this.item =1 //赋值
小程序的双向绑定实际上并不是双向绑定
如果在小程序.js文件中改变了某个变量的值
那么页面上的值并不会跟着改变
如果想要页面上的值也跟着改变的话
需要通过setData来操作 而Vue默认就是双向绑定
只改变了某个变量的值 页面上也会跟着改变

2.8 请谈谈小程序的生命周期函数?

1
2
3
4
5
6
7
- onLoad() 页面加载时触发,只会调用一次,可获取当前页面路径中的参数。
- onShow() 页面显示/切入前台时触发,一般用来发送数据请求;
- onReady() 页面初次渲染完成时触发, 只会调用一次,代表页面已可和视图层进行交互。
- onHide() 页面隐藏/切入后台时触发, 如底部 tab 切换到其他页面或小程序切入后台等。
- onUnload() 页面卸载时触发,如redirectTo或navigateBack到其他页面时。
- onPullDownRefresh() 下拉刷新的钩子函数 用户下拉刷新时会自动走到这个函数中
- onReachBottom() 上翻到底的钩子函数

2.9 简述微信小程序原理?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- 小程序本质就是一个单页面应用,所有的页面渲染和事件处理,都在一个页面内进行,但又可以通过微信客户端调用原生的各种接口;
- 它的架构,是数据驱动的架构模式,它的UI和数据是分离的,所有的页面更新,都需要通过对数据的更改来实现;
- 它从技术讲和现有的前端开发差不多,采用JavaScript、WXML、WXSS三种技术进行开发;
- 功能可分为webview和appService两个部分;
- webview用来展现UI,appService有来处理业务逻辑、数据及接口调用;
- 两个部分在两个进程中运行,通过系统层JSBridge实现通信,实现UI的渲染、事件的处理等。



1. 微信小程序采用JavaScript、wxml、wxss三种技术进行开发,与现有前端开发的区别:

- JavaScript的代码是运行在微信APP中的,因此一些h5技术的应用需要微信APP提供对应的API支持;
- wxml微信自己基于xml语法开发的,因此在开发时只能使用微信提供的现有标签,html的标签是无法使用的;
- wxss具有css的大部分特性,但并不是所有都支持没有详细文档(wxss的图片引入需使用外链地址,没有body,样式可直接使用import导入)。

1. 微信的架构,是数据驱动的架构模式,它的UI和数据是分离的,所有的页面更新,都需要通过对数据的更改来实现。
2. 小程序功能分为webview和APPservice,webview主要用来展示UI,appservice用来处理业务逻辑、数据及接口调用。它们在两个进程中进行,通过系统层JSBridge实现通信,实现UI的渲染、事件处理

2.10 请谈谈原生开发小程序、wepy、mpvue 的对比?

1
2
3
- 个人认为,如果是新项目,且没有旧的 h5 项目迁移,则考虑用小程序原生开发,好处是相比于第三方框架,坑少。
- 而如果有 老的 h5 项目是 vue 开发 或者 也有 h5 项目也需要小程序开发,则比较适合 wepy 或者 mpvue 来做迁移或者开发,近期看wepy几乎不更新了,所以推荐美团的mpvue。
- 而如果如果团队前端强大,自己做一套框架也没问题。

2.11 哪些方法来提高微信小程序的应用速度?

1
2
3
4
1. 提高页面的加载速度
2. 用户行为预测 # 什么叫行为预测
3. 减少默认data的大小
4. 组件化方案 # 使用

2.12 分析微信小程序的优劣势?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- 优势:

1. 容易上手,基础组件库比较全,基本上不需要考虑兼容问题;
2. 开发文档比较完善,开发社区比较活跃,支持插件式开发;
3. 良好的用户体验:无需下载,通过搜索和扫一扫就可以打开,打开速度快,安卓上可以添加到桌面,与原生APP差不多;
4. 开发成本比APP要低;
5. 为用户提供良好的安全保障(小程序发布 严格的审查流程)

- 劣势:

1. 限制较多,页面大小不能超过1M,不能打开超过5个层级的页面;
2. 样式单一,部分组件已经是成型了的,样式不可修改,例如:幻灯片、导航
3. 推广面窄,不能分享朋友圈,只能通过分享给朋友,附近小程序推广
4. 依托于微信,无法开发后台管理功能
5. 后台调试麻烦,因为api接口必须https请求且公网地址
6. 真机测试,个别功能安卓和苹果表现迥异,例如安卓的定位功能加载很慢

2.13 怎么解决微信小程序的异步请求问题?

1
2
3
4
5
6
7
8
9
10
11
12
13
小程序支持 ES6 语法 在返回成功的回调里面处理逻辑 Promise 异步 async/await

在回调函数中调用下一个组件的函数:

**app.js**
success:function(info){
that.apirtnCallback(info)
}
**index.js**
onLoad:function(){
app.apirtnCallback = res =>{
console.log(res)
} }

2.14 小程序关联微信公众号如何确定用户的唯一性?

使用wx.getUserInfo方法 withCredentials为true时,可获取encryptedData,里面有union_id.后端需要进行对称解密。

2.15 使用webview直接加载要注意哪些事项?

1
2
3
4
1. 必须要在小程序后台使用管理员添加业务域名;
2. h5页面跳转至小程序的脚步必须是1.3.1以上;
3. 微信分享只可以是小程序的主名称,如要自定义分享内容,需小程序版本在1.7.1以上;
4. h5的支付不可以是微信公众号的appid,必须是小程序的appid,而且用户的openid也必须是用户和小程序的

2.16 小程序调用后台接口遇到哪些问题?

1
2
3
4
1. 数据的大小限制,超过范围会直接导致整个小程序崩溃,除非重启小程序;
2. 小程序不可以直接渲染文章内容这类型的html文本,显示需借助插件

注:插件渲染会导致页面加载变慢,建议在后台对文章内容的html进行过滤,后台直接处理批量替换p标签div标签为view标签。然后其他的标签让插件来做。

2.17 微信小程序如何实现下拉刷新?

用view代替scroll-view,设置onPullDownRefresh函数实现

2.18 webview中的页面怎么跳转回小程序?

1
2
3
4
5
6
7
wx.miniProgram.navigateTo({
url:’pages/login/login’+’$params’
})
**//跳转到小程序导航页面**
wx.miniProgram.switchTab({
url:’/pages/index/index’
})

2.19 bindtap和catchtap的区别?

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

2.20 简述五个路由的区别

1
2
3
4
5
wx.navigateTo() 
wx.redirectTo()
wx.switchTab()
wx.navigateBack()
wx.reLaunch()
  1. 在wxml页面中:
  • 跳转新页面
  • 在当前页打开
  • 切换到首页Tab

在js页面中:分为‘应用内的页面’和‘tabBar页面’;

如果上述跳转遇到跳转失败或者无效的问题,请访问:wx.navigateTo/wx.redirectTo无效

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

2.21 微信小程序与H5的区别?

1
2
3
4
1. 运行环境不同(小程序在微信运行,h5在浏览器运行);
2. 开发成本不同(h5需要兼容不同的浏览器);
3. 获取系统权限不同(系统级权限可以和小程序无缝衔接);
4. 应用在生产环境的运行流畅度(h5需不断对项目优化来提高用户体验)

2.22 小程序如何更新页面中的值 ?

可以通过this.setData来进行改变

2.23 如何实现登录数据的持久化 ?

可以通过wx.setStorageSync('键名', 对应的值)来进行数据持久化

2.24 微信小程序和app有什么不同之处

微信小程序属于轻量级的app 但是限制在微信中,开发周期短,功能较少,占用空间少,

app就相反 需要占用额外内存 开发周期长

2.25 微信小程序如何进行双向绑定

  1. 通过bind-tap点击事件 向app.js 定义的方法中获取回执
  2. 设置data的值 实现双向绑定

2.26 如何自定义toobar

  1. 取消当前的toobar
  2. 插入自定义toobar组件
  3. app.json调用组件
  4. 页面显示tootar组件

三 参考

  • 知乎—小程序面试题全面解析-A类问题