Vue单页面中进行业务数据的上报
为什么要在标题里加上一个业务数据的上报呢,因为在咱们前端项目中,可上报的数据维度太多,比如还有性能数据、页面错误数据、console捕获等。这里我们只讲解业务数据的埋点。
业务数据的上报主要分为:
- 各个路由的PV上报;
- 用户的点击行为上报;
- 用户操作结果(分享是否成功)的数据上报等;
通用和必须上报的数据,均在上报的代码中进行固定,比如设备信息、用户信息、cookie等都需要上报的数据,在上报前处理完成,需要异步获取且数据固定的,做好存储,防止每次都要重新获取;其他额外的数据,通过对外暴露的send
方法进行传递。
比如获取信息这块,客户端给到的jsapi,有可能只能异步调用,那么我们就可以这么处理:
function getAppInfo() {
let appInfo = {};
return ()=> {
if (appInfo.deviceId) {
return Promise.resolve(appInfo);
} else {
return new Promise((resolve, reject) => {
ABB.getAppInfo(info => {
if (info.deviceId) {
appInfo = info;
resolve(appInfo);
} else {
reject(new Error('get AppInfo error'));
}
})
})
}
}
}
const AppInfo = getAppInfo();
console.log( AppInfo() );
1. 各个路由的PV上报
各个路由的PV上报可以通过vue router的afterEach来实现,每次路由刷新时,afterEach方法都会执行,那么我们在这里进行PV的上报:
// 每个hash路由的PV上报
router.afterEach((to)=>{
// to为当前已打开的页面,to.name为在router/index.ts中设定的name
dataBoss.sendPV(to.name);
})
2. 用户点击行为的上报
用户点击行为的上报,之前是在每个点击的业务代码最后,进行一次点击上报。不过这样一个不好的地方是,必须为每个需要上报的点击元素添加一段业务代码,同时,如果多个点击行为共享某个业务片段时,需要进行点击区分:
methods: {
myClick(value, prarams, act) {
// ... 业务逻辑的处理
// 数据的上报
wzp.send({
act: act,
pageSource: 'MainPage'
})
}
}
现在,我们利用Vue中的自定义指令来实现点击行为的上报,上报的处理与业务代码进行分割:
// 自定义指令的官方文档: https://cn.vuejs.org/v2/guide/custom-directive.html
// 自定义boss指令
// bind: 只对该元素绑定一次
// el: 触发时的DOM元素
// binding.value: 传入的值
// 使用 v-boss="{page: 'MainPage', sop: 'donate'}"
Vue.directive('boss', {
//
bind: function (el: HTMLElement, binding: any) {
el.addEventListener('click', ()=>{
// 绑定click事件,触发后进行数据上报
Vue.prototype.$dataBoss.send(binding.value)
})
}
})
自定义v-boss指令后,我们就可以在元素上使用这个指令后:
<!-- 为用户头像添加点击数据上报 -->
<div class="avatar" v-boss="{pageName: 'MainPage', sop: 'sop_own_click'}" @click="linkTo">
<img :src="user.avatar" :alt="user.nickname">
</div>
3. 用户操作结果的数据上报
这里的数据上报是用户点击行为之后的结果上报,比如用户点击了分享按钮,那么最终他是真的分享成功了,还是中途又取消了。这种数据的上报,可以分析出用户从意图操作到最终实现的一个流失情况。
操作结果的数据上报,依赖于客户端或者接口给反馈的结果,这就需要在业务代码中实现了,定义一个全局变量$dataBoss
,通过这个来上报数据:
比如分享是否成功的监控:
// 发起分享
handleShare() {
share.show();
share.on('shareResult', res => {
this.$dataBoss.send({
sop: 'share_success'
});
})
}
根据接口中的数据进行上报:
handleUser() {
jsonp(url).then(result => {
this.$dataBoss.send({
kv: {
money: 20
}
});
})
}
总结
前端数据上报的维度很多,都是为了方便我们更加的了解用户、了解产品,方便以后的功能迭代。
本文地址: https://www.xiabingbao.com/post/vue/vue-boss-up.html
Vue单页面中进行业务数据的上报的更多相关文章
- vue单页面应用中动态修改title
https://www.jianshu.com/p/b980725b62e8 https://www.npmjs.com/package/vue-wechat-title 详细信息查看:vue-wea ...
- [one day one question] Vue单页面应用如何保证F5强刷不清空数据
问题描述: Vue单页面用按F5强刷,数据就恢复初始了,这怎么破? 解决方案: store.subscribe((mutation, state) => { sessionStorage.set ...
- 处理 Vue 单页面应用 SEO 的另一种思路
vue-meta-info 官方地址: monkeyWangs/vue-meta-info (设置vue 单页面meta info信息,如果需要单页面SEO,可以和 prerender-spa-plu ...
- vue单页面打包文件大?首次加载慢?按需加载?是你打开方式不对
部署各vue项目,走了一遍坑.... vue单页面应用刷新404 找到nginx多网站配置文件:类似nginx/sites-available/www.baidu.com server { liste ...
- [转] 2017-11-20 发布 另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新
目的:vue-cli构建的vue单页面应用,某些特定的页面,实现前进刷新,后退不刷新,类似app般的用户体验.注: 此处的刷新特指当进入此页面时,触发ajax请求,向服务器获取数据.不刷新特指当进入此 ...
- 另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新
目的:vue-cli构建的vue单页面应用,某些特定的页面,实现前进刷新,后退不刷新,类似app般的用户体验.注: 此处的刷新特指当进入此页面时,触发ajax请求,向服务器获取数据.不刷新特指当进入此 ...
- vue单页面引入CDN链接
不想在index.html文件中全局引入CDN资源,那么如何在Vue单文件组件中引入?下面来瞅瞅~ 虚拟DOM创建 Vue 通过创建一个虚拟 DOM 来追踪自己要改变的真实 DOM 什么是虚拟DOM? ...
- 处理 Vue 单页面 SEO 的另一种思路
vue-meta-info 官方地址: https://github.com/monkeyWang... (设置vue 单页面meta info信息,如果需要单页面SEO,可以和 prerender- ...
- Vue单页面骨架屏实践
github 地址: VV-UI/VV-UI 演示地址: vv-ui 文档地址:skeleton 关于骨架屏介绍 骨架屏的作用主要是在网络请求较慢时,提供基础占位,当数据加载完成,恢复数据展示.这样给 ...
随机推荐
- mysql ERROR 1264 (22003): Out of range value for column 'x' at row 1 错误
mysql> insert into t1 values (-129), (-128), (127),(128);ERROR 1264 (22003): Out of range value f ...
- redis实现自动输入完成(八)
1. 介绍 当我们在京东商城的搜索框,输入想要搜索的内容,比如你想要搜索"热水瓶",刚输入一个"热"字,就会出现一个下拉框,列出了很多以"热" ...
- javascript 中的 parameter vs arguments
像往常一样简单粗暴地看码: A parameter is the variable which is part of the method’s signature (method declaratio ...
- 《mysql必知必会》读书笔记--触发器及管理事务处理
触发器 触发器是MySQL响应DELETE,INSERT,UPDATE而自动执行的一条MySQL语句,其他语句不支持触发器. 创建触发器时,需要4个条件: 唯一的触发器名 触发器关联的表 触发器应该响 ...
- express+mongodb+mongoose增删改查
增加 修改 删除 数据库 这是一个前后端分离的项目前端项目地址:https://gitee.com/dingshao/express_qd.git后端项目地址:https://gitee.com/di ...
- hust1010 The Minimum Length
地址:http://acm.hust.edu.cn/problem/show/1010 题目: 1010 - The Minimum Length Time Limit: 1s Memory Limi ...
- 【android】 如何把gif图片下载到本地
以上图片大家可以看到,虽然是个jpg格式的文件,但是本质上是个动图. 但是发现在咱的图片模块下,本地存储的图片只有一帧,问题出在哪里呢? http获取到的byte[]数据是没问题的 断点跟踪了下,发现 ...
- zookeeper 监听事件 NodeCacheListener
zookeeper 监听事件 NodeCacheListener NodeCacheListener一次注册,每次监听,但是监听不到操作类型,不知道是增加?删除?还是修改? 1.测试类: packag ...
- oracle过程书写规范
ORACLE存储过程编码规范 1.1 变量规范 Ø 变量名全部采用小写,局部变量名使用“v_”开头,输入参数以“i_开头,输出参数以“o_”开头,输入输出参数用io_开头 ...
- Oracle trunc()函数,decode()函数,substr函数,GREATEST函数,java中substring函数的用法
--Oracle trunc()函数的用法/**************日期********************/1.select trunc(sysdate) from dual --2013- ...