0

在给定我的项目的情况下,我正在朝着使用试剂的合适状态设计的方向发展,并且仍然使用不同的原子(我可能会切换到单个原子,但目前正在尝试探索可能性的空间),我已经尝试在根组件的词法上下文中设置所有状态,如下图所示。想法是这app-state是一个普通的 clojure 映射,其中每个键的值是一个试剂原子。

它接收一个attrs作为 prop 的映射(来自data-html 元素上的 attrs),它的工作是初始化一个app-state映射,该映射本身不是 a r/atom,而是包含r/atoms。问题是,所有这些r/atoms 都是defonce在文件顶部声明时定义的,这就是我刚刚切换的内容,现在defonce语义丢失了,并且 figwheel 热重载被破坏了。

有没有办法在以这种风格设置状态时保留可重新加载的代码?

我不能把 adefonce放在里面 a let,因为随后的评估时间将评估为零。
或者我在这里缺少一些模式。

(defn a-root-component [attrs]
  (let [app-state {:some-state (r/atom (:some-state attrs))}]
    (fn [attrs]
      [some-component app-state])))
4

1 回答 1

1

从技术上讲,您可以使用memoize,但我不会。通过使用memoize您引入的隐藏全局状态,巧妙地隐藏在没有人会想到寻找它的地方。defonce对你的主要组件之外的状态更好,并明确说明它。

鉴于您的移动方向,我会仔细研究诸如re-frameKeemcha 之类的东西,它们为以理智的方式处理集中状态提供了既定的模式和工具。

于 2020-10-14T23:04:51.930 回答