Giter VIP home page Giter VIP logo

Comments (10)

diegohaz avatar diegohaz commented on May 28, 2024 8

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.

diegohaz avatar diegohaz commented on May 28, 2024 1

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.

diegohaz avatar diegohaz commented on May 28, 2024 1

Maybe something like recompose#nest would be better:

export default nest(MainCounter.Provider, DynamicImportedRoutePage);

from constate.

zheeeng avatar zheeeng commented on May 28, 2024

React hook is designed as a replacement for recompose, I think.

from constate.

zheeeng avatar zheeeng commented on May 28, 2024

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.

diegohaz avatar diegohaz commented on May 28, 2024

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.

diegohaz avatar diegohaz commented on May 28, 2024

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.

zheeeng avatar zheeeng commented on May 28, 2024

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.

awmleer avatar awmleer commented on May 28, 2024

Maybe this package can help: with-wrapper

from constate.

diegohaz avatar diegohaz commented on May 28, 2024

Closing this issue as there are enough alternatives. I recommend this one: #61 (comment)

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.