ClojureScript Re-Frame: дилемма разыменования подписки

Какой лучший из следующих подходов?

Внешняя подписка, раннее удаление ссылок

(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 при тестировании последнего.


person jsmesami    schedule 12.09.2017    source источник


Ответы (2)


Мы ответим, как всегда, "это зависит", но...

Внешняя подписка, раннее отключение приводит к чистым/проверяемым внутренним. Так что это может быть хорошим выбором, когда это важно для вас. Но мы редко используем этот стиль.

Внешняя подписка, позднее отключение мы активно отошли от этого стиля, потому что он создавал код, который мы позже сочли трудным для понимания. Кстати, если мы когда-нибудь будем передавать ратомы/курсоры/подписки, нам нравится ставить * в конце имени аргумента, чтобы было ясно, что они являются ссылкой, а не значением.

Внутренняя подписка, раннее удаление ссылок, вероятно, используется чаще всего. Через некоторое время чувствует себя очень естественно. Возможно, используйте <sub из LIN

Внутренняя подписка, поздняя отмена ссылки тоже работает, но я предпочитаю вариант, описанный выше. Всегда есть непреодолимое беспокойство, что вы можете забыть добавить @ в момент использования, и это может быть раздражающей ошибкой.

person Mike Thompson    schedule 12.09.2017
comment
Спасибо за подтверждение моей интуиции :) - person jsmesami; 12.09.2017

Не знаю, решит ли это вашу дилемму, но начиная с Re-frame 0.9 вы можете писать @(rf/subscribe [:msg]) везде, где вам нужно значение из подписки. Подписки кэшируются, поэтому создание множества с использованием одного и того же пути не дает более одной подписки. Дополнительная информация в этой статье блога: https://lambdaisland.com/blog/11-02-2017-re-frame-form-1-subscriptions и эта проблема с рефреймингом.

person Michiel Borkent    schedule 12.09.2017