This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2020-07-01
Channels
- # atom-editor (11)
- # babashka (25)
- # beginners (142)
- # boot (9)
- # calva (3)
- # cider (19)
- # clara (15)
- # clj-kondo (6)
- # cljs-dev (20)
- # clojars (11)
- # clojure (164)
- # clojure-dev (9)
- # clojure-europe (6)
- # clojure-italy (17)
- # clojure-nl (3)
- # clojure-spec (19)
- # clojure-sweden (10)
- # clojure-uk (23)
- # clojurescript (34)
- # code-reviews (31)
- # conjure (20)
- # cursive (14)
- # datomic (54)
- # emacs (1)
- # fulcro (51)
- # graalvm (24)
- # graphql (6)
- # helix (3)
- # jobs (3)
- # kaocha (1)
- # malli (2)
- # meander (15)
- # off-topic (81)
- # pathom (2)
- # re-frame (43)
- # reagent (26)
- # reitit (1)
- # releases (1)
- # sci (12)
- # shadow-cljs (29)
- # sql (22)
- # timbre (3)
- # tools-deps (15)
I am trying to do a fade-in animation with re-frame. I already have a fade-in-1s
css class that works. The problem is that I have a form like this:
[:div.fade-in-1s
[:h "Step description"]
[:p "Step contents"]
...]
This is part of a panel that will show several "steps", and I want the fade-in animation to play at every step transition.
However, I can only see my the fade-in animation when the first step is displayed. When I transition between steps, only the inner [:h] and [:p] are redrawn, but not the whole div (I assume this is re-frame being smart and diffing the HTML). How can I force the redraw of the whole div, so the fade-in animation is triggered?Hi @U70027S0N, may be you can set a new key at each refresh
^{:key new-refresh-key-here}[:div.fade-in-1s ...
Also remember that you can use libraries like Framer Motion
here is an example of use
https://github.com/reagent-project/reagent/tree/ce1dbe1be4534ca556fb05c4fede3fd6ac41b7cf/examples/framer-motion
There’s a really nice tutorial on framer-motion (for React) at https://www.youtube.com/playlist?list=PL4cUxeGkcC9iHDnQfTHEVVceOEBsOf07i
framer-motion is pretty powerful but seems to require to use it at the bottom of the component hierarchy (i.e. motion implementation of html tags like motion.div, motion.button etc)
I did find that at least for simple things so far, can wrap a reagent component into a motion.div
and the animate of the motion.div animates the reagent component.
is there a preferred way to donate to re-frame? or perhaps just to an individual?
Not yet. I haven't ever set something up
i sent you a pm this morning asking about channels to donate to you individually. seems like you have notifications off though. just wanting to see if you had any way to get you some money from our development team
I feel like I must be blind. I'm looking for the explanations of form-1 and form-2 components in the new re-frame docs and can't find it anywhere. are form-2 components not recommended anymore?
you can use subscriptions directly in form-1 components, I normally just deref directly @(rf/subscribe [...]) within let.
I was looking for https://github.com/reagent-project/reagent/blob/master/doc/CreatingReagentComponents.md#form-2--a-function-returning-a-function, which is under the reagent documentation.
I'm going through the re-frame todo mvc example, and was looking for the docs on form-2 components to under stand the todo-input
https://github.com/day8/re-frame/blob/master/examples/todomvc/src/todomvc/views.cljs#L7
are form-2 components idiomatic in re-frame
? is there a better alternative?
they use form-2 components there because they want to use ratoms directly for inputs, so the state is not changed while typing the text into it
I haven't ever used anything like that (we are dispatching all changes), so not sure about idiomatic way in Re-frame
I'm pretty new to re-frame and I like the idea of sticking to form-1 components. Are form 2&3 components common for re-frame projects?
I think the change in subscriptions made form-2 unnecessary in most cases. In our code, we have almost all form-1 components, and a few form-3 components where we need to use React events like component-did-mount or component-did-update. If you are starting with Re-frame, just use form-1 for everything.
Beforehand, subscriptions has to be used in form-2 components because rf/subscribe couldn't be used for every rerendering which would cause memory leaks. But it was changed that it is cached now.
awesome!
what is something you would put into local state? like values of an input, as it changes?
my rule of thumb is: if I deleted the UI, would this state still be relevant? if so, app-db. if not, local state
don't you get then into problems when something is local at first, but then you need it somewhere else? I found that impact of user interactions often influences very different places in the state of the app.
you can either lift it up to a parent and pass it as props (an easy, purely mechanical change with the ratom API) or - maybe it's relevant outside of the UI
My experience is form 2 was required whenever I wanted animation with JS comps. (Material UI).
yes. UI state needs to have very low contention. you want the minimal amount of mutations & subscribers in order to remain fast
app-db is just a free for all. as your app grows, every top-level subscription has to be run on every change. it's terrible for UI state
but, there are benefits to having a single source of truth for your application domain
I'm very influenced by this article: https://medium.com/@mweststrate/ui-as-an-afterthought-26e5d2bb24d6
hmm, speed is a benefit, I like having all of the state within one atom which makes the app little bit more clear (we have now about 25k lines). Not sure how this goes when it grows.
the dev experience and tooling problem you're talking about is legit but there are ways to solve it that actually don't depend on keeping everything in one atom
you could keep things in multiple atoms and have lil bit of code that allows you to explore them all at once
hmm, how about using inspect in shadow-cljs instead of printing?
makes sense, currently it doesn't feel to me like a mess yet and if it becomes a mess later I will have to rethink the approach