4

これは実際にはちょっとしたXY 問題かもしれないので、最初に目標が何であるかを説明しようと思います。

Reagentコンポーネントのセットで構成される ClojureScript アプリケーションを構築しています。UI 要素を動的に追加または削除できるユーザー インターフェイスを提供します。これらの UI 要素 (コンポーネント) には特定のタイプがあります。たとえば、Markdown コンポーネントis-aText コンポーネント。テキストを追加するオプションがユーザーに表示されるたびに、type+の子孫に一致するすべてのコンポーネントを一覧表示します(この場合は Markdown で、他にもある可能性があります)。

私がコーディングした方法は次のとおりです。各コンポーネントは独自の名前空間にあり、この名前空間には、新しいコンポーネントを返すビルダー関数が含まれています。名前空間のルートでも呼び出します ( derive ::type ::parent)

現在、いくつかの異なる名前空間で、次のようなマップでこれらすべてのコンポーネントを必要とし、列挙しています。

(ns app.components
  (:require
   [app.gui.markdown :as markdown]
   [app.gui.study-list :as study-list]))

(def all
  {markdown/t markdown/builder
   study-list/t study-list/builder})

/t、階層を定義するために使用された名前空間修飾キーワードを参照します。マップを使用してall、ユーザーに面するメニューのデータを提供します (どのコンポーネントを追加でき、タイプ別にフィルター処理されます)。

ご想像のとおり、これはきれいではありません。階層内のすべてのタイプのこのような (潜在的に) 長いリストを手動で維持する必要があるためです。

むしろ私は何かをしたいの(def all (components-of (descendants ::root)))ですが、名前で変数を見つける必要があると思うので、これに取り組む方法がわかりません(ClojureScriptではサポートされていません)。

私の質問は、ClojureScript で名前空間 + var のマップまたはリストを (動的に) どのように維持するのですか?

4

1 に答える 1