在 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 实现页面卸载时的数据上报。注意平台差异,并处理可能的数据发送失败情况。