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

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

访客 技术 2026年7月20日 2

页面生命周期

钩子函数 类型 说明 触发时机
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...

发表评论

访客

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