如何在Vue单页面中进行业务数据的上报
作者:蚊子博客 发布时间:2024-04-26 17:42:13
标签:vue,业务数据
概述
业务数据的上报主要分为:
各个路由的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.cnblogs.com/xumengxuan/p/10682338.html


猜你喜欢
- 问题你想使用一个简单的REST接口通过网络远程控制或访问你的应用程序,但是你又不想自己去安装一个完整的web框架。解决方案构建一个REST风
- 如何制作一个WAP手机的WML网页?代码如下:<%@Language=VBScriptMaxNoAds = 10'
- Golang标准库binarybinary包实现了数字和字节序列之间的简单转换。1、ByteOrderByteOrder指定了如何将一个字节
- Go语言内置int转string至少有3种方式:fmt.Sprintf("%d",n)strconv.Itoa(n)st
- <script language="JavaScript"> //得到字符总数function getCha
- 在python中使用socket进行linux服务器与win10主机间的图像传输,供大家参考,具体内容如下前提:服务器与主机需要在同一局域网
- Pandas是一个用于数据分析和操作的Python库。在pandas中几乎所有的操作都围绕着DataFrame。Dataframe是一个二维
- 本文实例讲述了Python实现随机生成手机号及正则验证手机号的方法。分享给大家供大家参考,具体如下:依据根据2017年10月份最新的手机号正
- DesktopNexus 是我最喜爱的一个壁纸下载网站,上面有许多高质量的壁纸,几乎每天必上, 每月也必会坚持分享我这个月来收集的壁纸但是
- 本文实例分析了php中ob_flush函数和flush函数用法。分享给大家供大家参考。具体如下:ob_flush()函数: 取出PHP bu
- 案例:如果我们起了一个协程,但这个协程出现了panic,但我们没有捕获这个协程,就会造成程序的崩溃,这时可以在goroutine中使用rec
- PyQt的文本操作的继承关系:QTextBrowser ( QtGui.QTextEdit)其中QTextEdit具有的功能函数:copy(
- 如下所示:<strong><span style="font-size:14px;">文本过滤&
- 阅读目录tcp协议:流式协议(以数据流的形式通信传输)、安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信)tcp协议在O
- 1.唯一性以下方法可以检查给定列表是否有重复的地方,可用set()的属性将其从列表中删除。x = [1,1,2,2,3,2,3,4,5,6]
- 本文实例总结了PHP图像处理技术。分享给大家供大家参考,具体如下:1、绘图场景: 验证码、图像水印、图像压缩处理php绘图坐标体系是从0,0
- 目录前言通过错误日志记录利用 channel 传输使用 sync/errgroup总结前言在 Go 语言程序开发中,goroutine 的使
- 绘制一个线框图是你在制作一个网站前必须要经历的过程。线框图能够帮助你合理的组织并简化你内容和元素,是网站内容布局的基本视觉表现方式,是网站开
- 函数代码function is_valid_filename($name) { $parts = preg_split(&quo
- 在python中,元组不可变,只能查询不能修改,列表、字典和集合的基本操作,各不相同,下面就来比较一下它们的添加和删除操作吧。添加一、列表1