第2章:小程序技术基础高频问题

本章聚焦面试最高频的四大基础模块:生命周期、组件通信、WXML/WXSS核心机制、路由跳转。以下先通过一张回答框架图建立全局思考路径,再拆解为3个典型面试问答卡片,最后用一个真实项目模板串联所有知识点。

生命周期回答框架 分类:应用/页面/组件 顺序:加载→显示→就绪→隐藏→卸载 场景:初始化/埋点/清理 注意:页面栈/重复/泄漏
💡 扫读提示:面试时先扣住“分类→顺序→场景→注意”四步框架,再结合具体代码举例,可覆盖90%的生命周期问题。

面试问答卡片(3/3)

Q1:请简述小程序的生命周期,包括页面和组件生命周期。

🎯 考察点:

  • 是否清楚应用、页面、组件三类生命周期及其触发时机
  • 能否区分 onLoad / onShow / onReady / onHide / onUnload 执行顺序
  • 能否举例说明生命周期在数据初始化、埋点、资源清理中的典型用法

📐 回答框架:分类 + 顺序 + 场景 + 注意(坑)

📝 示例回答:小程序生命周期分为应用(onLaunch/onShow/onHide)、页面(onLoad→onShow→onReady→onHide→onUnload)和组件(created→attached→ready→detached)。常用于数据请求(onLoad)、埋点(onShow)、定时器清理(onHide)。注意:页面跳转再返回会触发 onShow 但不会再次 onLoad;组件内不要直接依赖页面 onLoad。

❓ 可能追问:

  • 页面A → B → 返回A,A的生命周期分别如何执行?
  • 组件 attached 和页面 onReady 哪个先执行?
  • 如何监听小程序从后台切回前台?
⚠️ 避坑提醒:不要在 onShow 里做高耗时操作;组件内慎用 setData 触发频繁渲染;页面 onHide 记得暂停全局定时器,避免内存泄漏。

Q2:小程序组件间如何通信?列举主要方式及适用场景。

🎯 考察点:

  • 是否掌握父子(props/events)、兄弟(全局数据/Store)、跨页面(EventChannel)、多层级(relations)通信方式
  • 能否根据业务场景选择合适的通信方式
  • 对通信性能(避免频繁 setData)是否有意识

📐 回答框架:分类列举 → 方式原理 → 优缺点 → 推荐使用

📝 示例回答:父子通信:父传子用 properties,子传父用 triggerEvent。兄弟通信:通过 getApp() 全局对象或 mobx-miniprogram。跨页面通信:使用 wx.EventChannel 传递复杂数据。多层级:使用 relations 或抽象节点。建议:简单场景用 props + events,复杂状态用全局 Store 避免层层传递。

❓ 可能追问:

  • triggerEvent 如何传递多个参数?
  • 兄弟组件通过全局对象通信会有什么性能隐患?
  • 如何利用组件 relations 实现自定义 tab 组件联动?
⚠️ 避坑提醒:避免全局通信频繁触发 setData 导致性能下降;relations 需要成对定义且注意生命周期;triggerEvent 事件名建议加命名空间防冲突。

Q3:小程序的路由跳转方式有哪些?如何传递参数?页面栈怎么管理?

🎯 考察点:

  • 是否熟悉 navigateTo、redirectTo、switchTab、reLaunch、navigateBack 五种方式
  • 参数传递方式(url query、EventChannel)
  • 页面栈深度限制(10层)及 overflow 处理

📐 回答框架:列方式 → 参数传递 → 页面栈原理 → 特殊情况(switchTab 不能带参数等)

📝 示例回答:路由方式:navigateTo(保留当前页,栈增)、redirectTo(关闭当前页,栈不变)、switchTab(清空非tab页)、reLaunch(关闭所有页)、navigateBack(回退)。参数通过 url?key=value 或 EventChannel。注意:navigateTo 栈最多10层,超限用 redirectTo;switchTab 不能传 query 参数,需借助全局变量。

❓ 可能追问:

  • navigateTo 和 redirectTo 在页面栈上的实际区别?
  • 如何通过 EventChannel 实现页面间传递对象数据?
  • navigateBack 返回时如何刷新前一个页面?
⚠️ 避坑提醒:url 参数长度限制(约2KB);页面栈溢出导致白屏,务必监控;navigateBack 可指定 delta 但需确认栈深度;switchTab 传参只能通过全局变量或缓存。

🏗️ 项目案例:真实模板

以下项目模板将生命周期、组件通信、WXML/WXSS 优化、路由跳转全部融入实际场景,面试时可直接套用。

维度 内容
项目名称 轻享拼团(社区电商小程序)
业务背景 帮助社区团长发起拼团,用户参团购买商品,支持商品浏览、拼团下单、支付、订单管理。
规模指标 日活 5 万+,商品 SKU 1 万+,峰值拼团活动 3000/天,页面总数 30+,自定义组件 80+。
技术栈 原生小程序(WXML/WXSS/JS)+ 云开发(数据库、云函数)+ WeUI + mobx-miniprogram(状态管理)+ rpx 适配。
核心难点
  1. 拼团倒计时实时更新:页面级定时器管理,onHide 暂停、onUnload 清除
  2. 商品列表虚拟滚动:利用 viewport 计算 + 预加载,减少 WXML 节点
  3. 购物车组件与多个页面通信:父子 props + mobx 全局 Store
  4. 多层拼团页面栈控制:超过 8 层时自动用 redirectTo 替换 navigateTo
  5. 多主题适配:CSS 变量 + 根元素类名切换,兼容 iOS 低版本
面试高频追问
  • 倒计时定时器如何避免逃离页面后继续运行?
  • 虚拟滚动中 WXML 复用 key 怎么设置?动态高度如何处理?
  • mobx-miniprogram 与原生 setData 如何衔接?
  • switchTab 传参被限制如何解决?
  • CSS 变量在低版本微信浏览器不生效怎么办?
可迁移回答话术 “我负责的拼团项目中,通过页面生命周期(onShow/onHide)统一管理定时器,避免内存泄漏;商品列表采用虚拟滚动,只渲染可视区域+上下缓冲区,列表滑动性能提升 60%;组件通信使用父子 props + mobx Store,保证购物车状态实时同步且不触发多余渲染;路由方面设计了页面栈监控,当栈深度 >8 时自动降级为 redirectTo 防止白屏;主题使用纯 CSS 变量方案,并通过 @supports 做降级。”
💎 面试加分点:在回答任何基础题时,主动关联项目中的实际场景(如倒计时、虚拟滚动),展示从“知道”到“做过”到“能优化”的深度。