在 UniApp 中使用 sendBeacon 方法,主要用于在页面卸载(如关闭或刷新)时异步发送少量数据到服务器,确保数据可靠传输且不阻塞页面卸载。UniApp 基于 Vue.js,因此可以直接在 Vue 组件的生命周期钩子中使用浏览器的 navigator.sendBeacon API。
基本用法
sendBeacon 方法接受两个参数:
url:数据发送的目标 URL。
data(可选):要发送的数据,可以是字符串、FormData、Blob 等类型。
代码示例
以下是一个在 UniApp 页面中使用的示例,假设在页面卸载时发送数据到服务器:
export default {
data() {
return {
// 示例数据
analyticsData: {
event: 'page_unload',
timestamp: Date.now(),
userAgent: navigator.userAgent
}
};
},
mounted() {
// 在页面加载时监听 beforeunload 事件(适用于浏览器环境)
window.addEventListener('beforeunload', this.sendData);
},
beforeDestroy() {
// 移除事件监听,避免内存泄漏
window.removeEventListener('beforeunload', this.sendData);
},
methods: {
sendData() {
// 将数据转换为字符串(sendBeacon 支持字符串、FormData 等)
const data = JSON.stringify(this.analyticsData);
// 使用 sendBeacon 发送数据
const success = navigator.sendBeacon('https://yourserver.com/collect', data);
if (success) {
console.log('数据发送成功');
} else {
console.error('数据发送失败');
// 可备选方案:使用同步 XMLHttpRequest 或 localStorage 暂存
}
}
}
};
注意事项
-
UniApp 环境兼容性:sendBeacon 是浏览器 API,在 UniApp 的 H5 环境中可用,但在小程序或 App 端可能不支持(小程序需使用其自有 API,如 wx.request)。建议通过条件编译处理不同平台:
// #ifdef H5
navigator.sendBeacon(url, data);
// #endif
-
数据格式:服务器需支持接收数据(如设置 Content-Type 为 application/json)。如果发送 FormData,服务器需解析表单数据。
-
异步特性:sendBeacon 是异步的,不阻塞页面卸载,但无法获取响应结果。确保数据轻量(通常限制为 64KB)。
-
备选方案:如果 sendBeacon 失败(返回 false),可考虑使用 localStorage 暂存数据,下次页面加载时重发。
总结
在 UniApp 的 H5 环境中,直接使用 navigator.sendBeacon 实现页面卸载时的数据上报。注意平台差异,并处理可能的数据发送失败情况。