Antd Vue3 使用 Anchor 锚点组件记录

项目场景

客户要求做一个表单页面,表单数据分为三步,每一步骤是一个单独的 Vue 组件,表单上方需要使用锚点组件实现锚点定位到每一步的功能。

代码总览
<template><div class="guided-form-content-wrapper"><!-- Anchor 锚点 --><a-anchor :affix="false" :target-offset="16" :get-container="getContainer" @click="handleClickAnchor"><a-anchor-link v-for="(item, $index) in steps" :key="$index" :href="'#' + item.id" :title="item.title" /></a-anchor><a-form ref="formRef" :model="form"  v-bind="layout" class="form-wrapper"><DemoFormStep1 :id="steps[0].id" /><DemoFormStep2 :id="steps[1].id" /><DemoFormStep3 :id="steps[2].id" /></a-form></div>
</template>
<script lang="ts" setup>
import DemoFormStep1 from './DemoFormStep1.vue';
import DemoFormStep2 from './DemoFormStep2.vue';
import DemoFormStep3 from './DemoFormStep3.vue';const form = ref<FormDataDto>({});
const layout = {labelCol: { flex: '0 0 140px' },wrapperCol: { flex: '1 1 0' }
};
const steps = [{ id: 'step1', title: '步骤一', description: '第一步描述' },{ id: 'step2', title: '步骤二', description: '第二步描述' },{ id: 'step3', title: '步骤三', description: '第三步描述' }
];/** Anchor 锚点指定滚动的容器 */
function getContainer() {// 给组件指定渲染的容器,解决锚点不会随页面滚动而移动的问题return document.querySelector('.form-wrapper');
}
/** Anchor 锚点形式点击锚点 */
function handleClickAnchor(e, link) {// 阻止点击的默认事件修改路由e.preventDefault();if (link.href) {const element = document.querySelector(link.href);element && element.scrollIntoView({ block: 'start', behavior: 'smooth', alignToTop: 'false' });}
}
</script>
<style lang="less" scoped>
.guided-form-content-wrapper {height: 100%;display: flex;flex-direction: column;:deep(.ant-anchor) {display: flex;}.form-wrapper {flex: 1 0 0;overflow: auto;padding: 16px;background-color: #f0f2f5;}
}
</style>
踩坑点

1. 锚点组件水平展示

Anchor 组件默认锚点 title 垂直显示,通过写 CSS 样式的方式使锚点 title 水平展示。

2. 设置锚点

首先使用 Anchor 组件设置锚点。

<a-anchor :affix="false" :target-offset="16" :get-container="getContainer" @click="handleClickAnchor"><a-anchor-link v-for="(item, $index) in steps" :key="$index" :href="'#' + item.id" :title="item.title" />
</a-anchor>

href 为锚点链接,'#' + item.id 表示锚点链接对应的是 id 为 item.id 的元素,例如:#step1 表示 id 为 step1 的 DOM 元素。

其次,跳转的位置要有一个id,注意点是 这个 id 和上一步设置的 # 号后面的内容是一致的。

注意,# 号后面不能为纯数字,否则无法正常定位,浏览器报错。

3. 点击锚点 title 页面路由发生变化。

由于使用 href 设置了锚点链接,点击锚点的时候页面 url 发生了变化。这是由于 Anchor 组件的点击默认事件会修改路由。

为了防止这种现象的发生,需要在点击锚点 title 时阻止路由跳转。因此这里定义 click 事件的 handler,阻止修改路由并通过 JavaScript 实现点击锚点 tilte 定位到相应的锚点。

/** Anchor 锚点形式点击锚点 */
function handleClickAnchor(e, link) {// 阻止点击的默认事件修改路由e.preventDefault();if (link.href) {const element = document.querySelector(link.href);element && element.scrollIntoView({ block: 'start', behavior: 'smooth', alignToTop: 'false' });}
}

4. 锚点 title 没有随着页面滚动高亮变化

Anchor 锚点组件的锚点 title 没办法随着页面滚动而高亮变化,但是点击 title 跳转具体锚定位置的功能却是没有问题的。经分析,Anchor 组件有一个 getContainer 属性,需要使用该属性来指定 Anchor 组件指定滚动的容器,默认情况下是window,但是在本业务场景下是与 Anchor 同级的表单组件进行滚动,所以通过 getContainer 属性来解决页面滚动时上方锚点 title 没有高亮的问题。

/** Anchor 锚点指定滚动的容器 */
function getContainer() {// 给组件指定渲染的容器,解决锚点不会随页面滚动而移动的问题return document.querySelector('.form-wrapper');
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯基础练习汇总详细解析(一)——数列排序、十六进制转八进制、十六进制转十进制、十进制转十六进制、特殊回文数(代码实现、解题思路、Python)

试题 基础练习 数列排序 资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 给定一个长度为n的数列&#xff0c;将这个数列按从小到大的顺序排列。1<n<200 输入格式 第…

【使用 PyQt6-第01章】 创建基本的应用程序

使用 PyQt6 创建您的第一个应用程序 目录 一、说明二、创建应用程序三、单步执行代码四、什么是事件循环&#xff1f;4.1 Qt 中的事件循环。 五、主窗口 QMainWindow六、调整窗口和小部件的大小 一、说明 本教程也适用于 PySide6 、 PySide2 和 PyQt5 在本教程中&#xff0c;…

新品发布|灵雀云重磅推出大模型 LLMOps 平台

自即日起&#xff0c;灵雀云正式推出大模型 LLMOps 平台 Alauda Machine Learning &#xff08;简称 AML&#xff09;&#xff0c;AML在整合传统 MLOps 解决方案的基础之上&#xff0c;为大模型/大语言模型场景提供更强大、更易用的功能。灵雀云意在将AML打造成全面覆盖传统 ML…

夏季水域安全管理,AI智能识别算法防溺水视频监控方案

随着夏季的到来&#xff0c;不少人为了一时的痛快凉爽就私自下水游泳&#xff0c;特别是在野外池塘&#xff0c;由于长期无人监管&#xff0c;极易发生人员溺亡事件&#xff0c;如何对池塘水域进行全天候无人值守智能监管&#xff0c;并实现发生人员闯入就立即告警&#xff1f;…

iOS UIFont-实现三方字体的下载和使用

UIFont 系列传送门 第一弹加载本地字体:iOS UIFont-新增第三方字体 第二弹加载线上字体:iOS UIFont-实现三方字体的下载和使用 前言 在上一章我们完成啦如何加载使用本地的字体。如果我们有很多的字体可供用户选择,我们当然可以全部使用本地字体加载方式,可是这样就增加了…

学习Fast-LIO系列代码中相关概念理解

目录 一、流形和流形空间&#xff08;姿态&#xff09; 1.1 定义 1.2 为什么要有流形? 1.3 流形要满足什么性质&#xff1f; (1) 拓扑同胚 (2) 可微结构 1.4 欧式空间和流形空间的区别和联系? (1) 区别&#xff1a; (2) 联系&#xff1a; 1.5 将姿态定义在流形上比…

从0到1利用express搭建后端服务

目录 1 架构的选择2 环境搭建3 安装express4 创建启动文件5 express的核心功能6 加入日志记录功能7 日志记录的好处本节代码总结 不知不觉学习低代码已经进入第四个年头了&#xff0c;既然低代码很好&#xff0c;为什么突然又自己架构起后端了呢&#xff1f;我有一句话叫低代码…

javaWeb项目-旅游民宿管理平台系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、JSP技术 JSP(Jav…

视频素材免费无水印软件有哪些?视频素材免费下载素材库

在这个视觉为王的时代&#xff0c;一段精彩的视频能够跨越语言和文化的障碍&#xff0c;触动每一个心灵。对于每一位热血沸腾的视频创作者而言&#xff0c;寻找那些高质量无水印的素材&#xff0c;就像是在无尽的创意海洋中航行&#xff0c;在这段旅程中&#xff0c;我为你精选…

Polar靶场web(三)

期待得到某一件事物的时候&#xff0c;才是最美好的。 签到 发现不能提交&#xff0c;看一下f12 发现提交按钮被禁用了&#xff0c;且最大输入9个字符&#xff0c;我们可以改一下。 现随便提交一个发现要提交ilovejijcxy session文件包含 发现有文件包含&#xff0c;那先包含…

互联网医院APP开发攻略:搭建智能医疗平台

互联网医院APP为患者提供了便捷的就医途径&#xff0c;还为医生和医院提供了更加高效的服务和管理手段。接下来&#xff0c;小编将我们本文将就互联网医院APP的开发攻略&#xff0c;以及如何搭建智能医疗平台进行探讨。 1.确定需求和目标 这包括确定服务对象&#xff08;患者、…

NO12 蓝桥杯单片机实践之DS1302

1 回顾 DS1302使用电子时钟模式时&#xff0c;使用方法为&#xff1a; &#xff08;1&#xff09;将读写寄存器的地址写成数组 &#xff08;2&#xff09;时间参数写成数组 &#xff08;3&#xff09;调用函数来进行读取实时时间&#xff08;底层代码.c文件&#xff09; 2…