首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使值没有变化,我也必须担心动态触发吗?

即使值没有变化,我也必须担心动态触发吗?
EN

Stack Overflow用户
提问于 2022-02-16 01:33:56
回答 1查看 50关注 0票数 2

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

代码语言:javascript
复制
dynShowNumbers <- holdDyn False $ catMaybes $ updated dynMaybeShowNumbers

当按下或释放一个键时,dynMaybeShowNumbers :: Dynamic t (Maybe Bool)就会触发,但只有当两个特定键中的一个更改状态(即按下或不按下)时,它的值才等于Nothing。当两个键中的一个被释放时,它会触发Just False

原因是我展示了一个虚拟键盘,它通常依赖于按键被按下或释放的任何事件。对于dynMaybeShowNumbers,我只需过滤出两个需要按住的相关键,以显示虚拟数字垫。

dynShowNumbers :: Dynamic t Bool不依赖于上面的Dynamic t (Maybe Bool)的情况下,我可以轻松地编写更简单的代码。

然而:

在这种情况下,只要按下任何键,我就会触发dynShowNumbers

代码语言:javascript
复制
False---False---False------False--True---True----False----False----...

而上述代码将导致

代码语言:javascript
复制
False-----------------------------True-----------False-------------...

同样的输入。

我觉得,我需要上面的行来避免我的虚拟键盘的动态重呈现--即使没有什么变化。

但以上这条线是否良好的做法呢?在库中有有效的函数(找不到)吗?它类似于从列表中删除重复项的任务。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-16 02:51:04

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

代码语言:javascript
复制
-- | 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中似乎有一种更有原则、基于类型的方法。整个单元都集中在这种情况下。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71135414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档