Minor typo correction:

" I know if my components use *-nr! functions because all of my state
access is local to the function"

That was meant to say "local to the component".

On Mon, 15 Dec 2014 08:54 Daniel Kersten <dkers...@gmail.com> wrote:

> I always communicate values to children to keep them decoupled from their
> parents. I don't think there's any technical reasons to avoided your
> approach, but I don't like components relying directly on the structure of
> other components.
>
> I also try to represent the bulk of my state in the cursor and try to keep
> a nice pure data-in-dom-out thing going, but this is often not possible
> without polluting app state with components' transient state. But this does
> mean that I don't need to pass a lot of state to children and can do so
> using :init-state and :state. For writable data I use callbacks or
> core.async channels.
>
> As for calling get-state from a handler, this should always work as long
> as you're careful that the handier cannot outlive the owner. I usually
> don't call get-state in a handler/callback but instead use render-state
> with destructuring and then have the event handlers close over the values.
> This works as long as the state is never set with the *-nr! functions as
> any time the state changes, the component rerenders and updates my
> handlers. If this isn't the case (eg because you do use *-nr! functions
> [1]) and you need up to date state, then I see nothing wrong with calling
> get-state.
>
> [1] This is another reason I personally prefer not to pass the parents
> owner: I know if my components use *-nr! functions because all of my state
> access is local to the function. If I pass the owner to other components
> then I need to be aware of how they access my components state too. If your
> app is large and/or you work in a team, this only gets harder.
>
> At the end of the day, though, use whichever approach works best for you.
>
> Re: waste, because of the immutable data structures and structural sharing
> there should be less wastage than it looks.
>
> Re: reading cursors in handlers - this shouldn't be a problem as long as
> you deref them.
> The only thing to be aware of is that by default only maps and vectors get
> turned into cursors, so if you eg access a map field and it contains a
> vector and your handler closes over that, then you must deref it (and you
> will get up to date data), but if the map field instead contains a value
> like an integer or string, then it's not a cursor and you don't deref it
> (and the value might be stale by the time the handler is called).
> Once I internalised this, I stopped getting cursor errors.
>
> On Mon, 15 Dec 2014 08:29 Andrew <andrew...@gmail.com> wrote:
>
>> I've been using get-state in my event handlers without problem, but I'm
>> wondering if I should be concerned by not treating these in the same way I
>> treat app-state cursors, which generally should not be read in an event
>> handler, correct? That is, while update! and transact! are usually fine in
>> an event handler since the data is not read, get-state obviously does read
>> data, so is it a similar concern?
>>
>> I often pass a parent component down through children so they can read
>> certain aspects of the parent's state, hence why using get-state directly.
>> While I pretty much always get Om errors when I try to read an app-state
>> cursor in a handler, I never get them when reading local state. So I wonder
>> now if I'm getting a false sense of security with this habit if it is not
>> advised.
>>
>> I suppose an alternative would be to pass actual parent state values down
>> so they are mirrored among children, rather than passing the parent owner
>> itself. This would allow an event handler access to values without calling
>> get-state on another component. But it seems wasteful to do so.
>>
>> --
>> 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.

Reply via email to