If this approach suits you better, fine. Remember, this approach is coming
from the React.js world, where everything is mutable and where there's no
committment to a particular way of passing data/events. For my current
projects, we indeed encapsulated both markup and behaviour, but it was hard
sometimes to make it reusable without changing/hacking it. We didn't use a
global method for sharing state like Flux, so it may explain why.



Khalid aka DjebbZ
@Dj3bbZ

On Fri, Mar 27, 2015 at 6:45 PM, Daniel Kersten <dkers...@gmail.com> wrote:

> Marc, can you tell us a little more about the approach your taking?
>
> On Fri, 27 Mar 2015 at 17:43 Marc Fawzi <marc.fa...@gmail.com> wrote:
>
>> Yeah but then what are you really reusing? I have components that have
>> sophisticated behavior... sharing just the markup and styles is of limited
>> value since what I want to share in effect is the smart components, which
>> is why I had settled on components encapsulating behavior as a pattern...
>> works better for me to share the whole component (with its behavior) rather
>> than just the dumb part....
>>
>> On Fri, Mar 27, 2015 at 10:25 AM, Khalid Jebbari <
>> khalid.jebb...@gmail.com> wrote:
>>
>>> Yes, dumb components don't encapsulate beahvior. Indeed if you generic
>>> behaviour you need as someone proposed to push a generic event, and the app
>>> handles it specifically.
>>>
>>> Khalid aka DjebbZ
>>> @Dj3bbZ
>>>
>>> On Fri, Mar 27, 2015 at 4:45 PM, Jamie Orchard-Hays <jamie...@gmail.com>
>>> wrote:
>>>
>>>> Good articles. Thanks, Mike. In my apps I think of them as "generic"
>>>> and "specific", or something like that. IOW, I want some generic views that
>>>> are dumb and know nothing about the app and can be used where ever I need
>>>> them. They get composed into specific views.
>>>>
>>>> Jamie
>>>>
>>>>
>>>> On Mar 27, 2015, at 10:12 AM, Mike Thompson <m.l.thompson...@gmail.com>
>>>> wrote:
>>>>
>>>> > On Saturday, March 28, 2015 at 12:58:17 AM UTC+11, Khalid Jebbari
>>>> wrote:
>>>> >> On Friday, March 27, 2015 at 2:39:37 PM UTC+1, Jamie Orchard-Hays
>>>> wrote:
>>>> >>> Does it make sense to pass the reusable component's context as an
>>>> argument to it? ie,
>>>> >>>
>>>> >>> (defn ReusableComponent [some-context] .... )
>>>> >>>
>>>> >>> Jamie
>>>> >>>
>>>> >>> On Mar 27, 2015, at 8:54 AM, Colin Yates <colin.ya...@gmail.com>
>>>> wrote:
>>>> >>>
>>>> >>>> In re-frame event dispatching is handled by (dispatch
>>>> [:discriminator detail]). A corresponding (register-handler :discriminator
>>>> (fn [db [_ detail]]) then reacts to that dispatched event.
>>>> >>>>
>>>> >>>> My question is how are people managing this with re-usable
>>>> components? For example, I have a tree and when selecting a node in that
>>>> tree something should happen. But this is where it gets all polymorphic as
>>>> _what_ happens depends on the client who instantiated the tree. I can see
>>>> the following ways forward:
>>>> >>>>
>>>> >>>> - tree is configured with a 'context' key which is combined with
>>>> the discriminator so rather than the tree emitting :node-selected it emits
>>>> :consumer-a-node-selected. Consumer a can then handle
>>>> consumer-a-node-selected and consumer b can handle (go on, guess)
>>>> consumer-b-node-selected
>>>> >>>> - a variation on the above involving writing your own dispatching
>>>> logic...
>>>> >>>> - tree doesn't use dispatch as the event bus, rather it takes in
>>>> an instance of a Protocol:
>>>> >>>> IRespondToTree
>>>> >>>> (on-node-select [this node])
>>>> >>>> - tree is parameterised with a map of fns {:node-selected-fn ...}
>>>> etc.
>>>> >>>>
>>>> >>>> How would you all handle it? (I am leaning towards the first one).
>>>> >>>>
>>>> >>>> --
>>>> >>>> Note that posts from new members are moderated - please be patient
>>>> with your first post.
>>>> >>>> ---
>>>> >>>> You received this message because you are subscribed to the Google
>>>> Groups "ClojureScript" group.
>>>> >>>> To unsubscribe from this group and stop receiving emails from it,
>>>> send an email to clojurescript+unsubscr...@googlegroups.com.
>>>> >>>> To post to this group, send email to
>>>> clojurescript@googlegroups.com.
>>>> >>>> Visit this group at http://groups.google.com/group/clojurescript.
>>>> >>
>>>> >> Not sure I'm going to answer the question directly, since I've never
>>>> used re-frame, Reagent or Om. I'm just an experienced React.js developer
>>>> VERY interested with Clojure(Script).
>>>> >>
>>>> >> If you want reusable components, whatever wrapper you use around
>>>> React, here's the plan.
>>>> >>
>>>> >> You should create 2 types of components : dumb and smart. Dumb
>>>> components do 2 simple things : display stuff and handle input/events. The
>>>> way they handle should be agnostic to any kind of library and should use
>>>> only language-level feature. Functions. So the dumb component use function
>>>> it's been passed and call it with the input/event. The smart components
>>>> wrap dumb components and connect to the outside world with whatever your
>>>> stack uses (channels, events, ratoms, what not).
>>>> >>
>>>> >> This way your dumb components are always reusable, whatever
>>>> stack/project they're incorporated in. They can also be displayed in a
>>>> simple page for your graphics or HTML/CSS team to check their look. The
>>>> smart components handle whatever logic you want to put in them. So from a
>>>> stack/page/project to another, only the smart components change, no the
>>>> dumb ones. This keep UI consistent and separate concerns.
>>>> >>
>>>> >> Hope it's clear and helpful.
>>>> >
>>>> >
>>>> > I'm not sure how much this perspective applies to the Clojurescript
>>>> wrappings, but here are further references:
>>>> > https://medium.com/@learnreact/container-components-c0e67432e005
>>>> >
>>>> https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0
>>>> >
>>>> > --
>>>> > Mike
>>>> >
>>>> > --
>>>> > Note that posts from new members are moderated - please be patient
>>>> with your first post.
>>>> > ---
>>>> > You received this message because you are subscribed to the Google
>>>> Groups "ClojureScript" group.
>>>> > To unsubscribe from this group and stop receiving emails from it,
>>>> send an email to clojurescript+unsubscr...@googlegroups.com.
>>>> > To post to this group, send email to clojurescript@googlegroups.com.
>>>> > Visit this group at http://groups.google.com/group/clojurescript.
>>>>
>>>> --
>>>> Note that posts from new members are moderated - please be patient with
>>>> your first post.
>>>> ---
>>>> You received this message because you are subscribed to a topic in the
>>>> Google Groups "ClojureScript" group.
>>>> To unsubscribe from this topic, visit
>>>> https://groups.google.com/d/topic/clojurescript/WOGdUY79Xv4/unsubscribe
>>>> .
>>>> To unsubscribe from this group and all its topics, send an email to
>>>> clojurescript+unsubscr...@googlegroups.com.
>>>> To post to this group, send email to clojurescript@googlegroups.com.
>>>> Visit this group at http://groups.google.com/group/clojurescript.
>>>>
>>>
>>>  --
>>> Note that posts from new members are moderated - please be patient with
>>> your first post.
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "ClojureScript" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to clojurescript+unsubscr...@googlegroups.com.
>>> To post to this group, send email to clojurescript@googlegroups.com.
>>> Visit this group at http://groups.google.com/group/clojurescript.
>>>
>>
>>  --
>> Note that posts from new members are moderated - please be patient with
>> your first post.
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "ClojureScript" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to clojurescript+unsubscr...@googlegroups.com.
>> To post to this group, send email to clojurescript@googlegroups.com.
>> Visit this group at http://groups.google.com/group/clojurescript.
>>
>  --
> Note that posts from new members are moderated - please be patient with
> your first post.
> ---
> You received this message because you are subscribed to a topic in the
> Google Groups "ClojureScript" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/clojurescript/WOGdUY79Xv4/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> clojurescript+unsubscr...@googlegroups.com.
> To post to this group, send email to clojurescript@googlegroups.com.
> Visit this group at http://groups.google.com/group/clojurescript.
>

-- 
Note that posts from new members are moderated - please be patient with your 
first post.
--- 
You received this message because you are subscribed to the Google Groups 
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojurescript+unsubscr...@googlegroups.com.
To post to this group, send email to clojurescript@googlegroups.com.
Visit this group at http://groups.google.com/group/clojurescript.

Reply via email to