0

I use an (if) condition as form-2 render-function in this way:

(defn bro [dex]
      (let [yo (inc dex)]
           (if true
               [:div (str yo)])))

instead of this way:

(defn bro [dex]
      (let [yo (inc dex)]
           (fn [dex]
               (if true
                   [:div (str yo)]))))

Is a problem if i use an (if) statement instead of an (fn) function? And what happens when the statement gone false? The render function returns with nil?

4

2 回答 2

2

不,这不会像你期望的那样工作。要了解差异,请考虑以下两个组件:

(defn test-component-if []
  (let [a (atom 1)
        _ (.log js/console "let in -if")]
    (if (odd? @a)
      [:div
       [:p "odd"]
       [:button {:on-click #(swap! a inc)}
        "inc"]]
      [:div
       [:p "even"]
       [:button {:on-click #(swap! a inc)}
        "inc"]])))

(defn test-component-fn []
  (let [a (atom 1)
        _ (.log js/console "let in -fn")]
     ;; I dub thee test-inner
    (fn []
      (if (odd? @a)
        [:div
         [:p "odd"]
         [:button {:on-click #(swap! a inc)}
          "inc"]]
        [:div
         [:p "even"]
         [:button {:on-click #(swap! a inc)}
          "inc"]]))))

test-component-fn按预期工作,而test-component-if没有。这是为什么?好吧,当一个试剂组件可以返回两件事之一时(我忽略了“类型 3”组件,因为它与反应知识挂钩)。它可以返回

  1. 一个向量
  2. 另一个功能

如果它返回一个向量,函数本身就成为渲染函数,在我们的例子test-component-if中。当它返回一个函数时,返回的函数,而不是原始函数,是渲染函数。在这种情况下,我所配音的test-inner

当 Reagent 调用渲染函数时,它会跟踪函数访问的原子,并且每当该原子发生变化时,它都会调用渲染函数。那么当我们使用时会发生什么test-component-if

  1. 试剂调用test-component-if
  2. 我们的 let 子句将一个新原子绑定a到 1。
  3. 返回一个向量
  4. 我们点击按钮
  5. 原子a递增
  6. 试剂看到变化a并调用test-component-if
  7. 我们的 let 子句将一个新原子绑定a到 1。(与我们之前的不同原子a
  8. 哎呀!

总是 1。您可以通过查看控制台来验证这a一点,并看到每次单击按钮时都会打印消息。

现在怎么样test-component-fn

  1. 试剂调用test-component-fn
  2. 我们的 let 子句将一个新原子绑定a到 1。
  3. test-component-fn返回test-inner 关闭a
  4. 试剂调用test-inner
  5. 我们点击按钮
  6. a递增
  7. 试剂看到变化a并调用test-inner
  8. 根据需要重复多次。

您可以验证 let only 在控制台上再次执行。根据需要多次单击按钮,消息只会在第一次呈现时打印。

if没有else子句而言,这确实会返回 nil。在这种情况下使用when而不是使用是惯例if,这清楚地表明缺少 anelse是有意的。它还具有包含隐式do的优点。至于 Reagent 遇到这种情况会怎么做nil大多数情况下它会默默地移除它,什么也不显示

于 2019-07-02T03:58:09.070 回答
0

如果我使用 (if) 语句而不是 (fn) 函数有问题吗?

我认为您的意思是在函数if 内部使用fn,但无论哪种方式都不是问题。

当声明变为错误时会发生什么?渲染函数返回零?

Reagent 会优雅地处理这些,anil将被跳过(不创建相应的子节点)。如果您在官方文档中看到TODOs 应用程序示例,您会看到源代码如下所示:

(when (pos? done)
       [:button#clear-completed {:on-click clear-done}
        "Clear completed " done])]))

在这种情况下,如果done不是正数,则该表达式的返回值是nil,并且清除已完成任务的按钮根本不会添加到 DOM 中。

于 2019-07-02T02:18:03.330 回答