Comments (3)
FYI: I've been working on a solution for this issue. The working in progress is here: https://github.com/diegohaz/constate/tree/feat/multiple-contexts
The API looks like this:
// renamed to createContextHook, but no breaking changes, since it's default export
import createContextHook from "constate";
function useCounter() {
const [count, setCount] = useState(0);
const increment = () => setCount(count + 1);
return { count, increment };
}
const [Provider, useCount, useIncrement] = createContextHook(
useCounter,
value => value.count, // becomes useCount
value => value.increment // becomes useIncrement
);
There are no breaking changes. The current API still works! All these APIs are supported:
const useCounterContext = createContextHook(useCounter);
<useCounterContext.Provider />
const useCounterContext = createContextHook(useCounter, value => [value.count]);
<useCounterContext.Provider />
const [CounterProvider, useCounterContext] = createContextHook(useCounter);
<CounterProvider />
<useCounterContext.Provider />
const [CounterProvider, useCount] = createContextHook(useCounter, value => value.count);
<CounterProvider />
from constate.
I also tried referring to the solution you proposed for
#82 (comment)
Which is createMemoInputs
/ /re-render consumers only when value.count changes
const useCounterContext = createUseContext(useCounter, value => [value.count]);
function useCounter() {
const [count, setCount] = useState(0);
const increment = () => setCount(count + 1);
return { count, increment };
}
But here I have another component Like
where what I only want is to increment the the counter by 1 automatically every time it loads.
But the below code now load the Like
component twice.
function Like() {
const { increment } = useCounterContext()
useEffect(() => {
increment() //We are not using count only calling increment
}, []) //You can also use [increment] to avoid warning in console
return "Like Component"
}
export default Like
The component loads once on the first load and the second due to it being re-rendered since increment
was called.
Remove the increment
call and it loads only once
This is something that should be avoided, else will be a major perf issue with the library.
Imagine if there are API calls, we don't want same calls going twice.
Please help me understand if I am missing something
from constate.
I see that you have renamed the API which is a step towards addressing this issue.
Any tentative timelines on it.
I would also recommend adding the example similar to the LIKE
one I explained above so that users can make optimized use of this library in the right way and also understand how state variables and functions can be worked with.
Again thanks for getting back, I was just hoping it was being maintained. Your comment today puts me at ease 👍
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.