3

使用reflex-dom我发现自己编写了以下代码:

dynShowNumbers <- holdDyn False $ catMaybes $ updated dynMaybeShowNumbers

wheredynMaybeShowNumbers :: Dynamic t (Maybe Bool)触发,每当一个键被按下或释放,但它只有一个值不等于Nothing,当两个特定键之一改变状态(即按下或未按下)时。Just False它在两个键之一被释放时触发。

原因是我展示了一个虚拟键盘,它通常取决于按下或释放键的任何事件。对于dynMaybeShowNumbers,我只是过滤掉了需要按住以显示虚拟小键盘的两个相关键。

我可以轻松编写dynShowNumbers :: Dynamic t Bool不依赖于Dynamic t (Maybe Bool)上述内容的更简单的代码。

然而:

在这种情况下,每当按下任何键时,我都会被dynShowNumbers解雇:

False---False---False------False--True---True----False----False----...

而上面的代码会导致

False-----------------------------True-----------False-------------...

对于相同的输入。

我觉得,我需要上面的代码来避免动态重新渲染我的虚拟键盘——即使没有任何变化。


但是上面的行是好的做法吗?库中是否有有效的功能(找不到)?它类似于从列表中删除重复项的任务。

4

1 回答 1

4

你有几个选择!在Reflex.Dynamic中,您可以使用以下hold变体:

-- | Create a new 'Dynamic' that only signals changes if the values actually
-- changed.
holdUniqDyn :: (Reflex t, MonadHold t m, MonadFix m, Eq a) => Dynamic t a -> m (Dynamic t a)

-- | Create a new 'Dynamic' that changes only when the underlying 'Dynamic'
-- changes and the given function returns 'False' when given both the old and
-- the new values.
holdUniqDynBy :: (Reflex t, MonadHold t m, MonadFix m) => (a -> a -> Bool) -> Dynamic t a -> m (Dynamic t a)

Reflex.Dynamic.Uniq. 整个模块专注于这种情况。

于 2022-02-16T02:51:04.753 回答