feat(react-utilities): add composeComponent helper to simplify the component composition#35881
Closed
dmytrokirpa wants to merge 3 commits intomicrosoft:masterfrom
Closed
Conversation
…mponent composition
📊 Bundle size report✅ No changes found |
|
Pull request demo site: URL |
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.
Summary
Adds a
composeComponenthelper to@fluentui/react-utilitiesthat encapsulates the standard Fluent UI v9 component wiring pattern (useState→useContextValues→useStyles→render) into a single, strongly-typed factory call.Previous Behavior
Every Fluent UI v9 component had to manually write a
React.forwardRefwrapper that:useStatehook to derive internal state from props and the forwarded ref.useContextValueshook to derive context values from state.useStyleshook to apply CSS-in-JS class names by mutating state.renderfunction with state (and context values) to produce JSX.This boilerplate was repeated across every component with no enforced structure or shared abstraction:
New Behavior
composeComponentcaptures the four-step lifecycle as named options and produces a correctly typedForwardRefComponent:Key properties:
useState → useContextValues → useStyles → renderis guaranteed by the implementation; consumers cannot reorder hooks by mistake.useStylesis optional, an unstyled variant can share the sameuseStateandrenderwithout any extra wiring:Element,Props,State, andContextValuestype parameters are supported for consumers that need precise ref types or context shapes.displayNamealways set — the returned component hasdisplayNameassigned, so DevTools and error messages are always readable.Files changed
packages/react-components/react-utilities/src/compose/composeComponent.tsxcomposeComponentfunction andComposeComponentOptionstypepackages/react-components/react-utilities/src/compose/index.tscomposeComponentandComposeComponentOptionspackages/react-components/react-utilities/src/compose/composeComponent.test.tsxuseStyles,useContextValues, generic types) + integration tests for styled/unstyled variant patternRelated Issue(s)