Refactor DynamicList and ReactUtil#10
Merged
Merged
Conversation
OutOfBears
approved these changes
Oct 28, 2025
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This pull request refactors the
DynamicListcomponent and its supporting utility to improve React element reconciliation, reduce unnecessary prop mutations, and prevent excessive re-rendering and potential loops. The main changes focus on only wrapping children flagged for removal, using shallow copies to preserve type information, and bailing out updates when no changes are detected.DynamicList reconciliation improvements:
DynamicListcomponent now only wraps children flagged for removal with removal props, rather than wrapping all children each render. This reduces unnecessary churn and prevents infinite update loops.React element copying strategy:
updateReactChildfunction inReactUtil.luanow performs a shallow copy of React element descriptors instead of a deep copy, preserving Luau's refined type information and avoiding issues with 'unknown' types for consumers.typefield after copying, as the shallow copy preserves all fields.