Skip to content

Conversation

shenjunjian
Copy link
Collaborator

@shenjunjian shenjunjian commented Feb 14, 2025

…the right displayText

PR

修复 select 组件单选,只读时, state.selected.state对象是空的object, 造成无法取到正确的label值

PR Checklist

Please check if your PR fulfills the following requirements:

  • The commit message follows our Commit Message Guidelines
  • Tests for the changes have been added (for bug fixes / features)
  • Docs have been added / updated (for bug fixes / features)

PR Type

What kind of change does this PR introduce?

  • Bugfix
  • Feature
  • Code style update (formatting, local variables)
  • Refactoring (no functional changes, no api changes)
  • Build related changes
  • CI related changes
  • Documentation content changes
  • Other... Please describe:

What is the current behavior?

Issue Number: N/A

What is the new behavior?

Does this PR introduce a breaking change?

  • Yes
  • No

Other information

Summary by CodeRabbit

  • New Features
    • Enhanced interactive display elements, including dynamic icons and tag visuals for a more intuitive interface.
    • Improved responsiveness to data changes for smoother, real-time updates.
    • Introduced new options for resetting search inputs and managing display states, streamlining user interactions.

Copy link

coderabbitai bot commented Feb 14, 2025

Walkthrough

The changes update the packages/renderless/src/select/vue.ts file. New computed properties (computedGetIcon, computedGetTagType, computedShowTagText, computedCurrentSizeMap) and API methods (clearSearchText, clearNoMatchValue, isTagClosable) have been introduced. The state initialization now includes these properties, and watchers in the addWatch function have been modified to react to changes in gridData and treeData. Additionally, optional chaining has been applied when accessing currentLabel to improve robustness.

Changes

File Change Summary
packages/.../vue.ts Added computed properties (computedGetIcon, computedGetTagType, computedShowTagText, computedCurrentSizeMap) and API methods (clearSearchText, clearNoMatchValue, isTagClosable); updated state initialization & watchers with optional chaining and reactivity for gridData/treeData.

Sequence Diagram(s)

sequenceDiagram
    participant C as Component
    participant S as State
    participant CP as ComputedProps
    participant A as API
    participant W as Watchers

    C->>S: Call initState
    S->>CP: Compute properties (icon, tag type, text, size map)
    CP->>A: Assign computed methods to API (including clear & closable methods)
    A-->>C: Exposed API methods for external use
    W->>S: Monitor gridData/treeData changes
    S->>CP: Recompute properties on data update
Loading

Possibly related PRs

Suggested labels

bug

Suggested reviewers

  • zzcr

Poem

I'm a little rabbit with code in my paws,
Hopping through functions and computed clauses,
New getters and watchers make the module sing,
Like carrots of logic in early spring,
API methods bloom in a field so bright,
Leaping over bugs with delight! 🐇✨

Warning

There were issues while running some tools. Please review the errors and either fix the tool’s configuration or disable the tool if it’s a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

packages/renderless/src/select/vue.ts

Oops! Something went wrong! :(

ESLint: 8.57.1

ESLint couldn't find the plugin "eslint-plugin-vue".

(The package "eslint-plugin-vue" was not found when loaded as a Node module from the directory "".)

It's likely that the plugin isn't installed correctly. Try reinstalling by running the following:

npm install eslint-plugin-vue@latest --save-dev

The plugin "eslint-plugin-vue" was referenced from the config file in ".eslintrc.js » @antfu/eslint-config » @antfu/eslint-config-vue".

If you still can't figure out the problem, please stop by https://eslint.org/chat/help to chat with the team.

✨ Finishing Touches
  • 📝 Generate Docstrings (Beta)

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>, please review it.
    • 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 gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @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 using 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 generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

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.

@github-actions github-actions bot added the bug Something isn't working label Feb 14, 2025
Copy link

Walkthrough

修复了 select 组件在单选和只读状态下,state.selected.state 对象为空的问题,导致无法获取正确的标签值。通过调整返回逻辑,确保在不同状态下能够正确获取 currentLabellabel

Changes

文件 摘要
packages/renderless/src/select/vue.ts 修复了 state.selected.state 为空时无法获取正确标签的问题,调整了返回逻辑以确保正确性。

? state.selected.state.currentLabel
: state.selected.currentLabel || state.selected.label) || ''
)
return state.selected.state?.currentLabel || state.selected.currentLabel || state.selected.label || ''

Choose a reason for hiding this comment

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

The use of optional chaining (?.) is a good approach here to safely access currentLabel from state.selected.state. This change ensures that if state.selected.state is undefined, it won't cause an error, and the code will continue to check state.selected.currentLabel and state.selected.label. This effectively fixes the issue where state.selected.state could be an empty object.

@shenjunjian shenjunjian changed the title fix(select): fix state.selected.state is empty object, and can't get … fix(select): [select] fix state.selected.state is empty object, and can't get the right displayText Feb 14, 2025
@Issues-translate-bot
Copy link

Bot detected the issue body's language is not English, translate it automatically.


Walkthrough

Fixed an issue where the state.selected.state object is empty in the select component in both the single-select and read-only states, resulting in the failure to obtain the correct label value. By adjusting the return logic, ensure that currentLabel or label can be obtained correctly in different states.

Changes

File Summary
packages/renderless/src/select/vue.ts Fixed the issue where the correct label could not be obtained when state.selected.state is empty, and adjusted the return logic to ensure correctness.

Copy link

[e2e-test-warn]
The component to be tested is missing.

The title of the Pull request should look like "fix(vue-renderless): [action-menu, alert] fix xxx bug".

Please make sure you've read our contributing guide

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

🔭 Outside diff range comments (2)
packages/renderless/src/select/vue.ts (2)

434-440: 🛠️ Refactor suggestion

Consider adding error handling for edge cases.

The new API methods should include error handling for edge cases, especially for clearNoMatchValue which interacts with props and emit.

-    clearNoMatchValue: clearNoMatchValue({ props, emit }),
+    clearNoMatchValue: clearNoMatchValue({ props, emit, state }) {
+      try {
+        if (props.multiple) {
+          emit('update:modelValue', [])
+        } else {
+          emit('update:modelValue', '')
+        }
+        state.query = ''
+      } catch (error) {
+        console.error('Failed to clear no-match value:', error)
+      }
+    },

595-601: 💡 Verification agent

🧩 Analysis chain

Verify the immediate flag for grid and tree data watchers.

The watchers for gridData and treeData might need the immediate flag to handle initial values correctly, similar to other watchers in the file.

   if (props.renderType === 'grid' && !props.optimization) {
-    watch(() => state.gridData, api.setSelected, { immediate: true })
+    watch(() => state.gridData, api.setSelected, { immediate: true, deep: true })
   }

   if (props.renderType === 'tree' && !props.optimization) {
-    watch(() => state.treeData, api.setSelected, { immediate: true })
+    watch(() => state.treeData, api.setSelected, { immediate: true, deep: true })
   }

Let's verify if the watchers need deep observation:


🏁 Script executed:

#!/bin/bash
# Search for nested data structures in gridData and treeData
ast-grep --pattern 'state.gridData = $_' -l typescript
ast-grep --pattern 'state.treeData = $_' -l typescript

Length of output: 777


Action Required: Update Watchers to Include Deep Observation

The verification confirms that both gridData and treeData are assigned nested data structures in various parts of the codebase. To ensure that changes in nested properties trigger the watchers, please update the watchers in packages/renderless/src/select/vue.ts to include the deep: true flag:

  • Location: packages/renderless/src/select/vue.ts (Lines 595-601)
  • Change: Update the watchers so that they use { immediate: true, deep: true }, as shown in the diff snippet below.
   if (props.renderType === 'grid' && !props.optimization) {
-    watch(() => state.gridData, api.setSelected, { immediate: true })
+    watch(() => state.gridData, api.setSelected, { immediate: true, deep: true })
   }

   if (props.renderType === 'tree' && !props.optimization) {
-    watch(() => state.treeData, api.setSelected, { immediate: true })
+    watch(() => state.treeData, api.setSelected, { immediate: true, deep: true })
   }

The ast-grep results confirm that these state properties are updated in multiple files (e.g., assignments in index.ts and other related components), supporting the addition of deep observation to track nested changes.

🧹 Nitpick comments (1)
packages/renderless/src/select/vue.ts (1)

266-276: Consider memoizing computed properties for better performance.

The new computed properties (getIcon, getTagType, isSelectAll, currentSizeMap) might benefit from memoization to prevent unnecessary recalculations, especially in components that re-render frequently.

-    getIcon: computed(() => api.computedGetIcon()),
+    getIcon: computed(() => {
+      const result = api.computedGetIcon()
+      return () => result
+    }),
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 441c376 and 73f2b88.

📒 Files selected for processing (1)
  • packages/renderless/src/select/vue.ts (1 hunks)
🔇 Additional comments (1)
packages/renderless/src/select/vue.ts (1)

254-254: LGTM! Improved robustness with optional chaining.

The addition of optional chaining operator (?.) for accessing currentLabel makes the code more resilient to undefined states.

@zzcr zzcr merged commit c851785 into opentiny:dev Feb 17, 2025
13 of 16 checks passed
@shenjunjian shenjunjian deleted the fix-select-display-text branch March 10, 2025 11:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants