6

以下方法最好的是什么?

外部订阅,提前取消引用

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

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

外部订阅,延迟 deref

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

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

内部订阅,提前取消引用

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

内部订阅,延迟 deref

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

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

当我订阅内部组件时,它变得不纯,失去了易于测试的能力。

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

4

2 回答 2

4

一如既往,我们的答案是“视情况而定”,但是......

外部订阅,早期 deref导致纯/可测试的内部。因此,当这对您很重要时,这可能是一个不错的选择。但我们很少使用这种风格。

外部订阅,后期 deref 我们已经积极地远离这种风格,因为它产生了我们后来发现难以理解的代码。顺便说一句,如果我们确实传递了随机数/光标/订阅,我们喜欢*在参数名称后面加上一个尾随,以表明它们是一个引用-y,而不是一个值。

内部订阅,早期 deref 可能是最常用的,我猜。一段时间后感觉很自然。也许使用<sub LIN

内部订阅,迟到的 deref这也有效,但我更喜欢上面的变化。总是有一个令人烦恼的担忧,即您可能会忘记@在使用时添加,这可能是一个令人讨厌的错误。

于 2017-09-12T14:24:08.930 回答
3

不知道这是否能解决您的困境,但自从 Re-frame 0.9 以来,您可以@(rf/subscribe [:msg])在任何需要订阅值的地方编写。订阅被缓存,因此使用相同路径创建多个订阅不会产生多个订阅。此博客文章中的更多信息:https ://lambdaisland.com/blog/11-02-2017-re-frame-form-1-subscriptions和此 Re-frame issue

于 2017-09-12T14:03:26.973 回答