(Edit: it is worth noting that Hooks are based on Reagent's reactive atoms.)
Compare the complexity of Hooks with the simplicity of state management in [Reagent](http://reagent-project.github.io/) or [Rum](https://github.com/tonsky/rum).
Complete ClojureScript example using Reagent:
(ns reagent-example.core
(:require [reagent.core :as r])
(def !count (atom 0)) ;; ! prefix is convention for state
(defn counter-component []
[:div
[:p "You have clicked the button " @!count " times."]
[:button {:on-click #(swap! !count inc)} "Increment"]])
(r/render [counter-component] (js/document.getElementById "app"))
The same example using Rum: (ns rum-example.core
(:require [rum.core :as rum])
(def !count (atom 0))
(rum/defc counter-component < rum/reactive []
[:div
[:p "You have clicked the button " (rum/react !count) " times."]
[:button {:on-click #(swap! !count inc)} "Increment"]])
(rum/mount (counter-component) (js/document.getElementById "app"))What's your point? This is about Hooks vs Class based components.
If you need to manage state and want to focus on functions instead of objects (classes), try ClojureScript - especially in combination with [DataScript](https://github.com/tonsky/datascript), an immutable database and Datalog query engine. Clojure/ClojureScript's persistent, immutable memory model makes it much nicer for reasoning about state.
Maybe I'm just a dinosaur, but I can't keep up with all the changes to JavaScript, whereas ClojureScript compiles to ECMAScript 3 and the syntax hasn't changed since its release 12 years ago.