Vue Tour封裝實(shí)現(xiàn)統(tǒng)一的頁(yè)面引導(dǎo)組件
項(xiàng)目開(kāi)發(fā)過(guò)程中需要實(shí)現(xiàn)用戶引導(dǎo)功能,經(jīng)過(guò)調(diào)研發(fā)現(xiàn)一個(gè)好用的 Vue 插件 vue-tour,今天就來(lái)分享一下我是如何基于 vue-tour 封裝一個(gè)統(tǒng)一的引導(dǎo)組件,方便后續(xù)在多個(gè)頁(yè)面復(fù)用的。
第一步:安裝 vue-tour 插件
首先安裝:
npm install vue-tour
然后在項(xiàng)目的 main.js 中進(jìn)行全局注冊(cè):
import Vue from 'vue' import VueTour from 'vue-tour' import 'vue-tour/dist/vue-tour.css' Vue.use(VueTour)
第二步:封裝統(tǒng)一引導(dǎo)組件
我們希望做到的效果是:不管哪個(gè)頁(yè)面需要引導(dǎo),只需要引入這個(gè)組件,傳入 name 和 steps,然后調(diào)用 start() 方法即可開(kāi)啟引導(dǎo)。
于是我們封裝了一個(gè)組件 v-tour-comp.vue,完整代碼如下:
<template>
<div>
<div v-if="showMask" class="mask"></div>
<v-tour :name="name" :steps="steps">
<template slot-scope="tour">
<transition name="fade">
<v-step
v-if="tour.steps[tour.currentStep]"
:key="tour.currentStep"
:step="tour.steps[tour.currentStep]"
:previous-step="tour.previousStep"
:next-step="tour.nextStep"
:stop="tour.stop"
:skip="tour.skip"
:is-first="tour.isFirst"
:is-last="tour.isLast"
:labels="tour.labels"
>
<!-- 基于頁(yè)面需要自定義使用,不用的話可以不需要插槽 -->
<template #content>
<slot :tour="tour"></slot>
</template>
<template #actions>
<slot name="action" :tour="tour"></slot>
</template>
</v-step>
</transition>
</template>
</v-tour>
</div>
</template>
<script>
export default {
name: 'v-tour-comp',
props: {
name: String,
steps: Array
},
data() {
return {
showMask: false
}
},
created() {
this.setStepsBefore()
},
methods: {
setStepsBefore() {
// 引導(dǎo)前判斷每一步的目標(biāo)元素是否存在,保證渲染的位置是正確的
this.steps.forEach((item) => {
item.before = () =>
new Promise((resolve, reject) => {
const el = document.querySelector(item.target)
if (!el) {
reject(new Error('找不到元素'))
return
}
resolve()
})
})
},
start() {
this.showMask = true
this.$tours[this.name]?.start()
},
stop() {
this.showMask = false
this.$tours[this.name]?.stop()
},
previousStep() {
this.$tours[this.name]?.previousStep()
},
nextStep() {
this.$tours[this.name]?.nextStep()
}
}
}
</script>
<style scoped lang="scss">
.mask {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 9999;
background-color: transparent;
}
</style>
核心邏輯說(shuō)明:
我們通過(guò) setStepsBefore 方法,確保每一步引導(dǎo)的目標(biāo) DOM 元素在頁(yè)面上是存在的;
對(duì)外暴露 start()、stop() 等方法,方便外部調(diào)用控制;
使用插槽 <slot> 提供自定義內(nèi)容和操作按鈕的能力;
加一個(gè) mask 遮罩層可以讓用戶更聚焦當(dāng)前引導(dǎo)區(qū)域(當(dāng)然你可以自定義背景色等樣式)。
第三步:在頁(yè)面中使用
在你需要引導(dǎo)的頁(yè)面中,只需要這樣用:
<template>
<div>
<div class="step-1">我是第一步</div>
<div class="step-2">我是第二步</div>
<v-tour-comp ref="tour" :name="'guide-demo'" :steps="tourSteps">
<template #content="{ tour }">
<div>{{ tour.steps[tour.currentStep].content }}</div>
</template>
<template #action="{ tour }">
<button @click="tour.previousStep" v-if="!tour.isFirst">上一步</button>
<button @click="tour.nextStep" v-if="!tour.isLast">下一步</button>
<button @click="tour.stop">結(jié)束</button>
</template>
</v-tour-comp>
</div>
</template>
<script>
import VTourComp from '@/components/v-tour-comp.vue'
export default {
components: { VTourComp },
data() {
return {
tourSteps: [
{
target: '.step-1',
content: '這是第一步,介紹頁(yè)面某個(gè)功能'
},
{
target: '.step-2',
content: '這是第二步,繼續(xù)講解另一個(gè)部分'
}
]
}
},
mounted() {
// 頁(yè)面加載后自動(dòng)觸發(fā)引導(dǎo)
this.$nextTick(() => {
this.$refs.tour.start()
})
}
}
</script>
結(jié)語(yǔ)
通過(guò)封裝這個(gè)組件,我們可以在項(xiàng)目中非常方便地添加用戶引導(dǎo),只需要:
- 傳入
steps; - 引用組件;
- 調(diào)用
start()。
對(duì)于提升用戶上手效率、降低學(xué)習(xí)成本、增強(qiáng)產(chǎn)品友好性來(lái)說(shuō),這樣的小工具非常值得一試。
到此這篇關(guān)于Vue Tour封裝實(shí)現(xiàn)統(tǒng)一的頁(yè)面引導(dǎo)組件的文章就介紹到這了,更多相關(guān)Vue Tour頁(yè)面引導(dǎo)組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過(guò)fastclick源碼分析徹底解決tap“點(diǎn)透”
這篇文章主要介紹了通過(guò)fastclick源碼分析徹底解決tap“點(diǎn)透”問(wèn)題的知識(shí)內(nèi)容,有興趣的朋友學(xué)習(xí)一下吧。2017-12-12
vue實(shí)現(xiàn)動(dòng)態(tài)路由的方法及路由原理解析
這篇文章主要介紹了路由原理及vue實(shí)現(xiàn)動(dòng)態(tài)路由,Vue Router 提供了豐富的 API,可以輕松地實(shí)現(xiàn)路由功能,并支持路由參數(shù)、查詢參數(shù)、命名路由、嵌套路由等功能,可以滿足不同應(yīng)用程序的需求,需要的朋友可以參考下2023-06-06
vue實(shí)現(xiàn)移動(dòng)端適方案的完整步驟
現(xiàn)在的手機(jī)五花八門,造就了移動(dòng)端窗口分辨率繁多的局面,在不同分辨率的屏幕下保持與UI圖一致的效果,就成了讓前端不得不頭疼的問(wèn)題,下面這篇文章主要給大家介紹了vue實(shí)現(xiàn)移動(dòng)端適方案的相關(guān)資料,需要的朋友可以參考下2022-10-10
vue中vue-router的使用說(shuō)明(包括在ssr中的使用)
這篇文章主要介紹了vue中vue-router的使用說(shuō)明(包括在ssr中的使用),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
詳解如何在Vue3使用<script lang=“ts“ setup>語(yǔ)法糖
本文主要介紹了在Vue3使用<script lang=“ts“ setup>語(yǔ)法糖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Vue3?+?elementplus實(shí)現(xiàn)表單驗(yàn)證+上傳圖片+?防止表單重復(fù)提交功能
這篇文章主要介紹了Vue3?+?elementplus?表單驗(yàn)證+上傳圖片+?防止表單重復(fù)提交,本文給大家展示效果圖和完整代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
Vue3使用element-plus組件不顯示問(wèn)題
這篇文章主要介紹了Vue3使用element-plus組件不顯示問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
基于Vue3和Plotly.js實(shí)現(xiàn)交互式3D圖
這篇文章主要介紹了基于Vue3和Plotly.js實(shí)現(xiàn)交互式3D圖,本代碼旨在為數(shù)據(jù)可視化提供一個(gè)交互式圖表,允許用戶動(dòng)態(tài)控制圖表中線條的顏色和可見(jiàn)性,此功能對(duì)于探索大型數(shù)據(jù)集或突出特定數(shù)據(jù)子集非常有用,需要的朋友可以參考下2024-07-07

