om组件应该返回什么不呈现?

时间:2014-07-03 13:59:24

标签: clojurescript om

是否可以编写一个不呈现任何内容的组件,例如,如果其游标数据为空?

我无法做到

(defn count-or-nothing [list-cursor owner]
  (reify
    om/IRender
    (render [_]
       (if (not (empty? list-cursor))
         (dom/div nil "You have some elements !")))))

if子句返回nil,这会导致错误消息

  

未捕获错误:不变违规:ReactCompositeComponent.render():   必须返回有效的ReactComponent。您可能已经返回null,   undefined,数组或其他一些无效对象。

我通过渲染一个空的跨度,但听起来很笨拙。 我是否必须重构我的代码并进行测试" out"这个组件?

2 个答案:

答案 0 :(得分:6)

我对你不能这样做的理解是因为React需要跟踪DOM中的组件,并通过向节点添加react-id属性来实现。 如果你渲染"没有",那么React不知道如何将它安装到DOM(它有效地卸载)中。由于您无法安装已卸载的组件,因此不允许这样做。

解决方案将非空状态作为其自己的组件,然后让PARENT有条件地构建该组件。这样,如果你想要什么都不渲染,它会卸载组件而且......什么也不渲染。

(defn something-interesting [list-cursor owner]
  (reify
    om/IRender
    (render [_]
      (dom/div nil "You have some elements !"))))

(defn count-or-nothing [list-cursor owner]
  (reify
    om/IRender
    (render [_]
      (dom/div nil
        ; Other UI stuff here maybe...
        (when-not (empty? list-cursor)
          (om/build something-interesting list-cursor))))))

答案 1 :(得分:1)

所以答案是:你不能这样做。

我会将此标记为Unable to display two components in OM的副本,但此问题没有答案......

[编辑]修正了问题链接