0

所以我有一个组件,假设当我点击它时,这应该会触发状态更改,例如:

:on-click #(om/set-state! this {:activated? true})

现在,如果我想在单击文档的任意位置时“停用”它怎么办?我想我可以addEventListener通过将它连接到对象上来使用document,如下所示:

(componentDidMount [this]
       (events/listen (gdom/getDocument)
         (.-CLICK events/EventType)
         #(om/set-state! this {:activated? false}) true))

现在这是我想要的,但首先如果我有 200 个相同组件的实例,它将有 200 个事件侦听器,对吗?我猜这是不可取的,但没关系

但真正的问题是如何在设置状态时将组件的一个实例与另一个实例区分开来?我绝对不希望所有这些都“停用”,而只希望在其中触发单击事件处理程序的上下文

4

1 回答 1

1

我认为问题的标题指向了真正的问题:影响本地状态的全球事件。在我看来,被“激活”的概念并不属于这些组件中的每一个(作为本地状态),而是属于树中更高的东西。否则,它们将独立运作。但在我看来,您希望一次激活其中一个,对吗?

我会在父母的本地状态或全局应用程序状态中识别当前活动的。然后我会让父母给每个孩子一个回调,当它被点击激活它时它可以调用。最后,父元素可以在其元素上拥有一个单击事件侦听器,大概是一个覆盖整个页面的元素,它会停用活动的子元素(通过将活动的子元素设置到nil存储它的任何位置)。

于 2016-09-12T19:15:26.463 回答