React 高阶组件实现埋点

news2024/9/8 23:28:20

React 高阶组件实现埋点

功能需求:

老板希望可以看到,我们做的系统的访问量,以及各个功能模块的被点击次数。

相关技术:

高阶组件和普通组件的区别:

定义和用途

  1. 普通组件
    • 定义:普通组件可以是函数组件或类组件,用于定义UI结构和交互逻辑。
    • 用途:主要用于渲染UI,展示数据和处理用户交互。
  2. 高阶组件(HOC)
    • 定义:高阶组件是一个函数,接受一个组件并返回一个新的组件。
    • 用途:用于复用组件逻辑,将公共的功能封装起来,可以增强或修改传入组件的行为。

代码示例

  1. 普通组件
jsx复制代码// 函数组件
const MyComponent = (props) => {
  return <div>Hello, {props.name}!</div>;
};

// 类组件
class MyComponent extends React.Component {
  render() {
    return <div>Hello, {this.props.name}!</div>;
  }
}
  1. 高阶组件(HOC)
jsx复制代码// 高阶组件
const withExtraProps = (WrappedComponent) => {
  return (props) => {
    return <WrappedComponent {...props} extraProp="I am an extra prop!" />;
  };
};

// 使用高阶组件增强普通组件
const EnhancedComponent = withExtraProps(MyComponent);

// 渲染EnhancedComponent将会渲染MyComponent并传入额外的属性
<EnhancedComponent name="World" />;

使用方式

  • 普通组件:直接定义并使用,可以在任何地方直接渲染。
  • 高阶组件:通过传入一个组件并返回一个新的组件来使用,通常用于为现有组件添加功能。

抽象级别

  • 普通组件:关注具体的UI和交互。
  • 高阶组件:关注逻辑复用和功能增强,通常不会直接定义UI。

渲染

  • 普通组件:直接渲染UI。
  • 高阶组件:返回一个包裹了原组件的新组件,并在新组件中添加逻辑。

为什么要用高阶组件

  1. 逻辑复用:可以将公共逻辑抽取出来,避免在多个组件中重复代码。
  2. 解耦:将特定功能与组件的核心逻辑分离,使代码更清晰、更易维护。
  3. 增强组件:可以在不修改原组件的情况下,增强其功能。

实现埋点功能

实现的核心代码逻辑如下所示:

_addEventDot函数主要实现的是打点的逻辑。这个逻辑也不复杂,就是获取相关的事件名称和用户信息,传给后端即可。

再看下面代码,可以看到里面的内容实现了两次return:

  1. WithInnerPlayer组件return 出来的<WrappedComponent/>
  2. WithTracking组件return出来的WithInnerPlayer

让我们来具体解释一下这两层 return 的作用:

  1. 内部组件 (WithInnerPlayer):
    • 这个内部组件是被 WithTracking HOC 创建的新组件,它接收原始组件 (WrappedComponent) 的所有属性,并添加了一些额外的功能(在这个例子中是追踪功能)。
    • WithInnerPlayer 组件的主要职责是接受来自外部的属性 (props),并将其与新添加的功能一起传递给 WrappedComponent
  2. 外部 HOC (WithTracking):
    • 这个 HOC 是一个工厂函数,它接收一个组件 (WrappedComponent) 并返回一个新的组件 (WithInnerPlayer)。
    • WithTracking 被调用时,它会创建并返回 WithInnerPlayer,这个内部组件已经包含了追踪功能。
import React from 'react';
import { v4 as uuidv4 } from 'uuid';
import moment from 'moment/moment';

import { addEventDot } from '@/services/api';
import { _getPhoneModel } from '@/utils/utils';
import CONFIG from 'GlobalConfigFile';


const DEFAULT_SERVER = process.env.DEFAULT_SERVER || CONFIG.Server;

const WithTracking = (WrappedComponent) => {
  const WithInnerPlayer = ({ ...props }) => {
    const { name } = WrappedComponent;
    const ua = _getPhoneModel();

    const _addEventDot = (params) => {
      const uuid = uuidv4();
      const trackingParams = {
        id: uuid,
        source: 'browser',
        occurOn: moment().unix() * 1000,
        project: 'EAP',
        env: DEFAULT_SERVER,
        deviceId: ua,
        ...params,
        name: params?.name || name,
      };
      addEventDot(trackingParams)
    };

    return <WrappedComponent handleAddEventDotClick={_addEventDot} {...props} />;
  };

  return WithInnerPlayer;
};

export default WithTracking;

如果只返回一层组件WithInnerPlayer会怎么样?

这种做法并不符合 HOC 的常规使用方式。在标准的 HOC 设计模式中,您希望返回一个增强过的组件,该组件保留了原始组件的所有特性,同时还添加了新的功能。

使用高阶组件

import MyComponent from './MyComponent';
import WithTracking from './WithTracking';

const TrackedMyComponent = WithTracking(MyComponent);

// 在其他组件中使用 TrackedMyComponent
function App() {
  return <TrackedMyComponent />;
}

或者如果有自定义的打点参数要传的话:

import WithTracking from './WithTracking';

function TrackedMyComponent(props) {
	const { handleAddEventDotClick } = props;
	
	...
	handleAddEventDotClick({
        name: 'visit:consult/appointment',
        props: {
          eventName: '咨询:访问预约(客服)'
        }
      });
     ...
}

export default WithTracking(TrackedMyComponent);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1957781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实验2-4-1 求1到N的和*--sum记得累加啊!

//实验2-4-1 求1到N的和//计算序列 1 2 3 ... 的前N项之和。#include<stdio.h> #include<math.h> int main(){int N,sum0;scanf("%d",&N);for(int a1;a<N;a){ suma;//sum进行累加&#xff01;&#xff01;&#xff01;&#xff01;&#xff01…

VS2019编译和使用gtest测试(C++)

目录 一、首先下载gtest开源 二、使用gtest 一、首先下载gtest开源 https://pan.baidu.com/s/15m62KAJ29vNe1mrmAcmehA 提取码&#xff1a;vfxz 下载下来解压到文件夹&#xff0c;再在文件夹里面新建一个build文件夹&#xff0c;如下&#xff1a; 再安装cmake&#xff0c;…

Cocos Creator2D游戏开发(6)-飞机大战(4)-敌机产生

敌机产生&玩家发射子弹 敌机产生: 创建一个空节点 创建一个敌机预制体 把敌机图片拖入预制体内 使用代码生成敌机 让敌机动起来 创建一个预制体enemy_prefab双击预制体enemy_prefab,然后拖入一个敌机图片,设置好方向和尺寸,一定要记得保存然后关闭(场景编辑器里面的保存)…

【前端 18】安装Node.js

Node.js 安装指南 在今天的博客中&#xff0c;我们将一起探讨如何在您的计算机上安装Node.js。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它允许你在服务器端运行 JavaScript 代码。无论您是前端开发者希望探索全栈开发&#xff0c;还是后端开发者寻…

【ROS 最简单教程 002/300】ROS 环境安装 (虚拟机版): Noetic

&#x1f497; 有遇到安装问题可以留言呀 ~ 当时踩了挺多坑&#xff0c;能帮忙解决的我会尽力 &#xff01; 1. 安装操作系统环境 Linux ❄️ VM / VirtualBox Ubuntu20.04 &#x1f449; 保姆级图文安装教程指路&#xff0c;有经验的话 可以用如下资源自行安装 ITEMREFERENCE…

Excel模拟计算演示-以矩阵乘计算密度为例

Excel模拟计算演示-以矩阵乘计算密度为例 1.参考链接2.CUDA_Occupancy_Calculator截图3.矩阵乘计算密度模拟计算的操作步骤及效果 安装好CUDA之后,/usr/local/cuda-12.1/tools/CUDA_Occupancy_Calculator.xls里会看到"TABLE(,B17)"这样的表达式,原来是模拟计算的结果…

Stable Diffusion 提示词攻略

一、提示词作用 提示词所做的工作是缩小模型出图的解空间&#xff0c;即缩小生成内容时在模型数据里的检索范围&#xff0c;而非直接指 定作画结果。 提示词的效果也受模型的影响&#xff0c;有些模型对自然语言做特化训练&#xff0c;有些模型对单词标签对做特化训练&#xf…

Lumos学习王佩丰Excel第八讲:IF函数逻辑判断

本节课与数学无关&#xff0c;与逻辑强相关。这节课对理工科&#xff0c;尤其是对有计算机基础的同学们会很友好。 一、使用IF函数 1、IF函数的基本用法 函数语法&#xff1a;IF(logical_test,[value_if_true],[value_if_false]) logical_test&#xff1a;判断条件 [value…

现在有什么赛道可以干到退休?

最近&#xff0c;一则“90后无论男女都得65岁以后退休”的消息在多个网络平台流传&#xff0c;也不知道是真是假&#xff0c;好巧不巧今天刷热点的时候又看到一条这样的热点&#xff1a;现在有什么赛道可以干到退休&#xff1f; 点进去看了几条热评&#xff0c;第一条热评说的…

品牌控价:维护市场秩序的关键策略

在当今竞争激烈的市场环境中&#xff0c;品牌控价成为了品牌发展的重要环节。品牌在拓展销售渠道时&#xff0c;为确保自身的形象与利益&#xff0c;通常会为经销商设定出货价和建议零售价。然而&#xff0c;部分经销商为追求短期利益&#xff0c;在电商平台上进行低价引流&…

Ollama怎么启动.gguf 大模型

环境&#xff1a; Llama3-8B 问题描述&#xff1a; Ollama怎么启动.gguf 大模型 解决方案&#xff1a; 要使用 Ollama 启动 .gguf 大模型&#xff0c;你可以按照以下步骤操作&#xff1a; 创建 Modelfile&#xff1a;首先&#xff0c;创建一个名为 Modelfile 的文件&…

【C++BFS算法】886. 可能的二分法

本文涉及的点 CBFS算法 LeetCod886. 可能的二分法 给定一组 n 人&#xff08;编号为 1, 2, …, n&#xff09;&#xff0c; 我们想把每个人分进任意大小的两组。每个人都可能不喜欢其他人&#xff0c;那么他们不应该属于同一组。 给定整数 n 和数组 dislikes &#xff0c;其…

高效工作流:用Mermaid绘制你的专属流程图;如何在Vue3中导入mermaid绘制流程图

目录 高效工作流&#xff1a;用Mermaid绘制你的专属流程图 一、流程图的使用场景 1.1、流程图flowChart 1.2、使用场景 二、如何使用mermaid画出优雅的流程图 2.1、流程图添加图名 2.2、定义图类型与方向 2.3、节点形状定义 2.3.1、规定语法 2.3.2、不同节点案例 2.…

【C语言】整数类型及其数值范围(截断+数据)

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html ⚙️操作环境:Visual Studio 2022 目录 一、介绍 二、整数类型表 1.分析 2.小结 三、截断 1.什么是截断&#xff1f; 2.为什么需要截断…

【刷题汇总 -- 笨小猴、 主持人调度(一)、分割等和子集】

C日常刷题积累 今日刷题汇总 - day0251、笨小猴1.1、题目1.2、思路1.3、程序实现 2、主持人调度&#xff08;一&#xff09;2.1、题目2.2、思路2.3、程序实现 3、分割等和子集3.1、题目3.2、思路3.3、程序实现 -- 0/1背包问题 4、题目链接 今日刷题汇总 - day025 1、笨小猴 1…

JAW:一款针对客户端JavaScript的图形化安全分析框架

关于JAW JAW是一款针对客户端JavaScript的图形化安全分析框架&#xff0c;该工具基于esprima解析器和EsTree SpiderMonkey Spec实现其功能&#xff0c;广大研究人员可以使用该工具分析Web应用程序和基于JavaScript的客户端程序的安全性。 工具特性 1、动态可扩展的框架&#x…

设计模式7原则

链接&#xff1a;设计模式7原则 (qq.com) 设计模式7原则JAVA代码实现 (qq.com)

2024年7月29日(web nginx)

web 一、web基本概念和常识 Web:为用户提供的一种在互联网上浏览信息的服务,Web服务是动态的、可交互的、跨平台的和图形化的。 Web 服务为用户提供各种互联网服务,这些服务包括信息浏览服务,以及各种交互式服务,包括聊天、购物、学习等等内容。 Web 应用开发也经过了几代技术…

Linux基础复习(五)

前言 本文介绍了Linux常用命令&#xff0c;接Linux基础复习&#xff08;四&#xff09; 一、常用命令 命令通配符 在Linux中&#xff0c;命令通配符&#xff08;也称为通配符模式或通配符表达式&#xff09;是用来匹配文件名或其他字符串的一种特殊字符。这些通配符可以帮助…