vue 数据埋点

本文讲述了菜鸟在项目中如何实现简单的数据埋点,包括获取用户IP和地址、解决页面跳转后界面问题、利用Vue3的组合式API跟踪页面停留时间,以及计划扩展到按钮埋点的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近菜鸟做项目,需要做简单的数据埋点,不是企业级的,反正看渡一的视频,企业级特别复杂,包括但不限于:错误收集、点击地方、用户行为……

菜鸟的需求就是简单收集一下用户的ip、地址、每个界面的访问时间,而且面向的是全球用户,所以自己简单写了。

一、获取IP、地址

这里菜鸟最开始想到的就是高德、腾讯地图这样的平台,里面都是有ip逆向解析的,但是菜鸟一看高德的api,发现不支持国外!!!
在这里插入图片描述
然后百度虽然支持,但是也不是很准确,最重要的一点是总是提示我跨域了,不知道咋解决!!!
在这里插入图片描述
所以菜鸟就在网上找到一个免费且比较准确的

https://ipinfo.io/account/profile

反正电脑不是手机,定位确实不好搞,反正菜鸟感觉定位的地方就是离你最近的转发基站的位置,而不是你本来的位置!

希望有知道可以精确定位的读者可以 指点江山,激扬文字

二、数据埋点

这里菜鸟最开始想的是 vue3 的 mixins,发现 vue3 不推荐 mixins,但是可以直接使用组合式 API 的组合式函数,就相当于把mixins当函数提出去,然后需要用到的时候直接引入就行!

然后菜鸟写的代码就是这样的了:
src/mixins/pagetime.js

/**
 * 书写界面停留时间函数
 */
import {
    onBeforeUnmount } from "vue";
import {
    DataburialpointApi } from "@/network/api";
import {
    useRoute } from "vue-router";

// 按照惯例,组合式函数名以“use”开头
export function usePageTime() {
   
  const _routeObj = {
   
    "/content": "首页",
    "/services/0": "NGS- Whole Genome Sequencing",
    "/services/1": "NGS- mRNA Sequencing",
    "/services/2": "NGS- Small RNA Sequencing",
    "/services/3": "NGS-Lnc RNA Sequencing",
    "/services/4": "NGS- Metagenome Sequencing",
    "/services/5": "NGS- Microbial diversity Sequencing",
    "/services/6": "NGS- Hi-C Sequencing",
    "/services/7": "Nanopore- Nanopore Ultra-long Sequencing",
    "/services/8": "Nanopore- Nanopore Sequencing",
    "/services/9": "Nanopore- Direct RNA Sequencing",
    "/services/10": "Nanopore- Lnc RNA Sequencing",
    "/services/11": "Nanopore- CircRNA Sequencing",
    "/services/12": "Nanopore- TAIL Iso Sequencing",
    "/services/13": "Nanopore- Isoform Sequencing",
    "/services/14": "Nanopore- Direct-CDNA Sequencing",
    "/services/15": "Nanopore- Single-cell full-length transcriptome Sequencing",
    "/services/16": "Nanopore- Full-length 16S/18S/ITS Amplicon Sequencing",
    "/services/17": "Nanopore- 16S-23S Amplicon Metagenomic Sequencing",
    "/services/18": "Nanopore- Metagenome Sequencing",
    "/services/19": "Nanopore- PORE-C Sequencing",
    "/services/20": "Pacbio Revio- Revio Sequencing",
    "/resources/sample": "资源-样本要求",
    "/about": "关于我们",
    "/contactus": "联系我们",
  };
  let _startTime = Date.now();
  let _useTime = 0;
  // 路由菜单相关
  let route = useRoute();
  onBeforeUnmount(() => {
   
    _useTime = Date.now() - _startTime;
    let _formdata = {
   };
    _formdata.visitorId = localStorage.getItem("userId");
    _formdata.url = route.path;
    _formdata.classify = _routeObj[route.path];
    _formdata.time = _useTime;
    DataburialpointApi(_formdata)
      .then((res) => {
   
        console.log(res);
      })
      .catch((err) => {
   
        console.log(err);
      });
  });
}

结果压根不靠谱,这样发送给后端的是跳转后的界面,而不是跳转前的,所以每次都是把上一个界面的访问时间和新跳转的界面发送过去

### Vue3 中实现埋点的方法 #### 使用 Vuex 和自定义 Hook 实现全局埋点 为了在 Vue 3 项目中实现可靠的埋点功能,可以采用 Vuex 来集中管理应用程序的状态,并创建自定义 Hook 处理具体的埋点逻辑。这种方法不仅能够保持代码整洁,还能方便地跟踪用户的交互行为。 首先,在 `store/index.js` 文件内配置好 Vuex store: ```javascript import { createStore } from 'vuex' export default createStore({ state() { return { events: [] } }, mutations: { logEvent(state, event) { state.events.push(event); // 可在此处发送事件到服务器或其他分析平台 } }, actions: { track({ commit }, payload) { const timestamp = new Date().toISOString(); commit('logEvent', { ...payload, timestamp }); } } }) ``` 接着,构建一个可重用的 Hook 函数用于捕获组件内的特定动作并触发相应日志记录操作[^2]。 ```typescript // hooks/useTracking.ts import { useStore } from 'vuex'; import { onMounted, ref } from 'vue'; function useTracking(eventName) { const store = useStore(); function handleTrack(data) { store.dispatch('track', { name: eventName, data }); } return { handleTrack }; } export default useTracking; ``` 最后,在任何需要的地方引入此 Hook 并调用它来执行实际的日志记录工作。 ```html <template> <div @click="handleClick">点击这里</div> </template> <script setup lang="ts"> import useTracking from '@/hooks/useTracking'; const { handleTrack } = useTracking('button-click'); function handleClick() { handleTrack({ message: '用户点击了按钮' }); } </script> ``` #### 利用 Beacon API 提升数据上报可靠性 当涉及到页面卸载期间的数据传输时,推荐使用 Beacon API 替代传统的 XMLHttpRequest 或 Fetch 请求方式。这是因为 Beacon 能够确保即使浏览器窗口关闭或导航至其他页面之后仍然能成功提交重要信息给服务器端处理[^1]。 可以在应用退出前监听 `beforeunload` 事件并向服务端异步发送未完成的任务列表作为最终报告的一部分。 ```javascript window.addEventListener('beforeunload', async () => { navigator.sendBeacon('/api/endpoint', JSON.stringify(store.state.events)); }); ``` #### 集成第三方统计工具如百度统计 对于希望快速集成成熟解决方案而不愿自行搭建基础设施的情况,则可以选择接入像百度统计这样的外部服务商所提供的 SDK 。这通常只需要几行简单的命令就能完成初始化设置过程[^3]。 安装依赖包: ```bash npm install --save vue-baidu-analytics ``` 按照官方文档说明修改入口文件(main.js),注册插件实例并将必要的参数传递进去以便正常使用其全部特性。 ```javascript import VueBaiduAnalytics from 'vue-baidu-analytics' import App from './App.vue' Vue.use(VueBaiduAnalytics, { hm: ['_init_', '5f7d8e9a'] }) new Vue({ render: h => h(App), }).$mount('#app') ``` #### 自定义指令实现局部元素级埋点 除了上述提到的技术手段外,还可以借助于 Vue 的自定义指令机制针对单个 DOM 元素实施更加精细粒度上的监测活动。这种方式特别适合用来捕捉诸如按钮点击次数之类的简单场景下的用户互动情况[^4]。 定义一个新的全局指令供后续复用: ```javascript // main.js or directive plugin file import { createApp } from 'vue'; createApp(App).directive('log', { mounted(el, binding) { el.addEventListener('click', () => { console.log(`Element ID:${el.id}, Event Data:` + JSON.stringify(binding.value)) }) } }) ``` 随后只需按需附加该属性即可轻松激活对应的功能模块而无需额外编写业务无关的样板代码片段。 ```html <button v-log="{ page:'home', action:'submit-form', elementId:'submitButton'}" id="myButton">Submit Form</button> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PBitW

可以去掘金看更完善版本

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值