我从一个非常简单的应用程序开始使用 om 和 ClojureScript。
我的全局应用状态如下所示:
(def app-state (atom {:animals [ {:name "dog" :img "pic01.jpg"}
{:name "cat" :img "pic02.jpg"}
{:name "mouse" :img "pic03.jpg"}
{:name "camel" :img "pic04.jpg"}]}))
向量“animals”中每个哈希映射的 name 属性由我称为“menu”的 om 组件呈现为 HTML 列表结构(例如 LI 标记)。每个条目都由另一个称为“条目”的组件呈现。(例如作为 UL 元素)。每当用户将鼠标悬停在列表条目之一时,条目的外观就会发生变化(可能背景会发生变化)。我在入口组件中捕获这些当前状态,我通过 om/IInitState 对其进行初始化。
到目前为止,这有效。现在我想添加另一个组件,称为“显示”。每当用户单击列表中的条目时,它应该能够在全局状态下显示与动物名称相关联的图像。我问自己解决这个问题的最佳方法是什么。
我看到两种可能性:
在“显示”组件中保持本地状态,该状态由“条目”组件的 onClick 事件更新。在这里,我的问题是:如何从另一个组件更新组件的状态?
或者在全局状态中引入另一个属性,可能叫做:“active_section”,由entry组件中的onClick事件更新,由“display”组件读取。但这有必要吗?