微信小程序面试题全攻略:10 大板块深度解析,附丰富案例代码
一、基础概念类
1. 简述微信小程序的特点
- 无需安装,触手可及,用完即走,无需卸载。
- 开发成本低、周期短。
- 跨平台,可在 iOS 和 Android 系统上运行。
- 拥有丰富的微信生态入口。
2. 微信小程序的文件结构及作用
.json
配置文件:用于页面或项目的配置,如窗口表现、导航栏样式等。- 页面的
.json
文件配置导航栏标题。
- 页面的
{
"navigationBarTitleText": "我的页面"
}
.wxml
文件:描述页面结构,类似 HTML。
<view>这是一个文本</view>
.wxss
文件:定义页面样式,类似 CSS。
view {
color: red;
}
.js
文件:处理页面逻辑。
Page({
data: {
message: 'Hello World'
}
})
3. 微信小程序架构及逻辑层与视图层关系
架构分为逻辑层和视图层。逻辑层运行在 JavaScriptCore 中,负责业务逻辑处理;视图层由 WXML 和 WXSS 组成,运行在 WebView 中,负责页面渲染。两层通过数据通信和事件系统进行交互。例如,逻辑层通过setData
方法将数据传递给视图层进行渲染。
二、生命周期类
1. 微信小程序页面生命周期函数及触发情况
onLoad
:页面加载时触发,可获取页面参数。- 从 A 页面跳转到 B 页面并传递参数,在 B 页面的
onLoad
中获取参数。
- 从 A 页面跳转到 B 页面并传递参数,在 B 页面的
Page({
onLoad: function (options) {
console.log(options.param);
}
})
onShow
:页面显示时触发。onReady
:页面初次渲染完成时触发。onHide
:页面隐藏时触发。onUnload
:页面卸载时触发。
2. 小程序应用生命周期函数及触发时机
onLaunch
:小程序初始化完成时触发。- 可以在这个函数中进行一些全局的初始化操作。
App({
onLaunch: function () {
console.log('小程序初始化完成');
}
})
onShow
:小程序显示时触发。onHide
:小程序隐藏时触发。
3. 利用页面生命周期函数优化性能和用户体验
在onLoad
中加载必要数据,避免页面加载缓慢。在onHide
中保存页面状态,以便下次快速恢复。例如,在onHide
中保存当前页面滚动位置。
Page({
onHide: function () {
wx.setStorageSync('scrollTop', this.data.scrollTop);
}
})
三、数据处理类
1. 微信小程序数据存储方式及适用场景
- 本地存储:使用
wx.setStorageSync/wx.getStorageSync
等方法,适用于存储用户偏好设置等小量数据。- 存储用户的主题偏好。
wx.setStorageSync('theme', 'dark');
- 云开发数据库:适用于存储大量数据,具有自动备份、权限管理等优势。
- 存储用户的订单信息。
const db = wx.cloud.database();
db.collection('orders').add({
// 订单数据
})
2. 小程序页面间数据传递方法
- 通过 URL 参数传递,在页面跳转时将数据拼接到 URL 中,在目标页面的
onLoad
中获取参数。- 从 A 页面跳转到 B 页面并传递参数。
wx.navigateTo({
url: '/pages/B?param=value'
})
在 B 页面的onLoad
中获取参数:
Page({
onLoad: function (options) {
console.log(options.param);
}
})
- 使用全局变量或应用级别的数据存储,但要注意数据同步和管理。
3. 封装小程序网络请求及好处
- 可以创建一个网络请求工具类,封装
wx.request
方法,处理请求头、错误处理等。
class HttpUtil {
static request(url, data = {}, method = 'GET') {
return new Promise((resolve, reject) => {
wx.request({
url,
data,
method,
header: {
'Content-Type': 'application/json'
},
success: res => {
resolve(res.data);
},
fail: err => {
reject(err);
}
});
});
}
}
封装的好处是提高代码可维护性和复用性。
四、页面跳转与路由类
1. 小程序常见路由跳转方式及区别
wx.navigateTo
:打开新页面,可返回原页面。wx.redirectTo
:重定向到新页面,不可返回原页面。wx.switchTab
:跳转到 tabBar 页面。
2. 路由跳转时携带参数及接收方法
在 URL 中拼接参数,如wx.navigateTo({ url: '/page?param=value' })
。在目标页面的onLoad
中通过options.param
获取参数。
3. 从非 tabBar 页面跳转到 tabBar 页面并刷新数据
使用wx.switchTab
跳转到 tabBar 页面,在目标页面的onShow
中重新加载数据。
- 从非 tabBar 页面 A 跳转到 tabBar 页面 B。
wx.switchTab({
url: '/pages/B'
})
在 B 页面的onShow
中重新加载数据:
Page({
onShow: function () {
// 重新加载数据的逻辑
}
})
五、样式与布局类
1. 小程序wxss
与传统 CSS 的区别
- 单位不同,小程序有
rpx
单位,可根据屏幕宽度自适应。 - 选择器支持有限。
2. 小程序实现响应式布局及rpx
单位作用
使用rpx
单位,它会根据屏幕宽度自动调整大小。以 750rpx 为基准宽度,在不同屏幕宽度下进行自适应。
view {
width: 375rpx;
height: 200rpx;
}
3. 页面布局问题的调试方法和工具
使用微信开发者工具查看元素层级、样式属性等。进行真机调试,查看实际效果。
六、组件与自定义组件类
1. 微信小程序内置组件及使用方法
视图容器组件(如view
、scroll-view
)、表单组件(如button
、input
)、导航组件(如navigator
)等。在.wxml
文件中通过标签形式引入并设置属性。
<view>这是一个视图容器</view>
<button>这是一个按钮</button>
<input placeholder="请输入内容"/>
<navigator url="/pages/other">跳转到其他页面</navigator>
2. 创建和使用自定义组件及适用情况
在项目目录下创建组件文件夹,包含.json
、.wxml
、.wxss
、.js
文件,进行配置和实现。
- 创建一个自定义组件
my-component
。 my-component.json
:
{
"component": true
}
my-component.wxml
:
<view>这是一个自定义组件</view>
my-component.wxss
:
view {
color: blue;
}
my-component.js
:
Component({
properties: {},
data: {},
methods: {}
})
在页面中使用自定义组件:
<my-component></my-component>
自定义组件适用于多个页面复用的功能模块。
3. 父子组件通信方式
- 属性绑定:父组件向子组件传递数据。
- 父组件向子组件传递一个名为
message
的属性。
- 父组件向子组件传递一个名为
<my-component message="{{messageFromParent}}"></my-component>
- 事件绑定:子组件向父组件传递数据。
- 子组件触发一个名为
customEvent
的事件并传递数据。
- 子组件触发一个名为
// 子组件
Component({
methods: {
triggerEvent() {
this.triggerEvent('customEvent', { data: '这是子组件传递的数据' });
}
}
})
在父组件中监听子组件的事件并获取数据:
<my-component bind:customEvent="onCustomEvent"></my-component>
// 父组件
Page({
onCustomEvent: function (e) {
console.log(e.detail.data);
}
})
七、性能优化类
1. 提高微信小程序性能的方法和技巧
- 减少不必要的
setData
操作,避免频繁触发页面渲染。例如,不要在每次数据变化时都调用setData
,可以合并多次数据变化后再调用。 - 对图片进行适当压缩,减少加载时间。
- 合理使用缓存,避免重复请求数据。例如,使用本地存储缓存一些不经常变化的数据。
- 懒加载数据和页面,提高页面加载速度。例如,当用户滚动到特定位置时再加载更多数据。
2. 优化小程序首屏加载速度的方法
- 减少首屏加载的数据量。例如,只加载首屏必需的数据,其他数据在用户交互时再加载。
- 合理使用分包加载,避免一次性加载过多资源。例如,将不常用的页面或功能放在分包中,只有在需要时才加载。
3. 处理大量数据时避免频繁setData
操作的方法
先对数据进行处理(如分页、过滤),减少传递给页面的数据量。例如,只显示当前页的数据,而不是一次性加载所有数据。
八、安全与权限类
1. 微信小程序数据安全措施和注意事项
- 对用户输入的数据进行严格校验和过滤。例如,使用正则表达式对用户输入的手机号码进行校验。
- 对敏感数据进行加密存储。例如,使用加密算法对用户密码进行加密存储。
- 使用安全的网络协议(如 HTTPS)。
- 合理控制小程序权限,避免过度授权。
2. 小程序获取用户信息和权限的注意事项及管理方法
明确提示获取目的和用途,在用户授权后进行操作。例如,在获取用户位置信息时,弹出提示告知用户获取位置的目的。使用wx.getSetting
和wx.authorize
等方法进行权限管理。
wx.getSetting({
success: res => {
if (!res.authSetting['scope.userInfo']) {
wx.authorize({
scope: 'scope.userInfo',
success: () => {
// 获取用户信息的逻辑
},
fail: () => {
console.log('用户未授权获取用户信息');
}
});
}
}
})
3. 防止小程序被恶意攻击或篡改的方法
- 进行安全加固,如代码混淆。
- 对用户身份进行验证,防止非法用户访问。例如,使用登录验证机制。
- 及时更新小程序,修复已知安全漏洞。
九、功能实现类
1. 微信小程序支付功能实现流程
小程序端调用支付接口,传递订单信息。后端接收到请求后,调用微信支付接口生成预支付订单,并返回给小程序端预支付交易会话标识等信息。小程序端使用返回的信息调用微信支付 API 发起支付请求。用户在微信中完成支付,微信服务器会通知小程序后端支付结果。小程序后端根据支付结果进行相应的业务处理,并通知小程序端支付结果。
// 小程序端支付逻辑
wx.request({
url: '后端接口地址',
data: {
// 订单信息
},
success: res => {
if (res.data.code === 0) {
const payParams = res.data.data;
wx.requestPayment({
timeStamp: payParams.timeStamp,
nonceStr: payParams.nonceStr,
package: payParams.package,
signType: payParams.signType,
paySign: payParams.paySign,
success: () => {
console.log('支付成功');
},
fail: err => {
console.log('支付失败', err);
}
});
}
}
})
2. 小程序实现下拉刷新和上拉加载更多功能
- 在页面的
.json
文件中配置enablePullDownRefresh
为true
开启下拉刷新功能,在页面的onPullDownRefresh
函数中进行下拉刷新的数据加载操作,并调用wx.stopPullDownRefresh
停止下拉刷新动画。
Page({
onPullDownRefresh: function () {
// 下拉刷新数据加载逻辑
wx.stopPullDownRefresh();
}
})
- 在页面的底部添加加载更多的提示,当页面滚动到底部时触发
onReachBottom
函数,进行上拉加载更多的数据加载操作。
Page({
onReachBottom: function () {
// 上拉加载更多数据加载逻辑
}
})
3. 小程序集成地图功能及实现相关操作
- 在页面的
.json
文件中引入地图组件。
{
"usingComponents": {
"map": "plugin://myPlugin/map"
}
}
- 在
.wxml
文件中使用<map>
标签展示地图。
<map id="myMap"></map>
- 通过
wx.getLocation
等方法获取用户位置信息,并设置地图的中心坐标等属性。可以使用地图的相关 API 实现定位、导航等功能。
Page({
onLoad: function () {
wx.getLocation({
success: res => {
const latitude = res.latitude;
const longitude = res.longitude;
this.setData({
latitude,
longitude
});
}
});
}
})
十、综合类
1. 微信小程序与 H5 的异同点
- 相同点:都可在移动端运行,使用 HTML、CSS、JavaScript 开发。
- 不同点:小程序无需安装,性能相对较高,开发框架和 API 由微信提供相对封闭;H5 需要通过浏览器访问,性能受浏览器限制,开发更灵活。
2. 微信小程序未来发展看法及面临的挑战
- 看法:在更多领域应用,生态更完善,技术不断更新。
- 挑战:安全、性能、用户体验需改进,与原生应用竞争,兼容性问题。
3. 开发复杂微信小程序的项目规划和技术选型
- 项目规划:需求分析、架构设计、开发计划、测试计划、发布计划。
- 技术选型:开发框架、数据存储、网络请求、组件库、测试工具。例如,可以选择使用 Taro 等多端开发框架,云开发数据库进行数据存储,封装网络请求工具类进行网络请求,使用一些成熟的组件库提高开发效率,选择合适的测试工具进行单元测试、集成测试等。