Vue3中埋点指令封装详解

 更新时间:2023年08月01日 15:34:43   作者:乐嫣  
对于Vue项目来说,如果遇到一个埋点的需求,我们最好的解决方案就是封装一个指令,所以本文就来和大家详细讲讲具体是如何封装埋点指令的吧

前言

对于Vue项目来说,如果遇到一个埋点的需求,我们最好的解决方案就是封装一个指令,然后再有埋点需求的地方使用,接下来就来封装一个埋点指令吧。

代码实现

track.ts文件

import HttpAxios from '@/utils/axios'
​
//定义埋点请求
export function track(params) {
  return HttpAxios.post(
    'http://xxxxxx.xxxxx',
    params,
    {
      isCloseLoading: true
    }
  )
}
​
export default {
  install(Vue, options) {
    options = options || {}
    /**
     * 格式化绑定到dom上的数据
     * @param {*} binding
     */
    function formatBinding(binding) {
      let trackData = ''
      let eventMode = 'click'
      if (typeof binding.value === 'object') {
        if ('event' in binding.value) {
          eventMode = binding.value.event
        }
        if ('data' in binding.value) {
          trackData = binding.value.data
        } else {
          trackData = binding.value
        }
      } else {
        trackData = binding.value
      }
      return {
        eventMode,
        trackData
      }
    }
    // 初始化
    if ('init' in options && options.init instanceof Function) {
      try {
        options.init()
      } catch (error) {
        if (options.debug) {
          console.log(error)
        }
      }
    }
    Vue.directive('track', {
      mounted(el, binding) {
        const format = formatBinding(binding)
        el.trackData = format.trackData
        const params = {
          systemName: options.systemName,
          ...el.trackData //指令绑定的数据
        }
        el.addEventListener(format.eventMode, e => {
          try {
            if ('callback' in options && options.callback instanceof Function) {
              options.callback(params)
            } else {
              // 若未定义回调函数,则默认调用track方法
              track(params)
            }
            if (options.debug) {
              console.log(el.trackData)
            }
          } catch (error) {
            if (options.debug) {
              console.log(error)
            }
          }
        })
      },
      update(el, binding) {
        const format = formatBinding(binding)
        el.trackData = format.trackData
      }
    })
  }
}

main.ts文件

// 引入埋点
import VTrack from '@monorepo/shared/utils/track'
​
// 创建vue实例
const app = createApp(App)
​
// 1.挂载埋点,没有回调函数的方式
app.use(VTrack, { systemName: '基础平台', debug: false })
​
// 2.挂载埋点,回调函数的方式
app.use(VTrack, {
  callback(data, e) {
    //可以自定义埋点请求
    console.log(data, e);
  },
  systemName: '基础平台',
  debug: false,
});

使用:

<template>
  <button v-track="{ menuName: '按钮' }">DEBUG</button>
</template>

关于指令项目规范化

src目录下,创建directives文件夹存放该项目所需的指令,如图所示:

index.ts文件统一注册指令:

import type { App } from 'vue'
import { hasRole } from './permission/hasRole'
import { hasPermi } from './permission/hasPermi'
​
/**
 * 导出指令:v-xxx
 * @methods hasRole 用户权限,用法: v-hasRole
 * @methods hasPermi 按钮权限,用法: v-hasPermi
 */
export const setupAuth = (app: App<Element>) => {
  hasRole(app)
  hasPermi(app)
}

main.ts文件

// 指令
import * as directives from '@/directives'
​
// 创建vue实例
const app = createApp(App)
​
// 注册指令
for (const key in directives) {
  directives[key](app)
}

以上就是Vue3中埋点指令封装详解的详细内容,更多关于Vue3埋点指令封装的资料请关注脚本之家其它相关文章!

相关文章

  • Vue自定义指令详细

    Vue自定义指令详细

    这篇文章主要介绍了Vue自定义指令,文章从背景开始详细介绍Vue自定义指令的详细内容,随着Vue自定义指令的相关资料展开具体内容,需要的朋友可以参考一下
    2021-11-11
  • 关于移动端与大屏幕自适应适配方案

    关于移动端与大屏幕自适应适配方案

    这篇文章主要介绍了关于移动端与大屏幕自适应适配方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Vue3使用el-table组件实现分页、多选以及回显功能

    Vue3使用el-table组件实现分页、多选以及回显功能

    这篇文章主要介绍了Vue3使用el-table组件实现分页、多选以及回显功能,文中通过代码示例介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-09-09
  • 用v-html解决Vue.js渲染中html标签不被解析的问题

    用v-html解决Vue.js渲染中html标签不被解析的问题

    这篇文章主要给大家介绍了如何利用v-html解决Vue.js渲染过程中html标签不能被解析,html标签显示为字符串的问题,文中通过图文介绍的很详细,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • vue3动态添加路由

    vue3动态添加路由

    这篇文章主要介绍了vue3动态添加路由,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • Vue项目通过node连接MySQL数据库并实现增删改查操作的过程详解

    Vue项目通过node连接MySQL数据库并实现增删改查操作的过程详解

    最近在研究vue项目中使用node.js搭建server服务器,链接本地mysql数据库,进行数据操作,下面这篇文章主要给大家介绍了关于Vue项目通过node连接MySQL数据库并实现增删改查操作的相关资料,需要的朋友可以参考下
    2022-05-05
  • 如何将百度地图包装成Vue的组件的方法步骤

    如何将百度地图包装成Vue的组件的方法步骤

    这篇文章主要介绍了如何将百度地图包装成Vue的组件的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • Vue3中watch监听的五种情况详解

    Vue3中watch监听的五种情况详解

    watch函数用于侦听某个值的变化,当该值发生改变后,触发对应的处理逻辑,本文将给大家介绍了Vue3中watch监听的五种情况,文中通过代码示例讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-03-03
  • vue3中项目优化方法详解(Web Worker的使用)

    vue3中项目优化方法详解(Web Worker的使用)

    最近在做vue3的项目中,遇到了计算量庞大导致页面响应缓慢的问题,所以下面这篇文章主要给大家介绍了关于vue3中项目优化方法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • Vue登录后添加动态路由并跳转的实践分享

    Vue登录后添加动态路由并跳转的实践分享

    这篇文章讲给大家详细介绍一下Vue如何实现登录后添加动态路由并跳转,文章通过代码示例介绍的非常详细,对我们的学习或工作有一定的的帮助,需要的朋友可以参考下
    2023-07-07

最新评论