ClojureScript Re-frame 订阅解引用困境

7
以下哪种方法最佳?
外部订阅,早期解引用。
(defn component [msg]
    [:p msg]))

(let [msg (rf/subscribe [:msg])]
    [component @msg]

外部订阅,延迟解引用

(defn component [msg]
    [:p @msg]))

(let [msg (rf/subscribe [:msg])]
    [component msg]

内部订阅,早期取消引用
(defn component []
   (let [msg @(rf/subscribe [:msg])]
      [:p msg])))

内部订阅,延迟解引用

(defn component []
   (let [msg (rf/subscribe [:msg])]
      [:p @msg])))

当我使用外部订阅来保持内部组件的纯净时,我可能会得到许多需要通过深度嵌套的通常不相关的父级结构传递的参数。这很容易变得混乱。

当我在内部组件中订阅时,它变得不纯,失去了易于测试性。

此外,我想知道早期和晚期解引用之间是否有重要的区别,除了我必须在测试后者时传递reagent/atom

2个回答

4
我们一如既往地回答: "这取决于情况",但是... 外部订阅,早期解引用可导致内部实现纯净/可测试。因此,当您认为这很重要时,这可能是一个不错的选择。但是我们并没有经常使用这种风格。 外部订阅,晚期解引用 我们已经积极远离这种风格,因为它产生的代码后来被发现难以理解。顺便说一句,如果我们确实传递了ratoms/cursors/subscriptions之类的内容,我们喜欢在参数名称末尾放置一个*,以明确它们是引用而不是值。 内部订阅,早期解引用 可能是最常用的,我猜测是这样的。习惯后感觉非常自然。也许使用from LIN

内部订阅,延迟解引用 这个也可以工作,但我倾向于使用上面直接的变体。总会有一个令人烦恼的担忧,你可能会忘记在使用点添加@,这可能是一个令人烦恼的错误。


谢谢您再次证实我的直觉 :) - jsmesami

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接