(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.