Hi Daniel, If you have a limited number of components you can unify them into one kind of a component.
Here is a self contained example that unifies Counter and RandomGif and then uses them in a single list. https://gist.github.com/pdamoc/aef6306a9001de109aeece37e5627d06 On Tue, May 17, 2016 at 3:47 PM, Daniel Kwiecinski < [email protected]> wrote: > So let me expand my scenario a little bit. Lets assume that the > CounterList component is very feature heavy. It makes lots of work to > layout its children, manages drag to sort or whatever fancy stuff you can > imagine. Now in my app I have many instances of usage of CounterList and I > want to apply the complex behaviour not only to counters but also to gif > and to mixed counters with gifs and many many other possible configurations > (think in hundreds). I don't really want to implement dedicated > CounterList, GifList, 2GifsWith3CountersList and other few hundreds > SomethingBlaBlaList. > Is it possible in elm at all? If yes how so? > > P.S. It is not imaginary question. I try to port existing application > implemented in Re-Frame (ClojureScript framework) in which this scenario is > trivial. > > > On Tuesday, 17 May 2016 13:33:27 UTC+1, Wil C wrote: >> >> Daniel, >> >> I think normally, you don't. I think the constraint here is that you need >> to explicitly set the types of each of the sub-components for every >> component that you make for a page. In the example that you give, you'd >> actually need to create 4 types of components: TopLevel, Counter, >> CounterList, and Gif. >> >> TopLevel component would include CounterList and Gif. And then >> CounterList would contain Counters. It is CounterList's job to dynamically >> keep track of the number of Counters. That way, you don't need a generic >> component to contain an unknown number of things with unknown types. And >> then if those components need to talk to each other (Like once you add 5 or >> more counters, you see a funny cat gif), I believe you can send messages >> through Cmds (in 0.17) or Effects (in <0.17). >> >> With the hierarchical thinking of laying out components, I found that >> Thinking >> in React <https://facebook.github.io/react/docs/thinking-in-react.html> >> helps. >> >> If you find that you really need the flexibility of having different >> components in a container, it's doable. But it comes at a cost. Generally, >> if you're making a web app of some sort, it's not needed. I cover entity >> component systems recently in another thread, and it's for games. >> >> https://groups.google.com/forum/#!topic/elm-discuss/c9MhBzVPbr8 >> >> Wil >> >> On Tuesday, May 17, 2016 at 5:13:56 AM UTC-7, Daniel Kwiecinski wrote: >>> >>> Hi Elmers, >>> >>> >>> Here is my scenario. Say I have Main.elm which defines main view form my >>> application. I also have bunch of other components (with their >>> corresponding model and message types) say Counter and Gif. >>> ( >>> https://github.com/evancz/elm-architecture-tutorial/blob/master/nesting/Gif.elm >>> ) >>> ( >>> https://github.com/evancz/elm-architecture-tutorial/blob/master/nesting/Counter.elm >>> ) >>> Now I'd like to create new generic component which as a parameter >>> (initial value of its model?) takes list of any type of component (say two >>> counters, then one gif and another three counters) and wraps them into some >>> decorating html. >>> The scenario serves as a illustration of the question, how do I >>> implement components which can wrap lists of arbitrary component types. >>> >>> -- >>> Regards, >>> Daniel >>> >> -- > You received this message because you are subscribed to the Google Groups > "Elm Discuss" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- There is NO FATE, we are the creators. blog: http://damoc.ro/ -- You received this message because you are subscribed to the Google Groups "Elm Discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
