Skip to content
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

Open
wants to merge 3 commits into
base: v4
Choose a base branch
from

Conversation

daiwanxing
Copy link
Contributor

@daiwanxing daiwanxing commented Jul 12, 2024

这个 PR 做了什么? (简要描述所做更改)

修复了当用户传入 current prop 时无效,组件未对 current 做处理,还修复了 onChange 事件得到的 step 的值计算错误

这个 PR 是什么类型? (至少选择一个)

  • feat: 新特性提交
  • fix: bug 修复
  • docs: 文档改进
  • style: 组件样式/交互改进
  • type: 类型定义更新
  • perf: 性能、包体积优化
  • refactor: 代码重构、代码风格优化
  • test: 测试用例
  • chore(deps): 依赖升级
  • chore(demo): 演示代码改进
  • chore(locale): 国际化改进
  • chore: 其他改动(是关于什么的改动?)

这个 PR 涉及以下平台:

  • NutUI H5 @nutui/nutui
  • NutUI Taro @nutui/nutui-taro

这个 PR 是否已自测:

Summary by CodeRabbit

Summary by CodeRabbit

  • 新功能
    • 更新了Tour组件的步骤转换逻辑,提升用户在切换步骤时的流畅度。
  • 代码重构
    • 优化了类属性的分配,将动态类绑定改为静态类分配。
    • 重构了计算属性,提高了代码可读性和维护性。
  • 样式
    • 引入了CSSProperties类型,增强了样式管理的一致性和可控性。

Copy link

coderabbitai bot commented Jul 12, 2024

Walkthrough

这些更改集中在 src/packages/__VUE/tour/index.taro.vue 文件内,主要涉及模板中类属性的修改,从绑定动态类变为静态类分配。此外,脚本部分引入了 CSSProperties,移除了 classes 计算属性,并对 changeStep 函数进行了控制流增强,以简化步骤转换和事件处理。

Changes

文件路径 更改摘要
src/packages/__VUE/tour/index.taro.vue 修改模板中的类属性分配,增加 CSSProperties 导入,移除 classes 计算属性,改进 changeStep 函数的控制流

Poem

代码如诗,优雅流,
类属性静态有,
脚步轻盈函数走,
风格新颖掌握手。
兔子欢跃庆更改,
未来无限乐陶陶。 🐇✨


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@daiwanxing
Copy link
Contributor Author

#3138

@daiwanxing daiwanxing changed the title fix: 修复 tour 组件无法根据 current 指定展示的步骤以及 change 事件得到的值有误 fix: 修复 tour 组件无法根据 current 指定展示步骤以及 change 事件得到的值有误 Jul 12, 2024
@daiwanxing daiwanxing changed the title fix: 修复 tour 组件无法根据 current 指定展示步骤以及 change 事件得到的值有误 fix: 修复 tour 组件无法根据 current 值展示指定步骤以及 change 事件得到的值有误 Jul 12, 2024
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Outside diff range, codebase verification and nitpick comments (2)
src/packages/__VUE/tour/index.taro.vue (2)

2-2: 建议:优化类绑定方式。

将动态类绑定改为静态类分配的方式可能会导致某些条件下的样式无法正确应用。建议确认这样更改是否符合预期。


80-80: 优化导入顺序。

建议将 CSSProperties 放在其他导入类型之前,以保持导入顺序的一致性和可读性。

import { CSSProperties, watch, ref, reactive, toRefs, PropType, onMounted } from 'vue'
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between a415d0b and dd17a40.

Files selected for processing (1)
  • src/packages/__VUE/tour/index.taro.vue (7 hunks)
Additional comments not posted (5)
src/packages/__VUE/tour/index.taro.vue (5)

179-179: 更改类型定义。

maskStyles 的类型从 ref<any[]> 更改为 ref<CSSProperties[]> 提高了类型安全性,这是一个很好的改进。


184-184: 检查索引是否存在。

在访问 maskRect[index] 之前,建议确保索引存在,以避免潜在的运行时错误。

if (index in maskRect && !maskRect[index]) return

204-210: 改进步骤切换逻辑。

改进后的 changeStep 函数逻辑更清晰,确保了步骤切换的正确性。


214-223: 改进根元素位置获取逻辑。

改进后的 getRootPosition 函数逻辑更清晰,捕获错误的方式更好。


238-249: 改进属性观察逻辑。

改进后的 watch 函数逻辑更清晰,确保了组件状态的正确性。

@@ -42,17 +42,15 @@
@click="changeStep('prev')"
>
{{ prevStepTxt }}
</view
>
</view>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

建议:简化条件渲染。

可以将 active != 0showPrevStep 的条件合并,减少不必要的 DOM 操作。

<view v-if="active != 0 && showPrevStep" class="nut-tour-content-bottom-operate-btn" @click="changeStep('prev')">
  {{ prevStepTxt }}
</view>

</slot>
<view
v-if="steps.length - 1 == active"
class="nut-tour-content-bottom-operate-btn active"
@click="close"
>
{{ completeTxt }}
</view
>
</view>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

建议:简化条件渲染。

可以将 steps.length - 1 == active 的条件直接放在 v-if 中,减少不必要的 DOM 操作。

<view v-if="steps.length - 1 == active" class="nut-tour-content-bottom-operate-btn active" @click="close">
  {{ completeTxt }}
</view>

@@ -61,8 +59,7 @@
@click="changeStep('next')"
>
{{ nextStepTxt }}
</view
>
</view>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

建议:简化条件渲染。

可以将 steps.length - 1 != active 的条件直接放在 v-if 中,减少不必要的 DOM 操作。

<view v-if="steps.length - 1 != active" class="nut-tour-content-bottom-operate-btn active" @click="changeStep('next')">
  {{ nextStepTxt }}
</view>

Copy link

codecov bot commented Jul 12, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 81.18%. Comparing base (a415d0b) to head (5f7c046).
Report is 1 commits behind head on v4.

Additional details and impacted files
@@            Coverage Diff             @@
##               v4    #3139      +/-   ##
==========================================
- Coverage   81.20%   81.18%   -0.02%     
==========================================
  Files         226      226              
  Lines       18139    18142       +3     
  Branches     2485     2485              
==========================================
  Hits        14729    14729              
- Misses       3392     3395       +3     
  Partials       18       18              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Outside diff range, codebase verification and nitpick comments (1)
src/packages/__VUE/tour/index.taro.vue (1)

80-80: 优化建议:移除未使用的 import。

可以移除 CSSProperties 的导入,因为它未被使用。

- import { watch, ref, reactive, toRefs, PropType, onMounted, CSSProperties } from 'vue'
+ import { watch, ref, reactive, toRefs, PropType, onMounted } from 'vue'
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between dd17a40 and 43cf731.

Files selected for processing (1)
  • src/packages/__VUE/tour/index.taro.vue (7 hunks)
Additional comments not posted (4)
src/packages/__VUE/tour/index.taro.vue (4)

Line range hint 2-45: 建议:简化条件渲染。

可以将 active != 0showPrevStep 的条件合并,减少不必要的 DOM 操作。

<view v-if="active != 0 && showPrevStep" class="nut-tour-content-bottom-operate-btn" @click="changeStep('prev')">
  {{ prevStepTxt }}
</view>

53-53: 建议:简化条件渲染。

可以将 steps.length - 1 == active 的条件直接放在 v-if 中,减少不必要的 DOM 操作。

<view v-if="steps.length - 1 == active" class="nut-tour-content-bottom-operate-btn active" @click="close">
  {{ completeTxt }}
</view>

62-62: 建议:简化条件渲染。

可以将 steps.length - 1 != active 的条件直接放在 v-if 中,减少不必要的 DOM 操作。

<view v-if="steps.length - 1 != active" class="nut-tour-content-bottom-operate-btn active" @click="changeStep('next')">
  {{ nextStepTxt }}
</view>

179-179: 优化建议:更新类型定义。

更新 maskStyles 的类型定义以提高代码的可读性和类型检查的准确性。

let maskStyles = ref<CSSProperties[]>([])

Comment on lines +204 to +210
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
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

优化建议:改进 changeStep 方法。

changeStep 方法中,可以在 next 变量赋值之前添加边界条件检查,以防止数组越界。

+ 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

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
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
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)

Comment on lines +214 to +223
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)
}
}
Copy link

@coderabbitai coderabbitai bot Jul 12, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

建议:增加错误处理。

getRootPosition 方法中,可以增加更多的错误处理逻辑,以确保每个步骤的 rect 都能正确获取或处理错误情况。

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

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
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)
}
}
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)
}
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里拿不到 step 的位置信息,再赋值默认值有必要吗

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@daiwanxing 确定给 step 赋值默认值的目的是为了防止在无法获取位置信息时,应用程序出现意外行为或错误。这些默认值可以作为一种安全措施,确保 maskStyle 方法能够正常执行。

不过,如果在实际使用中没有遇到因为 step 位置信息无法获取而导致的问题,那么这些默认值可能确实没有必要。请问您在使用中是否遇到过 step 位置信息无法获取的情况?如果没有问题,我们可以考虑不赋值默认值。

@daiwanxing
Copy link
Contributor Author

image

这个错误麻烦帮我看看原因 @eiinu

@eiinu eiinu linked an issue Jul 18, 2024 that may be closed by this pull request
@eiinu
Copy link
Member

eiinu commented Jul 26, 2024

image

这个错误麻烦帮我看看原因 @eiinu

似乎在当前组件内定义与 CSSProperties 类型有关的变量时都会报错,没有排查出具体的原因,可能与定义组件的方法有关系,用 any 暂时绕过吧。后续切换成 script + setup 应该就不会有这个问题了。

@daiwanxing
Copy link
Contributor Author

image
这个错误麻烦帮我看看原因 @eiinu

似乎在当前组件内定义与 CSSProperties 类型有关的变量时都会报错,没有排查出具体的原因,可能与定义组件的方法有关系,用 any 暂时绕过吧。后续切换成 script + setup 应该就不会有这个问题了。

好的,调整了

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 43cf731 and 5f7c046.

Files selected for processing (1)
  • src/packages/__VUE/tour/index.taro.vue (7 hunks)
Additional comments not posted (3)
src/packages/__VUE/tour/index.taro.vue (3)

204-210: 建议:改进 changeStep 方法。

changeStep 方法中,可以在 next 变量赋值之前添加边界条件检查,以防止数组越界。

+ 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)

214-223: 建议:增加错误处理。

getRootPosition 方法中,可以增加更多的错误处理逻辑,以确保每个步骤的 rect 都能正确获取或处理错误情况。

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)
    }
  }
}

243-249: LGTM! 但是请验证函数的使用。

代码更改已批准。

不过,请确保所有对 watch 函数的调用都匹配新的逻辑。

Verification successful

LGTM! 但是请验证函数的使用。

代码更改已批准。没有发现其他对 props.modelValuewatch 调用。

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all function calls to `watch` match the new logic.

# Test: Search for the function usage. Expect: Only occurrences of the new logic.
rg --type vue -A 5 $'watch'

Length of output: 54


Script:

#!/bin/bash
# Description: Verify all function calls to `watch` match the new logic.

# Find all .vue files and search for the watch function within them
fd -e vue -x rg 'watch' {}

Length of output: 9121


Script:

#!/bin/bash
# Description: Verify all function calls to `watch` match the new logic.

# Find all .vue files and search for watch functions that observe props.modelValue
fd -e vue -x rg 'watch\(\(\) => props\.modelValue' {}

Length of output: 57


Script:

#!/bin/bash
# Description: Verify all function calls to `watch` match the new logic.

# Find all .vue files and search for watch functions that observe props
fd -e vue -x rg 'watch\((\(\) => props' {}

Length of output: 98286


Script:

#!/bin/bash
# Description: Verify all function calls to `watch` match the new logic.

# Find all .vue files and search for watch functions that observe props
fd -e vue -x rg 'watch\(\(\) => props' {}

Length of output: 136

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Tour 无法定位步骤,change事件获取步骤索引不对
2 participants