2016-07-07 3 views
2

Clojure의 Hiccup과 같은 데이터 구조에서 조건부 메뉴 목록을 우아하게 렌더링하는 방법은 무엇입니까? 내 templating 기능은 into에 대한 호출로 산재 해 버리고 자연스럽게 읽지 않습니다.Clojure에서 조건부로 Hiccup 데이터 구조를 해제하는 방법

원하는 결과 : 내가 if의 개인 항목을 넣으면

[:div.menu 
    [:div.item "Home"] 
    [:div.item "Private"] 
    [:div.item "Private"] 
    [:div.item "Public"] 

, 나는 아직도 반환 된 벡터를 풀다, 또는 nil 다룰 필요하므로이 작동하지 않습니다

[:div.menu 
    [:div.item "Home"] 
    (if authenticated? 
    [[:div.item "Private"] 
    [:div.item "Private"]]) 
    [:div.item "Public"]] 

(into [:div.menu] ...)을 사용할 수 있고 항목 목록을 전달할 수 있지만 읽기가 힘들고 자연스럽게 읽지 않습니다. 나는이 표현으로 끝났다 :

(-> [:div.menu 
     [:div.item "Home"]] 
    (into (if (auth/authenticated?) 
     [[:div.item "Private"] 
     [:div.item "Private"]] 
    (into [[:div.item "Public"]])) 

더 좋은 방법이 있습니까?

답변

1

는 히컵이 벡터에서 다른 목록을 취급, 그래서 당신은 대신 []의)는을 (반환 할 수와 제대로 풀다 한 밝혀 :

[:div.menu 
    [:div.item "Home"] 
    (if authenticated? 
     (list 
     [:div.item "Private"] 
     [:div.item "Private"])) 
    [:div.item "Public"]] 
+0

이 방법의 단점은 당신이 시약을 사용하는 경우 또는 React 기반의 라이브러리를 사용하면 고유 한 키 경고를 얻을 수 있습니다. –