Giter VIP home page Giter VIP logo

Comments (3)

diegohaz avatar diegohaz commented on May 27, 2024 2

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.

StallionV avatar StallionV commented on May 27, 2024

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.

StallionV avatar StallionV commented on May 27, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.