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 ...
随机推荐
- mysql14 sql优化-索引失效
1.索引失效 先创建符合索引,三个字段 ALTER table abilityassessrecord add INDEX idx_customerno_roomno_abilityassessrec ...
- mysql04-管理mysql常用指令
https://www.runoob.com/mysql/mysql-administration.html 1.常用指令 USE 数据库名 :选择要操作的Mysql数据库,使用该命令后所有Mysql ...
- SQL处理数据库表特殊字符
替换回车换行:REPLACE(REPLACE(REPLACE('字符串', CHAR(13) + CHAR(10) , '<br />'), CHAR(13), '<br /> ...
- 手把手教你为基于Netty的IM生成自签名SSL/TLS证书
1.引言 对于IM聊天应用来说,为了提升安全性,对聊天消息加密是常规操作. 众所周之,Netty是高性能的Java NIO网络通信框架,因而用Netty来写IM是再正常不过了.网上关于为Netty生成 ...
- 代码随想录算法训练营day12 | leetcode 239. 滑动窗口最大值 347.前 K 个高频元素
基础知识 ArrayDeque deque = new ArrayDeque(); /* offerFirst(E e) 在数组前面添加元素,并返回是否添加成功 offerLast(E e) 在数组后 ...
- 3D场景建模零代码平台
3D场景建模软件(零基础.零代码.**),是指用来制作场景的软件,分为2D建模和3D建模,二者使用的技术及原理不同. 2D软件:它是用3维几何图形绘制出三维图形的软件,其主要功能是利用软件中已经画好的 ...
- Python:Excel自动化实践入门篇 乙【送图书活动继续】
*以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/y-npGelPJwmx3iNvHaXRTg 本文上接<Py ...
- pat乙级 1021个位数统计
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> ...
- 全国计算机二级python备考
选择题: https://www.itkaoshi.net/3476.html 操作题: https://www.bilibili.com/video/BV1Zj411f7ey?p=1 经典题讲解: ...
- SAP NOTE 489676 VF188异常
解决方案 VOFM->复制请求->出具发票单据(B) 新建999例程