Comments (10)
For now, you can just create an utility function in your app:
const nest = (...components) => props =>
components.reduceRight(
(children, Current) => <Current {...props}>{children}</Current>,
props.children
);
I'm gonna use this too.
from constate.
Hey @zheeeng.
I agree that this is annoying. I've also been through that.
But I think this solution could be misleading. One could think that enhancing a component with withProvider
would allow it to access a sort of container's global state, which obviously doesn't work. I guess it would be really common because people are used to this behavior (redux connect
, withTheme
etc.).
In other words, people would just do withProvider(MainCounter)(Count)
and withProvider(MainCounter)(Button)
and expect both components share the same state.
from constate.
Maybe something like recompose#nest
would be better:
export default nest(MainCounter.Provider, DynamicImportedRoutePage);
from constate.
React hook is designed as a replacement for recompose, I think.
from constate.
I'm from material-ui
, and its withTheme
seems clarified ppl that the theme context is derived from the nearest ThemeProvider, not the global theme.
from constate.
I'm from material-ui, and its withTheme seems clarified ppl that the theme context is derived from the nearest ThemeProvider, not the global theme.
Yeah! By "global state" I meant a root Provider as the nearest one. withSomething
will usually wrap the component with a consumer. But withProvider
would wrap the component with a new instance of the container's Provider with its own state. That's why I think it might be confusing.
from constate.
I've seen that it's really hard for people to understand how React Providers work.
import React, { useState } from "react";
import createContainer from "constate";
function useCounter({ initialCount = 0 }) {
const [count, setCount] = useState(initialCount);
const increment = () => setCount(count + 1);
return { count, increment };
}
const CounterContainer = createContainer(useCounter);
function App() {
return (
<CounterContainer.Provider initialCount={2}>
<Foo />
</CounterContainer.Provider>
<CounterContainer.Provider initialCount={10}>
<Bar />
</CounterContainer.Provider>
);
}
In the example above, Foo
and Bar
will access different states even though they have the same shape ({ count, increment }
). Calling increment
from Foo
will have no effect on the state consumed by Bar
.
Note: I'm not saying that you don't understand that. I'm just leaving it here because I know people will come to this issue with this confusion.
from constate.
Yeah, I know it an idea about fractal context. I'm seeking a convenient way to consume the context immediately in the current component(the DynamicImportedRoutePage). Otherwise, I have to:
function DynamicImportedRoutePage () {
return <MainCounter.Provider><AntoherComponentConsumeContextAndRenderCountAndButton /></MainCounter.Provider>
}
The HOC is used to wrap the current Componet with container's provider (for hoisting context to its component scope).
from constate.
Maybe this package can help: with-wrapper
from constate.
Closing this issue as there are enough alternatives. I recommend this one: #61 (comment)
from constate.
Related Issues (20)
- Possible to do lazy splitting at time of hook usage? HOT 4
- Limit to the number of split values? HOT 2
- Accept generics in hook HOT 8
- Splitting ContextProvider definition from context value using part HOT 6
- Simple Package HOT 2
- Better Typescript types HOT 5
- Allow to invoke useCounter hook with arguments HOT 2
- Is it possible to have a ref to the Provider? HOT 5
- Demo for Complex Set State HOT 2
- How can i use overloading with constate? HOT 5
- How to pass props between nested providers HOT 1
- Mock initial state
- Types are not inferred properly HOT 6
- React Fast Refresh doesn't work on Constate side HOT 5
- Clarify that hooks are available in selector function HOT 4
- How to create selectors in order to listen on multiple changes in context's state? HOT 2
- When the selector returns an object, all components are re-rendered. HOT 2
- Migrate to GitHub actions
- How to access underling React.Context
- does constate support nested dynamic providers? HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from constate.