Is there a more efficient way to namespace the result of a series of HoCs than collecting parent props then spreading them back in? #358
Comments
Not sure it's more efficient but IMO more readable: const namespace = (ns, ...hocs) => compose(
withProps(props => ({ $parentProps: props })), // TODO $parentProps as symbol
...hocs,
mapProps(props => ({ [ns]: props, ...props.$parentProps }))
) |
Also nice idea, will try in my projects. cc @wuct |
I can't come up with other solution. Using Symbol looks good to me. |
Not sure if a module I wrote was helpful. Just put it to a repo Use it to rewrite the @cheapsteak's example will like below compose(
withProps({a: 10, b: 11, c: 12}),
composeWithScope(
withProps({a: 1, b: 2, c: 3}),
passProps(props => ({ namespace: props })),
),
)((props) => <pre>{JSON.stringify(props, null, ' ')}</pre>) Using
const consumeRoute = composeWithScope(
consumeProps({
location: propTypes.object,
match: propTypes.object,
history: propTypes.object,
}),
passProps(({ location, match }) => ({
path: location.pathname,
view: match.params.view,
id: match.params.id,
})),
passHandlers({
redirectToMenu: ({ history }) => () => history.push('/menu'),
}),
)
|
Problem with these solutions is that nesting namespace hocs breaks it, as they all depend on the same parentProps key. Using a symbol would work, except some hocs will not copy over symbols depending on how they pass props, so there is no guarantee your symbol will be accessible out the other side :( |
A way to make nesting work is to also pass a $parentPropsNestLevel prop that you increment and decrement at either end, and then your $parentProps becomes: $parentProps2, where 2 is the nesting level |
My final solution has a __scopes array that I simply push and pop to and from 👍 |
The same parentProps key shouldn't be an issue unless you need to access it you will end up with
|
Is there a more efficient way to namespace a series of HoCs than this? (credits to my friend @Jephuff for the below solution)
renders
Here's a pen: http://codepen.io/cheapsteak/pen/OmJWKZ?editors=0010
The text was updated successfully, but these errors were encountered: