-
Notifications
You must be signed in to change notification settings - Fork 835
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: 修复 tour 组件无法根据 current 值展示指定步骤以及 change 事件得到的值有误 #3139
base: v4
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,5 +1,5 @@ | ||||||||||||||||||||||||||||||||||||||||||||||
<template> | ||||||||||||||||||||||||||||||||||||||||||||||
<view :class="classes"> | ||||||||||||||||||||||||||||||||||||||||||||||
<view class="nut-tour"> | ||||||||||||||||||||||||||||||||||||||||||||||
<view v-if="showTour" class="nut-tour-masked" @click="handleClickMask"></view> | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
<view v-for="(step, i) in steps" :key="i" style="height: 0"> | ||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -42,17 +42,15 @@ | |||||||||||||||||||||||||||||||||||||||||||||
@click="changeStep('prev')" | ||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||
{{ prevStepTxt }} | ||||||||||||||||||||||||||||||||||||||||||||||
</view | ||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||
</view> | ||||||||||||||||||||||||||||||||||||||||||||||
</slot> | ||||||||||||||||||||||||||||||||||||||||||||||
<view | ||||||||||||||||||||||||||||||||||||||||||||||
v-if="steps.length - 1 == active" | ||||||||||||||||||||||||||||||||||||||||||||||
class="nut-tour-content-bottom-operate-btn active" | ||||||||||||||||||||||||||||||||||||||||||||||
@click="close" | ||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||
{{ completeTxt }} | ||||||||||||||||||||||||||||||||||||||||||||||
</view | ||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||
</view> | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 建议:简化条件渲染。 可以将 <view v-if="steps.length - 1 == active" class="nut-tour-content-bottom-operate-btn active" @click="close">
{{ completeTxt }}
</view> |
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
<slot name="next-step"> | ||||||||||||||||||||||||||||||||||||||||||||||
<view | ||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -61,8 +59,7 @@ | |||||||||||||||||||||||||||||||||||||||||||||
@click="changeStep('next')" | ||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||
{{ nextStepTxt }} | ||||||||||||||||||||||||||||||||||||||||||||||
</view | ||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||
</view> | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 建议:简化条件渲染。 可以将 <view v-if="steps.length - 1 != active" class="nut-tour-content-bottom-operate-btn active" @click="changeStep('next')">
{{ nextStepTxt }}
</view> |
||||||||||||||||||||||||||||||||||||||||||||||
</slot> | ||||||||||||||||||||||||||||||||||||||||||||||
</view> | ||||||||||||||||||||||||||||||||||||||||||||||
</view> | ||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -80,7 +77,7 @@ | |||||||||||||||||||||||||||||||||||||||||||||
</view> | ||||||||||||||||||||||||||||||||||||||||||||||
</template> | ||||||||||||||||||||||||||||||||||||||||||||||
<script lang="ts"> | ||||||||||||||||||||||||||||||||||||||||||||||
import { computed, watch, ref, reactive, toRefs, PropType, onMounted } from 'vue' | ||||||||||||||||||||||||||||||||||||||||||||||
import { watch, ref, reactive, toRefs, PropType, onMounted } from 'vue' | ||||||||||||||||||||||||||||||||||||||||||||||
import { PopoverLocation, PopoverTheme } from '../popover/type' | ||||||||||||||||||||||||||||||||||||||||||||||
import { createComponent } from '@/packages/utils/create' | ||||||||||||||||||||||||||||||||||||||||||||||
import { rectTaro, useTaroRectById } from '@/packages/utils/useTaroRect' | ||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -181,15 +178,10 @@ export default create({ | |||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
let maskStyles = ref<any[]>([]) | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
const classes = computed(() => { | ||||||||||||||||||||||||||||||||||||||||||||||
const prefixCls = 'nut-tour' | ||||||||||||||||||||||||||||||||||||||||||||||
return `${prefixCls}` | ||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
const maskStyle = (index: number) => { | ||||||||||||||||||||||||||||||||||||||||||||||
const { offset, maskWidth, maskHeight } = props | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
if (!maskRect[index]) return {} | ||||||||||||||||||||||||||||||||||||||||||||||
if (!maskRect[index]) return | ||||||||||||||||||||||||||||||||||||||||||||||
const { width, height, left, top } = maskRect[index] | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
const center = [left + width / 2, top + height / 2] // 中心点 【横,纵】 | ||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -209,31 +201,26 @@ export default create({ | |||||||||||||||||||||||||||||||||||||||||||||
const current = state.active | ||||||||||||||||||||||||||||||||||||||||||||||
let next = current | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
if (type == 'next') { | ||||||||||||||||||||||||||||||||||||||||||||||
next = current + 1 | ||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||
next = current - 1 | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
next = type == 'next' ? current + 1 : current - 1 | ||||||||||||||||||||||||||||||||||||||||||||||
showPopup.value[current] = false | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
setTimeout(() => { | ||||||||||||||||||||||||||||||||||||||||||||||
showPopup.value[next] = true | ||||||||||||||||||||||||||||||||||||||||||||||
state.active = next | ||||||||||||||||||||||||||||||||||||||||||||||
emit('change', state.active) | ||||||||||||||||||||||||||||||||||||||||||||||
showPopup.value[state.active] = true | ||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+204
to
+210
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 优化建议:改进 在 + if (type === 'next' && current >= props.steps.length - 1) return
+ if (type === 'prev' && current <= 0) return
next = type == 'next' ? current + 1 : current - 1
showPopup.value[current] = false
setTimeout(() => {
state.active = next
emit('change', state.active)
showPopup.value[state.active] = true
}, 300) Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||
}, 300) | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
emit('change', state.active) | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
const getRootPosition = () => { | ||||||||||||||||||||||||||||||||||||||||||||||
props.steps.forEach(async (item, i) => { | ||||||||||||||||||||||||||||||||||||||||||||||
useTaroRectById(item.target).then( | ||||||||||||||||||||||||||||||||||||||||||||||
(rect: any) => { | ||||||||||||||||||||||||||||||||||||||||||||||
maskRect[i] = rect | ||||||||||||||||||||||||||||||||||||||||||||||
maskStyle(i) | ||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||
() => {} | ||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||
const getRootPosition = async () => { | ||||||||||||||||||||||||||||||||||||||||||||||
for (const [index, step] of props.steps.entries()) { | ||||||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||||||
const rect = await useTaroRectById(step.target) | ||||||||||||||||||||||||||||||||||||||||||||||
maskRect[index] = rect as rectTaro | ||||||||||||||||||||||||||||||||||||||||||||||
maskStyle(index) | ||||||||||||||||||||||||||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||||||||||||||||||||||||||
console.warn(`[NutUI] Failed to get rect for step ${index}:`, error) | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+214
to
+223
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 建议:增加错误处理。 在 const getRootPosition = async () => {
for (const [index, step] of props.steps.entries()) {
try {
const rect = await useTaroRectById(step.target)
maskRect[index] = rect as rectTaro
maskStyle(index)
} catch (error) {
console.warn(`[NutUI] Failed to get rect for step ${index}:`, error)
+ maskRect[index] = { width: 0, height: 0, left: 0, top: 0 } // 默认值
+ maskStyle(index)
}
}
} Committable suggestion
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 这里拿不到 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @daiwanxing 确定给 不过,如果在实际使用中没有遇到因为 |
||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
const close = () => { | ||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -248,33 +235,30 @@ export default create({ | |||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
onMounted(() => { | ||||||||||||||||||||||||||||||||||||||||||||||
setTimeout(() => { | ||||||||||||||||||||||||||||||||||||||||||||||
getRootPosition() | ||||||||||||||||||||||||||||||||||||||||||||||
}, 500) | ||||||||||||||||||||||||||||||||||||||||||||||
getRootPosition() | ||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
watch( | ||||||||||||||||||||||||||||||||||||||||||||||
() => props.modelValue, | ||||||||||||||||||||||||||||||||||||||||||||||
(val) => { | ||||||||||||||||||||||||||||||||||||||||||||||
if (val) { | ||||||||||||||||||||||||||||||||||||||||||||||
state.active = 0 | ||||||||||||||||||||||||||||||||||||||||||||||
(visible) => { | ||||||||||||||||||||||||||||||||||||||||||||||
if (visible) { | ||||||||||||||||||||||||||||||||||||||||||||||
state.active = props.type === 'step' ? Math.min(Math.max(0, props.current), props.steps.length - 1) : 0 | ||||||||||||||||||||||||||||||||||||||||||||||
getRootPosition() | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
state.showTour = val | ||||||||||||||||||||||||||||||||||||||||||||||
showPopup.value[state.active] = val | ||||||||||||||||||||||||||||||||||||||||||||||
state.showTour = visible | ||||||||||||||||||||||||||||||||||||||||||||||
showPopup.value[state.active] = visible | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
const refRandomId = Math.random().toString(36).slice(-8) | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
return { | ||||||||||||||||||||||||||||||||||||||||||||||
...toRefs(state), | ||||||||||||||||||||||||||||||||||||||||||||||
classes, | ||||||||||||||||||||||||||||||||||||||||||||||
maskStyle, | ||||||||||||||||||||||||||||||||||||||||||||||
changeStep, | ||||||||||||||||||||||||||||||||||||||||||||||
showPopup, | ||||||||||||||||||||||||||||||||||||||||||||||
close, | ||||||||||||||||||||||||||||||||||||||||||||||
handleClickMask, | ||||||||||||||||||||||||||||||||||||||||||||||
showPopup, | ||||||||||||||||||||||||||||||||||||||||||||||
maskStyles, | ||||||||||||||||||||||||||||||||||||||||||||||
refRandomId | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
建议:简化条件渲染。
可以将
active != 0
和showPrevStep
的条件合并,减少不必要的 DOM 操作。