首页 > 编程语言 >Trigger源码分析 -- ant-design-vue系列

Trigger源码分析 -- ant-design-vue系列

时间:2024-09-10 18:25:07浏览次数:3  
标签:vue return -- 源码 && props 组件 const event

Trigger源码分析 – ant-design-vue系列

1 概述

源码地址: https://github.com/vueComponent/ant-design-vue/blob/main/components/vc-trigger/Trigger.tsx

在源码的实现中,Trigger组件主要有两个作用:

  1. 使用Portal组件,把Popup组件传送到指定的dom下,默认是body
  2. target节点绑定事件,控制事件的触发逻辑。

2 极简实现

为了实现以上功能,我们可以和源码一样,使用vue3提供的Teleport组件,来实现节点的传送;同时把所有事件进行透传即可。

在这里trigger就是我们原先的target节点,可以翻译成切换器。

setup(props, { slots }) {
		const align: any = computed(() => {
			const { placement } = props;

			return placements[placement];
		});

		const getComponent = () => {
			return (
				<Popup
					style={{ position: 'absolute' }}
					target={() => triggerRef.value!}
					align={align.value}
					visible={props.visible}
				>
					{slots.popup?.()}
				</Popup>
			);
		};

		const triggerRef = ref<HTMLElement>();

		return () => {
      // 1 Popup 部分
			const portal = <Portal>{getComponent()}</Portal>;
      // 2 target部分                    
			const trigger = (
				<div style={{ display: 'inline-block' }} ref={triggerRef}>
					{slots.default?.()}
				</div>
			);

			return (
				<>
					{portal}
					{trigger}
				</>
			);
		};
	}

3 源码分析

3.1 整体结构

在这里插入图片描述

这个组件比较特殊,使用了选项式的写法。

export default defineComponent({
  name: 'Trigger',
  mixins: [BaseMixin],
  inheritAttrs: false, // 用于控制组件的根元素是否应该继承父作用域中的属性(attribute)和事件监听器(listener)。
  porps: {},
  setup() {}, // 使用props提供的响应式变量,这里是 定位&portal 相关的;并且声明了一些初始值
  data() (), // 处理visible变量,为this挂载所有事件,尝试让PopupRef变量指向Portal
  watch: (), // 监听visible的变化
  created() {}, // 依赖注入,提供vcTriggerContext和PortalContextKey上下文
  deactivated() {}, // 组件失活时,关闭popup弹窗
  mounted() {}, // 调用updatedCal(),这个函数的作用是在visible为true的时候,注册点击/滚动/失焦的相关事件,以便于在点击popup外部/页面滚动/窗口失焦的时候关闭弹窗;在visible为false时,移除事件监听。
  updated() {}, // 组件属性更新后调用updatedCal(),重新注册。
  beforeUnmount() {}, // 卸载前清除所有监听器
  methods: {}, // 事件的执行、事件是否绑定、获取组件的方法等
  render() {} // 渲染trigger和portal
})

3.2 render函数

const child = children[0];来看,代码默认使用第一个子节点,所以调用的时候最好只传入一个子节点。

render() {
    const { $attrs } = this;
    const children = filterEmpty(getSlot(this));
    const { alignPoint } = this.$props;

    const child = children[0];
    this.childOriginEvents = getEvents(child);
    const newChildProps: any = {
      key: 'trigger',
    };
		
  	/**
  	* 这里有各种事件,其他删除,以click为例
  	*/
    if (this.isClickToHide() || this.isClickToShow()) {
      newChildProps.onClick = this.onClick;
      newChildProps.onMousedown = this.onMousedown;
      newChildProps[supportsPassive ? 'onTouchstartPassive' : 'onTouchstart'] = this.onTouchstart;
    } else {
      newChildProps.onClick = this.createTwoChains('onClick');
      newChildProps.onMousedown = this.createTwoChains('onMousedown');
      newChildProps[supportsPassive ? 'onTouchstartPassive' : 'onTouchstart'] =
        this.createTwoChains('onTouchstart');
    }

  	/**
  	* 这个函数内部是vue3提供的cloneVNode实现的
  	*/
    const trigger = cloneElement(child, { ...newChildProps, ref: 'triggerRef' }, true, true);
    if (this.popPortal) {
      return trigger;
    } else {
      const portal = (
        <Portal
          key="portal"
          v-slots={{ default: this.getComponent }}
          getContainer={this.getContainer}
          didUpdate={this.handlePortalUpdate}
        ></Portal>
      );
      return (
        <>
          {portal}
          {trigger}
        </>
      );
    }
  },
  1. 找到Trigger组件包裹的所有非空子节点,取出第一个子节点child,把child上注册的事件收集起来,挂到childOriginEvents属性上。

    标签:vue,return,--,源码,&&,props,组件,const,event
    From: https://blog.csdn.net/weixin_44438233/article/details/142105911

相关文章

  • Docker介绍及其在WSL中的应用
    Docker介绍及其在WSL中的应用 New_Teen  ·  2023-06-0121:50:20发布https://devpress.csdn.net/cloudnative/66d581dd0bfad230b8b389ba.html?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTg2OTk4NSwiZXhwIjoxNzI2NTY4MDY3LCJpYXQiOjE3MjU5NjMyNjcsInV......
  • 房屋租赁系统开发:Spring Boot 技术应用
    第2章技术介绍2.1相关技术房屋租赁系统是在JSP+MySQL开发环境的基础上开发的。JSP是一种服务器端脚本语言,易于学习,实用且面向用户。全球超过35%的JSP驱动的互联网站点使用JSP。MySQL是一个数据库管理系统,因为它的体积小但速度快,成本低,或者开源受到中小型网站的青睐。因......
  • 一、记录最近网安面试题
    前言大家好,我是一名大四学生,最近正在找实习,我整理一些面试遇到的问题。以下的解答是我经过网络整理得出的,如果有不对或者缺少的地方欢迎大家指出。一、CDN绕过的方法方法1:查询历史DNS记录1)查看IP与域名绑定的历史记录,可能会存在使用CDN前的记录,相关查询网站有:https://......
  • Rocky9
    RockyLinux9.4部署Zabbix7.01-1.检测源wgethttps://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm#下载epel的源rpm-ivhepel-release-latest-8.noarch.rpm#epel安装rpm-Uvhhttps://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-7......
  • 如何将Go项目制作为docker镜像
    在Go项目中,将应用打包成Docker镜像是一种常见的做法,这有助于应用的部署和环境的一致性。下面,我将分步骤介绍如何创建一个Dockerfile来打包Go应用,并简要介绍如何使用goctl工具(尽管goctl主要用于生成Go的RPC代码,而不是直接用于Docker镜像的构建)。1.编写DockerfileDockerfile是构......
  • 重头开始嵌入式第三十七天(数据结构 链表)
    单向链表单向链表是一种常见的数据结构。一、结构组成-节点:单向链表由多个节点组成。每个节点包含两个部分,一个是存储数据的部分,可以存储各种类型的数据,如整数、字符、结构体等;另一个是指向下一个节点的指针,用于连接链表中的各个节点。-头指针:链表有一个特殊的指针称为头......
  • jsp超市Pos收银管理系统1y6h3
    jsp超市Pos收银管理系统1y6h3本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能员工,供应商信息,商品分类,商品信息,商品入库,商品出库,商品采购,商品退货技术要求:   开发语言:JSP前端使用:HTML......
  • jsp畅行旅游网站的设计与实现690v7
    jsp畅行旅游网站的设计与实现69本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能用户,景点类型,景点信息开题报告内容一、项目背景与意义随着互联网技术的不断进步,人们的旅游方式发生了深刻变革。......
  • jsp尝相聚网上订餐系统w7h4g
    jsp尝相聚网上订餐系统w7h4g本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能开题报告内容一、项目背景与意义随着互联网技术的飞速发展,电子商务已成为人们日常生活中不可或缺的一部分,特别是在餐饮......
  • 第5讲:Halcon 测量点线距离
    一、概述    点线距离测量在3D测量项目中处于基础地位,必须要掌握。以下为可直接运行的代码。二、效果        三、Halcon代码*初始化窗口dev_update_off()dev_close_window()dev_open_window(0,0,768,512,'black',WindowHandle)*给点的大小......