Almost all ClojureScript UI frameworks are reactive in their design (not functional reactive, just reactive).
I’d say FRP is not as common in ClojureScript, though those also exist, but they haven’t yet made it as mainstream in the Clojure community I’d say.
What you need to realize though is that each such lib has its own twist and flavors for how they do RP or FRP. So when you say does Clojure has some “ReactiveValues” as in some niche lib from a Haskell studio called Keera, well, probably it doesn’t have a copy/past port of it exactly as it is designed with the same exact abstractions and functions and interfaces, but I’m sure it has a lot of things within a similar ball-park, so the question is what are you looking for exactly?
For example, in Reagent you have a kind of atom (colloquially called a ratom) that tracks its component dependencies, and when its value changes all components react to the change in value by re-rendering themselves with the updated value. You can then create derived ratoms from others, so another atom that is a computation which include other ratoms in it, and if anything they depend on changes, they too will get recomputed and their value will become the updated result of their computation, causing components they depend on to also re-render, etc.
Edit: Special Mention to Javelin: https://github.com/hoplon/javelin because to me its the most direct implementation of the idea of RP as described by the wikipedia summary for it: Reactive programming - Wikipedia
The summary says:
For example, in an imperative programming setting, a := b + c
would mean that a
is being assigned the result of b + c
in the instant the expression is evaluated, and later, the values of b
and c
can be changed with no effect on the value of a
. On the other hand, in reactive programming, the value of a
is automatically updated whenever the values of b
or c
change, without the program having to explicit re-execute the statement a := b + c
to determine the presently assigned value of a
.
And here is the example it shows:
var b = 1
var c = 2
var a = b + c
b = 10
console.log(a) // 3 (not 12 because "=" is not a reactive assignment operator)
// now imagine you have a special operator "$=" that changes the value of a variable (executes code on the right side of the operator and assigns result to left side variable) not only when explicitly initialized, but also when referenced variables (on the right side of the operator) are changed
var b = 1
var c = 2
var a $= b + c
b = 10
console.log(a) // 12
With Javelin this would be represented as:
(defc b 1)
(defc c 2)
(defc= a (+ b c))
(reset! b 10)
(println @a) ;; 12
It doesn’t get any closer than that its line by line the same code in Lisp syntax.