diff --git a/packages/devui-vue/devui/steps-guide/__tests__/steps-guide-demo.tsx b/packages/devui-vue/devui/steps-guide/__tests__/steps-guide-demo.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..29c4caf23ea9d9399513ccad8933a1a00ec6c712
--- /dev/null
+++ b/packages/devui-vue/devui/steps-guide/__tests__/steps-guide-demo.tsx
@@ -0,0 +1,71 @@
+import { ref, defineComponent, reactive } from 'vue'
+import DStepsGuide from '../src/steps-guide'
+export default defineComponent({
+ name: 'StepsGuideDemo',
+ components: {
+ 'd-steps-guide': DStepsGuide,
+ },
+ setup() {
+ const steps = reactive([{ title: '弹出位置 top-left',
+ content: 'Steps Guide',
+ trigger: '.top-left',
+ position: 'top-left'
+ },{ title: '弹出位置 top',
+ content: 'Steps Guide',
+ trigger: '.top',
+ position: 'top'
+ },{ title: '弹出位置 top-right',
+ content: 'Steps Guide',
+ trigger: '.top-right',
+ position: 'top-right'
+ },
+ { title: '弹出位置 right',
+ content: 'Steps Guide',
+ trigger: '.right',
+ position: 'right'
+ },{ title: '弹出位置 bottom-right',
+ content: 'Steps Guide',
+ trigger: '.bottom-right',
+ position: 'bottom-right'
+ },{ title: '弹出位置 bottom',
+ content: 'Steps Guide',
+ trigger: '.bottom',
+ position: 'bottom'
+ },{ title: '弹出位置 bottom-left',
+ content: 'Steps Guide',
+ trigger: '.bottom-left',
+ position: 'bottom-left'
+ },{ title: '弹出位置 left',
+ content: 'Steps Guide',
+ trigger: '.left',
+ position: 'left'
+ }])
+ const stepRef = ref(null), stepIndex = ref(0)
+ const handleClick = (index) => {
+ stepRef.value.setCurrentIndex(index)
+ }
+ const handleClose = () => {
+ stepRef.value.closeGuide()
+ }
+ return {
+ steps,
+ stepRef,
+ stepIndex,
+ handleClick,
+ handleClose
+ }
+ },
+ render(props){
+ return (<>
+
+
+
+
+
+
+
+
+
+ >)
+ }
+})
\ No newline at end of file
diff --git a/packages/devui-vue/devui/steps-guide/__tests__/steps-guide.spec.ts b/packages/devui-vue/devui/steps-guide/__tests__/steps-guide.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..86fb4534ed4db471e1b0d5d1ad902a5a4b4bdd03
--- /dev/null
+++ b/packages/devui-vue/devui/steps-guide/__tests__/steps-guide.spec.ts
@@ -0,0 +1,53 @@
+import { mount } from '@vue/test-utils';
+import StepsGuideDemo from './steps-guide-demo';
+document.body.innerHTML = `
+
+
+
+
+
+
+
+ `
+
+describe('d-steps-guide', () => {
+ it('test steps change', async () => {
+ const wrapper = mount(StepsGuideDemo)
+
+ await wrapper.get('.top').trigger('click')
+ expect(wrapper.vm.stepIndex).toBe(1)
+ expect(document.querySelector('.devui-steps-guide').className).toContain('top')
+
+ await wrapper.get('.right').trigger('click')
+ expect(wrapper.vm.stepIndex).toBe(3)
+ expect(document.querySelector('.devui-steps-guide').className).toContain('right')
+
+ await wrapper.get('.bottom').trigger('click')
+ expect(wrapper.vm.stepIndex).toBe(5)
+ expect(document.querySelector('.devui-steps-guide').className).toContain('bottom')
+
+ await wrapper.get('.left').trigger('click')
+ expect(wrapper.vm.stepIndex).toBe(7)
+ expect(document.querySelector('.devui-steps-guide').className).toContain('left')
+
+ await wrapper.get('.top-left').trigger('click')
+ expect(wrapper.vm.stepIndex).toBe(0)
+ expect(document.querySelector('.devui-steps-guide').className).toContain('top-left')
+
+ await wrapper.get('.top-right').trigger('click')
+ expect(wrapper.vm.stepIndex).toBe(2)
+ expect(document.querySelector('.devui-steps-guide').className).toContain('top-right')
+
+ await wrapper.get('.bottom-right').trigger('click')
+ expect(wrapper.vm.stepIndex).toBe(4)
+ expect(document.querySelector('.devui-steps-guide').className).toContain('bottom-right')
+
+ await wrapper.get('.bottom-left').trigger('click')
+ expect(wrapper.vm.stepIndex).toBe(6)
+ expect(document.querySelector('.devui-steps-guide').className).toContain('bottom-left')
+
+ await wrapper.get('.close').trigger('click')
+ expect(wrapper.vm.stepIndex).toBe(-1)
+ expect(document.querySelector('.devui-steps-guide')).toBe(null)
+ });
+});
diff --git a/packages/devui-vue/devui/steps-guide/hooks/use-steps-guide-ctrl.ts b/packages/devui-vue/devui/steps-guide/hooks/use-steps-guide-ctrl.ts
index e7ca9d2aa6af5bb977c9853637147310aec13d3d..c35b6ce8f2a193b4fb45785fee77e1833e80b6df 100644
--- a/packages/devui-vue/devui/steps-guide/hooks/use-steps-guide-ctrl.ts
+++ b/packages/devui-vue/devui/steps-guide/hooks/use-steps-guide-ctrl.ts
@@ -21,9 +21,7 @@ export function useStepsGuideCtrl(
if(index !== -1 && props.stepChange()){
if(index > -1 && index < stepsCount.value) {
stepIndex.value = index
- console.log(stepIndex.value, index, stepsCount.value)
nextTick(() => {
- console.log(stepIndex.value, index, stepsCount.value)
updateGuidePosition()
})
} else {
diff --git a/packages/devui-vue/devui/steps-guide/hooks/use-steps-guide-position.ts b/packages/devui-vue/devui/steps-guide/hooks/use-steps-guide-position.ts
index 146ce4381794ebaa7cff581d4b95e7e8aa62c7e6..86e3bdd770969716053e92a36b78f61ff34e4d69 100644
--- a/packages/devui-vue/devui/steps-guide/hooks/use-steps-guide-position.ts
+++ b/packages/devui-vue/devui/steps-guide/hooks/use-steps-guide-position.ts
@@ -4,7 +4,7 @@ import { Step, positionConf, StepsGuideProps } from '../src/steps-guide-types'
export function useStepsGuidePosition(
props: StepsGuideProps,
currentStep: ComputedRef) {
- const guideClassList = ['devui-steps-guide']
+ const guideClassList = reactive(['devui-steps-guide'])
const stepsRef = ref(null)
const guidePosition = reactive({
left: '',
@@ -13,7 +13,7 @@ export function useStepsGuidePosition(
})
const updateGuidePosition = () => {
- if(!currentStep.value) return;
+ if(!currentStep.value || !stepsRef.value) return;
const baseTop = window.pageYOffset - document.documentElement.clientTop
const baseLeft = window.pageXOffset - document.documentElement.clientLeft
const currentStepPosition:positionConf = currentStep.value.position
@@ -29,6 +29,10 @@ export function useStepsGuidePosition(
guideClassList.splice(1, 1, currentStepPosition)
const triggerSelector = currentStep.value.target || currentStep.value.trigger
const triggerElement = document.querySelector(triggerSelector)
+ if(!triggerElement) {
+ console.warn(`${triggerSelector} 不存在!`)
+ return false
+ }
const targetRect = triggerElement.getBoundingClientRect()
_left = targetRect.left + triggerElement.clientWidth / 2 - stepGuideElement.clientWidth / 2 + baseLeft
_top = targetRect.top + triggerElement.clientHeight / 2 - stepGuideElement.clientHeight / 2 + baseTop
@@ -61,7 +65,7 @@ export function useStepsGuidePosition(
}
guidePosition.left = _left + 'px'
guidePosition.top = _top + 'px'
- if(props.scrollToTargetSwitch) {
+ if(props.scrollToTargetSwitch && typeof stepGuideElement.scrollIntoView === 'function') {
nextTick(() => {
// 位置更新后滚动视图
stepGuideElement.scrollIntoView({behavior: "smooth", block: "nearest", inline: "nearest"})