当前位置:首页 > 技术 > 正文内容

微信小程序开发实用技巧汇总

访客 技术 2026年7月20日 22

页面生命周期

钩子函数 类型 说明 触发时机
onLoad function 页面加载完成时触发 首次进入页面调用一次,可获取页面参数
onReady function 页面首次渲染完毕 仅调用一次,此时可与视图层交互
onShow function 页面显示时触发 每次从后台返回或打开页面都会调用
onHide function 页面隐藏时触发 进入后台或切换到其他页面时触发
onUnload function 页面卸载时触发 返回上一页或页面被替换时触发

执行顺序:onLoad → onShow → onReady

交互事件钩子

钩子函数 类型 说明
onPullDownRefresh function 监听用户下拉刷新操作
onReachBottom function 监听页面上拉触底事件
onShareAppMessage function 监听用户点击右上角分享

页面跳转方式

官方文档:wx.navigateBack

// 重新加载应用内的任意页面
wx.reLaunch({
  url: '/pages/home/home'
});

// 关闭当前页面,跳转到指定页面(不支持跳转到 tabbar)
wx.redirectTo({
  url: '/pages/profile/profile'
});

// 保留当前页面,跳转到指定页面(页面栈最多十层)
wx.navigateTo({
  url: '/pages/detail/detail?id=1'
});

// 返回上一页面或多级页面
wx.navigateBack({
  delta: 1
});
// 可通过 getCurrentPages() 获取当前页面栈信息

跨页面数据传递

方式一:URL 参数传递

// 编程式跳转携带参数
wx.navigateTo({
  url: '/pages/book/detail?bookId=' + bookId + '&category=' + category
});

// 声明式跳转携带参数
<navigator url="/pages/chapter/list?bookId={{ bookId }}">章节列表</navigator>

// 接收参数
onLoad: function(query) {
  console.log('书籍ID:' + query.bookId);
  console.log('分类:' + query.category);
}

方式二:本地存储

操作 异步方法 同步方法
写入 wx.setStorage wx.setStorageSync
读取 wx.getStorage wx.getStorageSync
删除 wx.removeStorage wx.removeStorageSync
清空 wx.clearStorage wx.clearStorageSync
获取信息 wx.getStorageInfo wx.getStorageInfoSync
// 写入本地存储
wx.setStorage({ key: 'userToken', data: 'abc123' });

// 读取本地存储
const token = wx.getStorageSync('userToken');

方式三:全局数据对象

// app.js 定义全局数据
App({
  globalData: {
    userInfo: null,
    apiBase: 'https://api.example.com'
  }
});

// 页面中获取全局数据
const app = getApp();
const baseUrl = app.globalData.apiBase;

列表渲染中的事件传参

<!-- wxml 文件 -->
<!-- 使用 data- 前缀定义自定义属性 -->
<view class="item-list">
  <view wx:for="{{ bookList }}" wx:key="index" 
        data-book-id="{{ item.bookId }}" 
        data-position="{{ index }}"
        bindtap="handleTap">
    <image src="{{ item.cover }}" mode="aspectFill"></image>
    <text>{{ item.name }}</text>
  </view>
</view>

// js 文件
handleTap: function(event) {
  const bookId = event.currentTarget.dataset.bookId;
  const position = event.currentTarget.dataset.position;
  this.navigateToDetail(bookId, position);
}

表单提交与 formId 获取

获取 formId

// 在 form 组件上添加 report-submit 属性
<form bindsubmit="handleSubmit" report-submit='true'>
  <button form-type="submit">提交</button>
</form>

// 注意:开发工具中 formId 为模拟值,提示 "the formId is a mock one"
// 真是 formId 只能在真机上获取并提交到服务器

表单数据绑定

// wxml
<form bindsubmit="submitForm" report-submit='true'>
  <input name="username" value="{{ formData.username }}" 
         bindinput="handleInput" placeholder="请输入用户名" />
  <button form-type="submit">提交表单</button>
</form>

// js
handleInput: function(e) {
  this.setData({
    'formData.username': e.detail.value
  });
},

submitForm: function(e) {
  console.log('表单数据:', e.detail.value);
  console.log('formId:', e.detail.formId);
}

WXS 过滤器使用

WXS 是小程序独有的脚本语言,可在页面中直接使用,无需引入外部 JS 文件。

// 在需要的页面引入 WXS 模块
<wxs module="utils" src="../../utils/string.wxs"></wxs>

// 使用过滤器
{{ utils.formatDate(timestamp) }}
{{ utils.ellipsis(content, 20) }}

// utils/string.wxs 文件内容
var formatDate = function(timestamp) {
  var date = getDate(timestamp);
  var year = date.getFullYear();
  var month = date.getMonth() + 1;
  var day = date.getDate();
  return year + '-' + month + '-' + day;
};

var ellipsis = function(str, length) {
  if (str.length <= length) return str;
  return str.substring(0, length) + '...';
};

module.exports = {
  formatDate: formatDate,
  ellipsis: ellipsis
};

常见问题与解决方案

问题一:数据渲染延迟导致元素闪烁

现象:页面加载时,已隐藏的元素会短暂显示后再消失。

解决方案:使用 hidden 属性控制元素显示隐藏。

<view hidden="{{ isShow }}">内容区域</view>

问题二:页面栈溢出导致无法跳转

现象:小程序页面栈限制为十层,继续跳转会失败。

解决方案:

  • 优先使用 wx.redirectTo 或 wx.reLaunch 替换 wx.navigateTo
  • 在跳转前检查并清理重复页面
// 跳转前清理页面栈
const pages = getCurrentPages();
const samePage = pages.find(p => p.route === 'pages/index/index');
if (samePage) {
  // 找到重复页面,可以选择重定向到该页面
}

问题三:页面背景色不一致

现象:页面内容不足一屏时,底部背景色与其他区域不一致。

解决方案:

/* wxss - 简单情况 */
page {
  background-color: #f5f5f5;
}

/* wxss - 切换背景色时 */
.fixed-bottom {
  position: fixed;
  width: 100%;
  height: 200rpx;
  bottom: 0;
  left: 0;
  z-index: 1;
}

// wxml
<view class="content">主要内容区域</view>
<view class="fixed-bottom {{ isNight ? 'night-mode' : 'day-mode' }}"></view>

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。