日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

如何在vue项目中,跨页面(跨路由)使用新手引导工具 Intro.js

發布時間:2024/1/18 vue 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在vue项目中,跨页面(跨路由)使用新手引导工具 Intro.js 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 功能要求
    • 使用Intro.js遇到的問題以及代碼
      • 1.不能跨路由
        • utils -> intro.js
      • 2.要在頁面引導所需顯示的數據全部拿到且渲染完畢以后加載Intro.js
        • intro.js工具類如何使用

功能要求

公司要求在自己的平臺上實現新手引導,還是跨頁面,跨路由的。我找了下網上的新手引導插件,最后選了Intro.js來使用,可能因為它稍微好看那么一丟丟吧。

我寫的大多數都是思路,如果能看懂的話應該能輕易實現這些效果,直接粘貼的話估計懸哈。

建議先去Intro.js官網看一下demo,了解一下再來看demo基礎上的操作。

我只是個小小的基層程序員,如果有什么讓大家看了發笑的想法和邏輯就不要嘲笑我了,請溫柔地告訴我謝謝。

以下都是自己真實遇到的問題并且想方設法解決的,有更好的解決辦法可以貼出來一起討論。

使用Intro.js遇到的問題以及代碼

1.不能跨路由

最大的問題就是,Intro.js不能跨路由,因為它是在當前頁面,根據dom唯一的Id值,來獲取并顯示新手引導,所以沒有渲染的頁面它是獲取不到的。
所以我想的是,在每個頁面都從頭加載一次Intro.js,上一個頁面引導完畢以后,就直接router.push到下一個路由,然后自動加載,進行引導,引導完了再push到下一個路由,好的,完美套娃

我們先在utils.js文件里封裝一個工具類Intro.js,方便每個頁面直接引用。這里我直接貼最終版的代碼啦,我覺得還是比較好看懂的。

utils -> intro.js

import introJs from 'intro.js' import 'intro.js/introjs.css'; import router from '@/router' import store from '@/store'let count = 0 // 初始化為0,后面會根據每一步傳入的dom的id選擇器 判斷當前在第幾步 let state = 0 // skip: 0 ,done: 1; export function guide (introSteps) {// console.log(sessionStorage.getItem('isIntro'))if (!parseInt(sessionStorage.getItem('isIntro'))) {return}introJs().setOptions({steps: introSteps,/* 當位置選擇自動的時候,位置排列的優先級 */positionPrecedence: ["top", "bottom", "right", "left"],prevLabel: "上一步",nextLabel: "下一步",skipLabel: "跳過",// 這里因為每個頁面的最后一步其實就會顯示doneLabel了,而實際上我們的新手引導操作并沒有完成,需要跳轉路由繼續,所以顯示的是下一步而非完成。doneLabel: "下一步", hidePrev: true,exitOnOverlayClick: false,/* 是否顯示說明的數據步驟*/showStepNumbers: false,/* 是否使用點點點顯示進度 */showBullets: false,/* 是否使用鍵盤Esc退出 */exitOnEsc: false,/* 默認提示位置 */hintPosition: 'top-left',/* 說明高亮區域的樣式 */highlightClass: 'customHighlight',/* 引導說明文本框的樣式 */tooltipClass: 'customTooltip'}).onchange(function (targetElement) {// 每次change時觸發,我的id樣式是“guide-step<id>”// id代表新手引導的第幾步,例如“guide-step1”,通過id判斷當前是第幾步count = parseInt(targetElement.id.slice(-1))}).onafterchange(function (targetElement) {// 公司設計的新手引導只有七步,如果count == 7了,說明現在是最后一步// 跳轉完成后用js的dom操作將doneLabel由“下一步”改為“完成”if (count === 7) {let i = document.getElementsByClassName('introjs-donebutton')[0].innerHTML = '知道了'}}).oncomplete(function (targetElement) {// 點擊完成以及跳過按鈕后執行的事件,不區分完成和跳過。state = 1setTimeout(() => {if (state) {judgeCount()}}, 200)}).onexit(function (targetElement) {// 點擊完成按鈕后, 執行的事件}).onskip(function (targetElement) {// 點擊跳過按鈕后, 執行的事件// onskip這個我當時在官網api里查不到,是我自己翻源碼翻出來的,折騰半天,無語。// 因為點擊跳過以后是默認完成了新手引導,此時就需要將狀態傳給后端,保證下一次進入有Intro.js的頁面時時不加載新手引導了。// 因為vue是跨路由寫的,每個頁面的完成其實都不是用戶真正完成了新手引導// 所以如果不區分完成和跳過各自觸發的事件的話,我們就不會知道用戶當前是跳過( ==完成了新手引導)還是只是當前頁面的完成,需要繼續跳轉下一個路由。state = 0// 存儲進緩存,下次進入新手引導路由頁時將不在觸發Intro.jsstore.state.introStepInfo.isIntro = statesessionStorage.setItem('isIntro', state)}).start(); }// 這個是每一步新手引導對應的點擊下一步時對應應該進行的操作 // 我這邊,1,2步在一個頁面,3,4步在一個頁面,5,6步在一個頁面,第7步在一個頁面 // 所以1,3,5的時候我不需要進行特定操作,按照Intro.js走就行了 function judgeCount () {// 這是事先預存的跳轉路由需要的一些數據let _introStepInfo = JSON.parse(sessionStorage.getItem('introStepInfo'))switch (count) {case 1:breakcase 2:router.push({path: '/courseDetail',query: {id: _introStepInfo.courseId}})breakcase 3:breakcase 4:let _introChapterName = sessionStorage.getItem('chapterName')router.push({path: '/coursePreview',query: {id: _introStepInfo.courseId,chapterId: _introStepInfo.chapterId}})breakcase 5:breakcase 6:router.push({path: '/myCourses'})breakcase 7:sessionStorage.setItem('isIntro', 0)break} }

2.要在頁面引導所需顯示的數據全部拿到且渲染完畢以后加載Intro.js

這里要注意一個問題,就是有些dom是要在從后端拿到數據以后渲染了才有的,不渲染的話Intro.js獲取不到唯一的id值。

所以我們在axios封裝里面,要在全局設定一個值為false的Boolean變量isAxios,在請求回來以后將它變為true。
這只是最基礎的,除此以外還要考慮該頁面是不是有兩個以上需要拿到數據才能渲染的dom,所以這時需要再增加一個全局變量count,請求request的時候+1,response回來的時候-1,count為0的時候再把isAxios設為true。然后我們再在需要渲染Intro.js的頁面生命周期 mounted() 里設定一個500毫秒/次的定時器,判斷isAxios,為true了,我們就可以進行新手引導了,并且在完成后清除。

這些都是不成熟的,如果有更好的方法大家可以提出。

intro.js工具類如何使用

// 引入自己封裝的新手引導函數 import { guide } from '@/utils/intro'

在mounted()生命周期里設定計時器

let i = setInterval(() => {if (!this.isAxios) {guide([{title: '開放課程',intro: '查看您已采購的全部課程。(1/7)',element: document.querySelector('#guide-step1')},{title: '課程資源',intro: '點擊任意一門課程封面進入該課程。(2/7)',element: document.querySelector('#guide-step2')}])clearInterval(i)} }, 500)

其實在封裝axios里關于這個還有很多需要注意的小細節,但與intro.js其實關系不大了,本次就不說了,大家多多注意一下就可以了。

總結

以上是生活随笔為你收集整理的如何在vue项目中,跨页面(跨路由)使用新手引导工具 Intro.js的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天躁日日躁bbbbb | 人善交videos欧美3d动漫 | 中文字幕一区二区三区四区欧美 | 日韩视频第一页 | 久热热 | 午夜神马影院 | 黄网在线| 综合av| 在线观看特色大片免费网站 | 欧美激情国产一区 | 牛人盗摄一区二区三区视频 | 精品伊人久久 | 天天夜夜草 | 黑白配高清国语在线观看 | 久草视频在线观 | 欧洲一区二区视频 | 9i精品福利一区二区三区 | 国产一区二区高清视频 | 伊人视频 | 看毛片看毛片 | 136福利视频导航 | 午夜h视频 | 国产免费黄色片 | 国产又粗又大又爽视频 | 日韩美女做爰高潮免费 | 性欧美ⅹxxxx极品护士 | 国产色在线观看 | 天天干b | 国产精品久久久久久久久久久新郎 | 亚洲欧美综合一区二区 | 国产成人一区二区三区视频 | 亚洲激情电影在线 | 无码h黄肉3d动漫在线观看 | 国产91免费在线观看 | 成人h动漫在线 | 性欧美8khd高清极品 | 大香伊人 | 公肉吊粗大爽色翁浪妇视频 | 日本黄色a视频 | 自拍亚洲国产 | 三级视频在线 | 男男gay羞辱feet贱奴vk | 性插插视频| 日日夜夜免费视频 | 在线免费观看的av | 国产精品午夜电影 | 夜夜精品视频 | 日本一区二区视频免费 | 国产精品一区二区免费视频 | 人人艹在线观看 | 解开乳罩喂领导吃奶 | 射进来av影视网 | 国产精品国语 | 污视频在线免费观看 | 天天拍夜夜拍 | 日韩av不卡一区 | 中文在线√天堂 | 日韩精品影院 | 国产二区精品视频 | 亚洲国产123| 97av视频在线| 久久婷婷网 | 国产超碰精品 | 色播在线视频 | 综合久久91 | av片网 | 96福利视频 | 欧美日韩在线视频 | 91一区二区在线观看 | 九九视频免费在线观看 | 一级激情片 | 九九视频这里只有精品 | 男女在线观看视频 | 国产首页 | 亚洲性猛交xxxx乱大交 | 人妻体内射精一区二区 | 日日夜夜综合网 | 亚洲无线看 | 91欧美亚洲 | 空姐毛片 | 国产成人在线播放视频 | 桃色在线视频 | 精品自拍一区 | 丁香六月色 | 91av成人| 天天av天天翘 | 成年人免费看的视频 | 欧美巨大荫蒂茸毛毛人妖 | 欧美成人dvd在线视频 | 成年网站在线 | 成年女人免费视频 | 秋霞在线一区 | 精品亚洲aⅴ无码一区二区三区 | 激情综合亚洲 | 丁香花高清在线观看完整动漫 | 青青草视频在线观看免费 | av不卡高清 | av地址在线 | 国内精品免费 |