vue3封装el-tour漫游式引导

embedded/2025/1/18 2:18:35/

vue3eltour_0">vue3使用el-tour漫游式引导组件封装

我们这里先看下运行效果:

预览效果

引入的第三方库方法我这里就不写了,可以自行去官网查找。
我们看一下组件封装的部分。

vue_8">tourPage.vue
  <el-tour v-model="open" :show-close="false" @change="onStepChange" :content-style="{width: '80%',fontSize: '16px',color: '#252525',}"><el-tour-step v-for="(item, index) in data" :key="index" :target="item.target" :title="item.title ? item.title : `第${currentStep}步`" :description="item.description" :prev-button-props="{children: '上一步',onClick: handlePrevClick}" :next-button-props="{children: nextBtnName,onClick: handleNextClick}" /><template #indicators="{ current, total }"><span style="font-size: 16px; color: #252525;">{{ current + 1 }} / {{ total }}</span></template><!--   <template #indicators><el-button size="small" @click="handleSkip">跳过</el-button></template> --></el-tour>

数据结构:

const tourData = computed(() => [{title: "功能引导",description: "让我们来学习一下",},{title: "功能按钮",description: "这里有每日一言和票房大全功能入口",target: () => ref1.value,},{title: "个人中心",description: "点击头像可以打开个人中心,更换头像和昵称,还可以和机器人对话",target: () => ref2.value,},{title: "新年彩蛋",description: "一会可以点击这里,看看有什么惊喜",target: () => ref3.value,},{title: "关于文案",description: "表面可以查看文案,从这里点击进入可以开启音乐",target: () => ref4?.value?.$el || null},{title: "抽奖",description: "点击这里可以进入抽奖页面,试试手气吧",target: () => ref5.value,},
]);

这里需要注意一下第四个部分,我这里因为要直接绑定第三方组件Vant的van-notice-bar的所以需要使用Vant中自带的NoticeBarInstance 类型

import type { NoticeBarInstance } from 'vant';

所以在定义的时候需要这么写

const ref4 = ref<NoticeBarInstance>()          // 文案通知栏
// 数据
target: () => ref4?.value?.$el || null

如果是引导饿了么的组件获取dom类型可以从官网上查看,比如绑定在el-button按钮上

import type { ButtonInstance } from 'element-plus'
const ref4 = ref<ButtonInstance>()   
// 数据
{title: "关于文案",description: "表面可以查看文案,从这里点击进入可以开启音乐",target: () => ref4?.value?.$el || null
},

如果不用官网的方法也可以直接使用js方法获取,当然你也不需要NoticeBarInstance 类型了

const ref4 = ref<HTMLElement | null>(null)
// 数据
{title: "关于文案",description: "表面可以查看文案,从这里点击进入可以开启音乐",target: () => document.querySelector('.van-notice-bar'),
},

自定义按钮文字
在这里插入图片描述

      <el-tour-stepv-for="(item, index) in data":key="index":target="item.target":title="item.title ? item.title : `第${currentStep}步`":description="item.description":prev-button-props="{children: '上一步',onClick: handlePrevClick}":next-button-props="{children: nextBtnName,onClick: handleNextClick}"/>

组件完整代码:

<script setup lang="ts">
import { ref, computed, PropType } from "vue";
import type { ButtonInstance } from 'element-plus'
import type { NoticeBarInstance } from 'vant';
// 引导步骤项目接口定义
interface TourItem {title: string;                   // 步骤标题description: string;             // 步骤描述target?: () => NoticeBarInstance | HTMLElement | null | undefined | any;  // 目标元素
}
// Props 定义
const props = defineProps({data: {type: Array as PropType<TourItem[]>,required: true},modelValue: {type: Boolean,default: false}
})// 事件发射器
const emits = defineEmits(['change', 'prev', 'next', 'update:modelValue'])// 引导组件显示状态(双向绑定)
const open = computed({get: () => props.modelValue,set: (value) => emits('update:modelValue', value)
})// 当前引导步骤
const currentStep = ref(0);// 下一步按钮文本
const nextBtnName = computed(() => {let name = ''if (!currentStep.value) {name = '开始'} else if (currentStep.value === props.data.length - 1) {name = '完成'} else {name = `下一步(${currentStep.value} / ${props.data.length - 1}`}return name
})// 步骤变化处理函数
const onStepChange = (step: number) => {currentStep.value = stepemits('change', step)
}// 跳过按钮处理函数(暂未启用)
/* const handleSkip = () => {open.value = false
} */// 上一步按钮处理函数
const handlePrevClick = () => {emits('prev', currentStep.value)
}// 下一步按钮处理函数
const handleNextClick = () => {emits('next', currentStep.value)
}
</script><template><div><el-tour v-model="open" :show-close="false" @change="onStepChange" :content-style="{width: '80%',fontSize: '16px',color: '#252525',}"><el-tour-stepv-for="(item, index) in data":key="index":target="item.target":title="item.title ? item.title : `第${currentStep}步`":description="item.description":prev-button-props="{children: '上一步',onClick: handlePrevClick}":next-button-props="{children: nextBtnName,onClick: handleNextClick}"/><template #indicators="{ current, total }"><span style="font-size: 16px; color: #252525;">{{ current + 1 }} / {{ total }}</span></template><!-- 跳过按钮(暂未启用) --><!-- <template #indicators><el-button size="small" @click="handleSkip">跳过</el-button></template> --></el-tour></div>
</template><style scoped></style>

这里的记步条可以用插槽indicators去做,详细的写法看上述代码即可
最后在父组件使用:

    <TourPagev-model="tourVisible":data="tourData"@change="(step) => console.log('当前步骤:', step)"@prev="(step) => console.log('上一步:', step)"@next="(step) => console.log('下一步:', step)"/><el-button color="#626aef" @click="startTour">快速引导</el-button>
const tourVisible = ref(false)
// 点击时开启
const startTour = () => {tourVisible.value = true
}

数据附下

// 引导步骤配置
const tourData = computed(() => [{title: "功能引导",description: "让我们来学习一下",},{title: "功能按钮",description: "这里有每日一言和票房大全功能入口",target: () => ref1.value,},{title: "个人中心",description: "点击头像可以打开个人中心,更换头像和昵称,还可以和机器人对话",target: () => ref2.value,},{title: "新年彩蛋",description: "一会可以点击这里,看看有什么惊喜",target: () => ref3.value,},{title: "关于文案",description: "表面可以查看文案,从这里点击进入可以开启音乐",target: () => ref4?.value?.$el || null},{title: "抽奖",description: "点击这里可以进入抽奖页面,试试手气吧",target: () => ref5.value,},
]);

http://www.ppmy.cn/embedded/154821.html

相关文章

单片机实物成品-012 酒精监测

项目介绍 本项目以软硬件结合的方式&#xff0c;选择 C 语言作为程序硬件编码语言&#xff0c; 以 STM32 单片机作为核心控制板&#xff0c;在数据传输节点上连接酒精传感器对酒精浓度进行 实时检测&#xff0c;且对高浓度酒精采取强制干预和紧急预警&#xff0c;并将数据通过…

RV1126+FFMPEG推流项目(4)VENC模块视频编码流程

在RV1126FFMPEG推流项目(3)VI模块视频编码流程-CSDN博客&#xff0c;说了vi的编码流程&#xff0c;这篇说VENC的初始化(硬件编码)。 上一篇提到了几个重要的数据结构体&#xff0c;这节说这个RV1126_VENC_CONFIG。继续认识一下。 /*** brief RV1126_VENC_CONFIG 结构体定义* *…

ElasticSearch-Nested 类型与 Object 类型的区别

在 Elasticsearch 中&#xff0c;nested 类型和 object 类型都用于处理嵌套的 JSON 数据&#xff0c;但它们在存储和查询方面有着显著的区别。本文将详细解释这两种类型的区别&#xff0c;并提供具体的示例。 一、基本概念 1. object 类型 定义&#xff1a;object 类型是 Elas…

论文阅读:Structure-Driven Representation Learning for Deep Clustering

Xiang Wang, Liping Jing, Huafeng Liu, and Jian Yu. 2023. Structure-Driven Representation Learning for Deep Clustering. ACM Trans. Knowl. Discov. Data 18, 1, Article 31 (January 2024), 25 pages. https://doi.org/10.1145/3623400 论文地址&#xff1a;Structure…

css 原子化

CSS 原子化&#xff08;Atomic CSS&#xff09;是一种设计思路&#xff0c;旨在通过定义小而简洁的类来实现高效的样式应用&#xff0c;每个类负责一个单独的样式属性。这样&#xff0c;通过组合多个原子类&#xff0c;可以快速、灵活地为元素应用样式&#xff0c;而不需要编写…

Spring Boot中的自动配置原理是什么

Spring Boot 自动配置原理 Spring Boot 的自动配置机制基于 条件化配置&#xff0c;通过 EnableAutoConfiguration 注解来启用。自动配置的核心原理是 基于类路径和环境条件来推断所需要的配置&#xff0c;Spring Boot 会根据项目中引入的依赖和当前环境来自动装配相关的配置项…

如何用 AI 打造孩子的专属学习助手?

目录 一、创建智能体 二、填写提示词 三、验证效果 四、发布到豆包 如何用 AI 打造孩子的专属学习助手&#xff1f; 如何用 AI 打造孩子的专属学习助手&#xff1f; 今天给大家分享个超实用滴干货&#xff0c;能让家里的娃在学习路上如虎添翼&#xff01;  前几天&#…

基于微信小程序的汽车销售系统的设计与实现springboot+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…