Comments (4)
Did you have something like this in mind?
first we define a function that applies a state transition function to the state
(defn apply-trans-fun
"Applies the transition function to the state and returns the updated state"
[state trans-fun]
(trans-fun state))
then we reduce the state with our application function
(defn update-state!
"Updates the state by applying all transition functions in order."
[state trans-funs]
(reduce apply-trans-fun state trans-funs))
This isn't analogous to set-state! so I'll study the set-state! function to see if I can come up with something better
from om.
om.core/update-state!
is really more about being idiomatic. It's more idiomatic to take some state and do some functional operations on it and return a value over banging on it several times in succession. I was thinking about something more analogous to cljs.core/update-in
from om.
Would swap!
be a better analogy? Something like
(defn swap-state!
"Takes a pure owning component and sets the state of the component to be:
(apply f current-state args)."
([owner f]
(allow-reads
(let [props (.-props owner)
state (.-state owner)
cursor (aget props "__om_cursor")
path (-path cursor)
pstate (or (aget state "__om_pending_state")
(aget state "__om_state"))]
(aset state "__om_pending_state" (f pstate))
;; invalidate path to component
(if (empty? path)
(swap! (-state cursor) clone)
(swap! (-state cursor) update-in path clone)))))
([owner f x]
(swap-state! owner #(f % x)))
([owner f x y]
(swap-state! owner #(f % x y)))
([owner f x y & args]
(swap-state! owner #(apply f % x y args))))
;; Usage:
(om/swap-state! owner assoc :foo 1 :bar 2)
I tested this out, it seems to work pretty well. I suppose we might want to enforce an invariant that the new state is always a map. I'm open to any other suggestions.
from om.
fixed 4405497
from om.
Related Issues (20)
- Can't add custom children on remote ast
- Adding `index` as a parameter to `f` when using build-all HOT 1
- A component that implements IQuery needs data returned, otherwise even statically defined dom elements do not get rendered.
- [Wiki] Components, Identity, & normalization wiki link broken
- Bug on master: `mounted?` breaks in adv optimization
- No queries exist for component path HOT 4
- In reloadable workflow, "No queries exist for component path..."
- Specify :remote reads in transact! HOT 1
- Examples should use `defui`
- om.core and beta2 HOT 8
- Reconciler broken in ClojureScript 1.10.* HOT 6
- om.next Quickstart issues HOT 1
- Wiki Quick Start project.clj doesn't work with java 10 HOT 2
- [Wiki] Quick Start (om.next) - to see console logs Chrome users should enable Verbose output
- uri? already refers to: cljs.core/uri? being replaced by: cognitect.transit/uri? HOT 1
- Add support for componentDidCatch
- Arity exception when calling om.next/reader and om.next/writer with zero arguments in Clojure
- Advanced cljsbuild with default settings emits a warning
- Looks like the updates to GitHub have messed up the om.next docs HOT 1
- Readme Quick Start compilation fails @ bumping cljs version from 1.10.520 -> 1.10.597
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from om.