如何在Elm 0.17中一次突出显示单个组件?

ajp*_*ajp 1 elm

我有一个带有各种组件的游戏UI,其中一些可以点击以突出显示("活动"组件).这是通过让Bool处于可以突出显示的每个组件的状态来完成的.但是,我想强制一次只能突出显示一个组件 - 因此,如果点击了某些内容,则当前突出显示的任何其他内容都必须更新为不突出显示.

实现此目的的一种方法是让共同的祖先向所有不同的孩子广播一些消息,并且每个组件都可以处理此消息并自行关闭 - 但这看起来非常复杂和浪费.可能有1000个组件,只有两个组件正在更改(一个突出显示,一个突出显示),那么我为什么要发送和处理1000条消息呢?

有没有更好的办法?

注意:这看起来非常类似于Elm 0.17:如何订阅兄弟/嵌套组件更改.我认为一个区别在于,在那个问题中有少量的相关组件,当一个组件发生变化时,另一个组件会发生变化.在我的情况下,整个模型中的不同位置有许多组件,当一个变化很少或其他都不会改变时.

Zim*_*i48 5

是的,可能有更好的方法.建议不要在应用程序的多个位置复制某些状态,因为这会导致同步问题并使调试更加困难.

相反,最好不要将突出显示的状态存储在组件中,而只存储在主模型中.然后组件的视图函数将采用额外的布尔"突出显示"参数.

要将突出显示的状态存储在主模型中,您可以为每个组件提供一个ID并添加highlighted : Maybe ID到模型中.

因此,您只需将点击消息从子节点传播到父节点,而不是从父节点传播到子节点.