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

ops/2024/12/22 9:17:42/

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

1 极简代码

直接返回两个组件:Mask PopupInner,后者在上一篇已经分析过了。下面我们先看一下 Mask的源码。

javascript">setup(props, { slots }) {return () => {if (!props.visible) return null;return (<div class="v-popup">{/* <Mask visible /> */}<PopupInner target={props.target} align={props.align} visible>{slots.default?.()}</PopupInner></div>);};
}

2 Mask源码

这是一个函数式组件,处理过程比较简单,只是调用getMotion获取了动画类名,给到Transition组件使用。

但是由于mask变量在Trigger中的默认值是false,在Popup中也没有单独处理,所以在这里,mask === false,也就是说dropdown没有Mask蒙层。所以在极简代码中也是注释掉的。

javascript">export default function Mask(props: MaskProps) {const { prefixCls, visible, zIndex, mask, maskAnimation, maskTransitionName } = props;// 这里的mask是falseif (!mask) {return null;}let motion = {};if (maskTransitionName || maskAnimation) {motion = getMotion({prefixCls,transitionName: maskTransitionName,animation: maskAnimation,});}return (<Transition appear {...motion}><div v-if={visible} style={{ zIndex }} class={`${prefixCls}-mask`} /></Transition>);
}
  • 我们可以找到modal的蒙层,看一下蒙层的css是如何实现的。

绝对定位 + 层级 + 高度 + 背景色

.ant-modal-mask {position: fixed;top: 0;right: 0;bottom: 0;left: 0;z-index: 1000;height: 100%;background-color: rgba(0, 0, 0, 0.45);
}

3 Popup源码

我们把有关mobile的判断去掉,剩下的就是下面的代码。可以看到,因为Mask组件是null,所以几乎就是直接渲染了PopupInner组件。

需要注意的是,这里重新声明了innerVisible,并且监听props.visible时使用了 flush: 'post'。这些都是为了让动画延迟执行。涉及到动画的地方都是这样处理的。

javascript">setup(props, { attrs, slots, expose }) {const innerVisible = ref(false);const popupRef = ref();watch(() => props.visible,() => {innerVisible.value = props.visible;},{ immediate: true, flush: 'post' },);expose({forceAlign: () => {popupRef.value?.forceAlign();},getElement: () => {return popupRef.value?.getElement();},});return () => {const cloneProps = { ...props, ...attrs, visible: innerVisible.value };return (<div><Mask {...cloneProps} /><PopupInner {...cloneProps} ref={popupRef} v-slots={{ default: slots.default }} /></div>);};},

4 总结

Popup组件到这里就结束了,再来看一下这个整理结构。可以看到:

在这里插入图片描述

  1. Popup作用主要是整合MaskPopupInner
  2. PopupInner主要是定义了动画。
  3. Align作用是执行targetsource的对齐操作。

http://www.ppmy.cn/ops/108950.html

相关文章

【鼠鼠学AI代码合集#5】线性代数

在前面的例子中&#xff0c;我们已经讨论了标量的概念&#xff0c;并展示了如何使用代码对标量进行基本的算术运算。接下来&#xff0c;我将进一步说明该过程&#xff0c;并解释每一步的实现。 标量&#xff08;Scalar&#xff09;的基本操作 标量是只有一个元素的数值。它可…

算法工程师重生之第三天( 链表理论基础 移除链表元素 设计链表 反转链表 )

参考文献 代码随想录 一、 链表理论基础 什么是链表&#xff0c;链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个节点的指针域指向nu…

SQL进阶技巧:如何利用SQL解决趣味赛马问题?| 非等值关联匹配问题

目录 0 问题描述 1 数据准备 2 问题分析 方法一:先分后合思想 方法2:非等值关联匹配 3 小结 0 问题描述 有一张赛马记录表,如下所示: create table RacingResults ( trace_id char(3) not null,race_date date not null, race_nbr int not null,win_name char(30) n…

Codeforces Round 969 (Div. 2)

文章目录 A. Doras Set题意&#xff1a;思路&#xff1a;代码 B. Index and Maximum Value题意&#xff1a;思路&#xff1a;代码&#xff1a; C. Dora and C题意&#xff1a;思路&#xff1a;代码&#xff1a; 题目链接 A. Dora’s Set 题意&#xff1a; 给你一个区间&#…

docker 构建最小镜像 - 2MB 不到

文章目录 1.编译 code2.编写 Dockerfile3.构建镜像4.运行起来5.总结 1.编译 code rootjn:/home/jn/Desktop/Docker# cat hello.go package mainimport ("fmt""time" )func main() {for {fmt.Println("hello~")time.Sleep(time.Second)} } rootj…

K8s中如何使用etcd进行集群信息的备份与恢复

这里写目录标题 ETCD是什么?1. **`etcd`(服务)**2. **`etcdctl`(客户端工具)**如何安装etcdctl(客户端工具)查看目前K8s自带etcd中的版本信息安装对应版本的etcdutl工具下载 `etcdutl` 3.5.7 版本配置环境变量创建备份文件验证一下备份的快照文件备份文件恢复的效果演示…

一些可能很有用的矩阵知识

一些可有可无的矩阵知识 酉矩阵 酉矩阵 一个服从正态分布的向量乘以一个酉矩阵&#xff0c;得到的向量仍然服从正态分布 酉矩阵是一个复数矩阵&#xff0c;满足其转置的共轭等于其逆矩阵。当一个向量通过一个酉矩阵进行线性变换时&#xff0c;它的模长保持不变&#xff0c;只是…

uniapp微信小程序开发踩坑日记:Pinia持久化报错Cannot read property ‘localStorage‘ of undefined

插件默认使用 localStorage 实现持久化&#xff0c;小程序端不兼容&#xff0c;需要替换持久化 API import { defineStore } from pinia export const useCommonStore defineStore(pack-store, {state: (): State > ({wwInfo: {},globalData: {},timerLock: false, //是…