vue项目埋点实践,使用img发送埋点数据
埋点数据种类:
1.按钮点击
2.页面切换
(具体数据内容根据实际需求再定义)
埋点数据交互:
采用img的默认下载功能,发送get请求,带上埋点数据(此处后期需要加上加密)
发送频率:
1.固定时间
2.固定数据量(根据get请求的限制和每条埋点的数据量制定最大的存储数据量)
代码如下
main.js
1.自定义指令监听发送
2.页面切换监听
1 import Vue from 'vue'
2 import App from './App.vue'
3 import router from './router'
4 import store from './store'
5 // import axios from 'axios'
6 import ElementUI from 'element-ui';
7 import 'element-ui/lib/theme-chalk/index.css';
8 import JsonExcel from 'vue-json-excel'
9 import { get, post } from '@/util/http'
10
11 Vue.config.productionTip = false
12 // Vue.prototype.$axios = axios
13 Vue.prototype.$post = post;
14 Vue.prototype.$get = get;
15 Vue.use(ElementUI)
16 Vue.component('downloadExcel', JsonExcel)
17
18 new Vue({
19 router,
20 store,
21 render: h => h(App)
22 }).$mount('#app')
23
24 /**
25 * 自定义埋点指令
26 */
27 Vue.directive('log', {
28 bind(el, binding, vNode) {
29 // 当前页面的vue对象
30 const ts = vNode.context
31 el.addEventListener('click', () => {
32 console.log('v-log指令', binding.value)
33 const text = binding.value.text
34 store.dispatch('dealLogger', {
35 type: '点击操作',
36 text,
37 curPage: ts.$route.name,
38 timeStamp: '事件发生的时间戳' + new Date().getTime() // 时间戳
39 })
40 })
41
42 }
43
44 })
45
46 let currentTime = null
47 let startTime = Date.now()
48
49 router.beforeEach((to, from, next) => {
50 console.log('beforeEach')
51 if (to) {
52 // 第一步:页面跳转后记录一下当前的时间 currentTime
53 currentTime = Date.now()
54 // 第二步:计算 currentTime - startTime 的 差值
55 console.log('用户由 ', from.name, ' 页面 跳转到 ', to.name, ' 页面,在 ', from.name, ' 页面停留了 ', currentTime - startTime, '毫秒。转换成秒数约为:', parseInt((currentTime - startTime) / 1000))
56 // 通过计算currentTime - startTime 的 差值 之后,再上报数据
57 const sed = parseInt((currentTime - startTime) / 1000)
58 store.dispatch('dealLogger', {
59 type: '页面切换',
60 prePage: from.name, // 上一个页面
61 curPage: to.name, // 当前页面
62 timeStay: '停留了' + sed + 's', // 停留时间
63 })
64
65 // 第三步:每次都要初始化一下 startTime
66 startTime = Date.now()
67 }
68 next()
69 })
70
71 // Vue.config.errorHandler = (err, vm, info) => {
72 // console.log('*************************************************************************************addEventListener errorHandler')
73 // console.log(err)
74 // console.log(vm)
75 // console.log(info)
76 // }
77
78 // window.addEventListener('error', (evt) => {
79 // console.log('*************************************************************************************addEventListener error')
80 // console.log(evt)
81 // })
82
83 // // 监听promise的报错
84 // window.addEventListener('unhandledrejection', (evt) => {
85 // console.log('*************************************************************************************addEventListener unhandledrejection')
86 // console.log(evt)
87 // })
vuex文件
export default {
state: {
logUrl: 'https://kunpeng.csdn.net/ad/json/list', // 发送埋点的url
loggerResult: [], // 埋点数据统计
logLength: 5, // 最大存储埋点数量
logTime: 60, // 发送埋点间隔时间
},
getters: {
getLogTime: state => state.logTime,
getLoggerResult: state => state.loggerResult
},
mutations: {
/**
* 添加埋点数据
* @param {*} state
* @param {*} payload
*/
appendLogger: (state, payload) => {
state.loggerResult.push(payload)
},
/**
* 清空埋点数据
* @param {*} state
* @param {*} payload
*/
resetLogger: (state) => state.loggerResult = [],
},
actions: {
/**
* 处理埋点数据
* @param {*} param0
* @param {*} payload
*/
dealLogger({ state, commit, dispatch }, payload) {
console.log('dealLogger****************', payload)
commit('appendLogger', payload)
const res = state.loggerResult
// 当埋点数量超出定义的最大存储数量,发送一次
if (res.length >= state.logLength) {
dispatch('sendLogger')
}
},
/**
* 发送埋点数据
* @param {*} param0
* @param {*} payload
*/
sendLogger({ state, commit }) {
const res = state.loggerResult
// 如果没有埋点数据,则不发送
if (res.length === 0) {
return
}
// 发送数据
console.log('sendLogger loggerResult', res)
const img = new Image()
img.style.display = 'none'
const removeImage = function () {
img.parentNode.removeChild(img)
}
img.onload = removeImage
img.onerror = removeImage
img.src = `${state.logUrl}?params=${JSON.stringify(res)}`
document.body.appendChild(img)
// 清空
commit('resetLogger')
}
},
modules: {
}
}
页面具体实现
v-log绑定相关信息
<div class="btn">
<el-form-item>
<el-button type="primary" @click="onSubmit" v-log="{text: '查询'}">查询</el-button>
</el-form-item>
<el-form-item>
<el-button type="" @click="onReset" v-log="{text: '重置'}">重置</el-button>
</el-form-item>
</div>
vue项目埋点实践,使用img发送埋点数据的更多相关文章
- 【Vuejs】335-(超全) Vue 项目性能优化实践指南
点击上方"前端自习课"关注,学习起来~ 前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 D ...
- VUE项目性能优化实践——通过懒加载提升页面响应速度
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 最近我司因业务需求,需要在一个内部数据分析平台集成在线Excel功能,既然我 ...
- webpack+vue项目实战(四,前端与后端的数据交互和前端展示数据)
地址:https://segmentfault.com/a/1190000010063757 1.前言 今天要做的,就是在上一篇文章的基础上,进行功能页面的开发.简单点说呢,就是与后端的数据交互和怎么 ...
- Vue--axios:vue中的ajax异步请求(发送和请求数据)、vue-resource异步请求和跨域
跨域原理: 一.使用axios发送get请求 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 & ...
- vue项目缓存最佳实践
需求 在开发vue的项目中有遇到了这样一个需求:一个视频列表页面,展示视频名称和是否收藏,点击进去某一项观看,可以收藏或者取消收藏,返回的时候需要记住列表页面的页码等状态,同时这条视频的收藏状态也需要 ...
- vue项目使用v-charts的柱形图的各种样式和数据配置
找了很多网上关于v-charts的柱形图使用,我发现我一模一样的配置就是没有效果,我原来是按需引入的, import VeHistogram from 'v-charts/lib/histogram' ...
- HBuilder打包vue项目app后空白,并请求不到数据
(解决空白问题)在打包之前一定要修改 config 目录下的 index.js 文件中的 bulid 模块打包配置项,否则会出现空白,如图 修改前 assetsPublicPath= '/',. ...
- Vue项目中实现tab栏和步骤条的数据联动
也就是tab栏切换步骤条随之变化 <template> <div> <!-- 面包屑导航 --> <el-breadcrumb sepa ...
- vue项目部署上线
前言 今天把自己写的demo登录写完了,就想着试着走一下部署上线的流程.参考了很多的文档,终于成功进行了部署.在这里将服务器的搭建和vue项目的 部署上线进行整理(都是基础的知识,希望对大家有帮助.对 ...
- vue项目post、put、delete、get向java后端传数组
通常我们向后端发送数据有两种方式 get.post,后又restful风格出现,又有put.delete等传参方式.但是对于我们来说他们的传参本质还是只有get和post的两种,即 get.delet ...
随机推荐
- 精美的web前端源码的特效
1.JS自定义烟花特效 这是一款基于JS和Canvas的自定义烟花特效,初始化界面的时候特效是不带声效的绽放,当你点击顶部中间的播放,即可以看到美丽的烟火也可以听到烟花绽放的声音,让你脑海浮现过年团圆 ...
- 不花钱几分钟让你的站点也支持https
前言 现在,免费SSL证书已经很普遍了,但是,申请和配置SSL证书仍然是一件较为繁琐的事,修改web服务配置在所难免,且不同的web服务配置方法不一样,不具备通用性.本文介绍一种通用的快速配置方法,w ...
- Navicat修改mysql表的字符集和排序规则
突然想起前一阵子,在做javaweb后端debug的时候遇到的这个问题.由于在Dao层测试的时候没有尝试过中文的测试例,所以在Service写好后一直不报错但是无法插入数据库. 找了好久才发现是Mys ...
- 三元运算符整体执行情况:Object obj = true? Integer.valueOf(1): Double.valueOf(2.0);
/* * @author YAM */public class Test01 { public static void main(String[] args) { Object obj = true? ...
- Vue框架:9,Vue3的用法,setup函数,ref和reactive,计算属性和监听属性,生命周期,toRefs,script setup的作用和lang,Vue后台管理模板
目录 前端开发之Vue框架 一.Vue3 1.Vue3创建项目 2.setup函数 3.ref和reactive 4.计算属性和监听属性 5.生命周期 6.toRefs 7.script setup的 ...
- LG P6156 简单题
\(\text{Problem}\) \(\text{Analysis}\) 显然 \(f=\mu^2\) 那么 \[\begin{aligned} \sum_{i=1}^n \sum_{j=1}^n ...
- 记录一个cpu彪高的BUG处理--jvm调优
业务场景:游戏行业,N个服务器,要进行大批量的合服处理,玩家数据会上升,从新整理和服务器的分配情况和逻辑处理,正常开发后,当天白天正常,然后晚上高峰期开始玩家频繁反馈无法登录~~~ 处理逻辑: 优先确 ...
- 代码随想录-day2
哈希表 基础知识 哈希表和链表都是属于基础数据结构的一种,都是必须掌握牢靠的知识. 哈希表是根据关键码的值而直接进行访问的数据结构. 简单来说就是使用数据得到的哈希值来作为哈希表的key用于获取数据. ...
- python ( 进阶 第一部 )
目录 列表的相关操作与函数 字符串的相关操作与函数 集合相关操作与函数 字典相关操作与函数 深浅拷贝 文件操作 列表的相关操作 列表的拼接 lst1 = [1,2,3] lst2 = [4,5,6,6 ...
- git提交到代码到远程仓库,合并分支提示entirely different commit histories(备忘)
最近提交代码到github,合并分支的时候提示"master and main are entirely different commit histories" master为本地 ...