fix(tree-select): [tree-select] fix double binding cannot work normally
PR
PR Checklist
Please check if your PR fulfills the following requirements:
- [x] The commit message follows our Commit Message Guidelines
- [x] 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?
- [x] 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: #3167
What is the new behavior?
value changing effects tree-select correctly
Does this PR introduce a breaking change?
- [ ] Yes
- [x] No
Other information
Summary by CodeRabbit
- New Features
- Enhanced tree selection behavior with more accurate updates in both multiple and single selection modes.
- Introduced reactive updates that synchronize the displayed selection with underlying changes.
- Style
- Refined radio button styling for improved visual consistency.
- Tests
- Added tests to validate reactive updates in the tree selection component.
Walkthrough
The changes update the tree-select component’s functionality and styling. The primary function previously exported as mounted is now renamed to updateSelectedData with enhanced logic to update selected data based on whether multiple selections are enabled. In addition, a new mounted export is added to invoke the updated function. The watcher on props.modelValue now triggers updates in the Vue module. Additionally, style selectors have been refined in the theme and tree-node files, and a new test suite has been introduced for the TreeSelect component in PC mode.
Changes
| File(s) | Change Summary |
|---|---|
packages/renderless/.../tree-select/index.tspackages/renderless/.../tree-select/vue.ts |
Renamed the mounted export to updateSelectedData with updated logic for handling selected data and tree references; modified function call parameters; added a watcher on props.modelValue to trigger data updates. |
packages/theme/.../tree/index.lesspackages/vue/.../tree/src/tree-node.vue |
Modified CSS selectors and added a specific class attribute (tiny-tree-node__content-left__radio) for enhanced styling targeting. |
packages/vue/.../tree-select/__tests__/tree-select.test.tsx |
Introduced a new test suite for the TreeSelect component in PC mode to verify reactive updates using the v-model. |
Sequence Diagram(s)
sequenceDiagram
participant W as Watcher (props.modelValue)
participant U as updateSelectedData
participant API as API Object
participant BS as baseSelectRef
participant TR as treeRef
W->>U: Trigger updateSelectedData update
alt Multiple Selection Enabled
U->>API: getPluginOption & getCheckedData
U->>BS: Update selected data
U->>TR: setCheckedKeys with initial node data
else Single Selection
U->>API: getPluginOption (single data retrieval)
U->>BS: Update selected data
U->>TR: setCurrentKey with selected data value
end
Possibly related PRs
- opentiny/tiny-vue#2522: Introduces the
updateSelectedDatafunction and modifies themountedfunction for the base-select component. - opentiny/tiny-vue#2535: Modifies how data is passed to
updateSelectedDatain the context of the tiny-tree component. - opentiny/tiny-vue#1835: Enhances state management in the select component with changes related to the
mounted/updateSelectedDatafunctions.
Suggested labels
bug
Suggested reviewers
- zzcr
Poem
I'm a little rabbit with a nimble hop,
Updating tree nodes without a single flop.
I tweak the code with a twitch of my nose,
Ensuring selections bloom like a garden of code.
Hop along, dear coder, where bugs dare not stop! 🐇
[!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/tree-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-devThe 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.
packages/vue/src/tree-select/__tests__/tree-select.test.tsx
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-devThe 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.
packages/vue/src/tree/src/tree-node.vue
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-devThe 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.
- 1 others
📜 Recent review details
Configuration used: CodeRabbit UI Review profile: CHILL Plan: Pro
📥 Commits
Reviewing files that changed from the base of the PR and between 9cf817a6e261fd868e0e6d364eef7ca0bab28f4d and bd3c9717927cf18524b847233f3f6abdce6e84d7.
📒 Files selected for processing (5)
packages/renderless/src/tree-select/index.ts(3 hunks)packages/renderless/src/tree-select/vue.ts(3 hunks)packages/theme/src/tree/index.less(1 hunks)packages/vue/src/tree-select/__tests__/tree-select.test.tsx(1 hunks)packages/vue/src/tree/src/tree-node.vue(1 hunks)
🧰 Additional context used
🧬 Code Definitions (1)
packages/renderless/src/tree-select/vue.ts (1)
packages/renderless/src/tree-select/index.ts (2)
mounted(177-180)updateSelectedData(133-175)
🔇 Additional comments (8)
packages/theme/src/tree/index.less (1)
463-467: CSS selector is now properly structured for radio buttons in tree nodes.The new CSS selector specifically targets radio buttons inside the tree node with a more precise class name, which aligns with the class added to the radio component in the tree-node.vue file. This targeted approach improves specificity and ensures the styles are correctly applied.
packages/vue/src/tree/src/tree-node.vue (1)
117-118: Added class for proper CSS targeting of radio buttons.The addition of the
tiny-tree-node__content-left__radioclass to the radio component ensures proper styling via the corresponding CSS selector in the tree's LESS file. This class provides the specificity needed for styles to be applied correctly.packages/renderless/src/tree-select/vue.ts (3)
1-10: Correctly imported the updateSelectedData function.The import statement now includes the
updateSelectedDatafunction which is needed for updating the component's internal state when the model value changes externally.
33-34: Updated mounted function and added updateSelectedData to API.The
mountedfunction now only requires theapiparameter since it simply callsapi.updateSelectedData(). The explicit addition ofupdateSelectedDatato the API object makes it available to be called from watchers and other component methods.
44-45: Added crucial watcher for modelValue changes.This watcher is the key fix for the double binding issue. It ensures that when the model value changes externally, the component's internal state is updated to reflect the new selection, making the two-way binding work correctly.
packages/vue/src/tree-select/__tests__/tree-select.test.tsx (1)
1-60: Added test case to verify double binding functionality.This test confirms that when the model value is updated externally (changing
treeSelectValue.valuefrom 10 to 9), the tree-select component correctly updates its UI to reflect the new selection. The test validates that the fix for the double binding issue is working properly.packages/renderless/src/tree-select/index.ts (2)
133-175: Good refactor to improve clarity and fix the double binding issue.Renaming this function from
mountedtoupdateSelectedDatamakes the code more self-descriptive and better reflects its purpose. The added logic for settingsetCheckedKeysandsetCurrentKeyon the tree reference ensures that the component's visual state is properly synchronized with its internal state, which directly addresses the double binding issue mentioned in the PR objectives.
177-180: Clean approach to maintain lifecycle functionality while leveraging refactored code.This is a good implementation pattern that separates concerns - the original
mountedlifecycle hook now simply delegates to the more descriptively namedupdateSelectedDatafunction. This preserves the original API while improving the internal structure.
✨ Finishing Touches
- [ ] 📝 Generate Docstrings
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
🪧 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
@coderabbitaiin 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
@coderabbitaiin 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 pauseto pause the reviews on a PR.@coderabbitai resumeto resume the paused reviews.@coderabbitai reviewto trigger an incremental review. This is useful when automatic reviews are disabled for the repository.@coderabbitai full reviewto do a full review from scratch and review all the files again.@coderabbitai summaryto regenerate the summary of the PR.@coderabbitai generate docstringsto generate docstrings for this PR.@coderabbitai resolveresolve all the CodeRabbit review comments.@coderabbitai planto trigger planning for file edits and PR creation.@coderabbitai configurationto show the current CodeRabbit configuration for the repository.@coderabbitai helpto get help.
Other keywords and placeholders
- Add
@coderabbitai ignoreanywhere in the PR description to prevent this PR from being reviewed. - Add
@coderabbitai summaryto generate the high-level summary at a specific location in the PR description. - Add
@coderabbitaianywhere in the PR title to generate the title automatically.
CodeRabbit Configuration File (.coderabbit.yaml)
- You can programmatically configure CodeRabbit by adding a
.coderabbit.yamlfile 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.
@gweesin 代码有冲突哈,可以解决下哈
Bot detected the issue body's language is not English, translate it automatically.
@gweesin The code has conflicts, it can be resolved