0

假设我们有这个网格,其值可以是 0 或 1:

(def grid [[1 0 1]
           [1 0 0]
           [1 0 1]])

现在我想grid使用列表理解转换为类似 html Hiccup 的格式:

(defn cell-component [is-it-1 key]
  ^{:key key} [:td (if (= is-it-1 1) {:class "is-it-1"})])


(defn grid-html []
  ([:table
   [:tbody
   (for [row grid]
      ^{:key row} [:tr 
                      (for [cell row]
                      (cell-component cell how-i-can-generate-a-index?))])]]))

该表已正确生成,但我对如何unique index为我的td. how-i-can-generate-a-index?应该是什么?

4

3 回答 3

2

在您的情况下,每个单元格都由其在行中的索引唯一标识。此外,在父结构中而不是在组件中指定子键会更自然:

(defn cell-component [is-it-1]
  [:td (if (= is-it-1 1) {:class "is-it-1"})])

(for [[i cell] (map-indexed vector row)]
  ^{:key i} [cell-component cell])

请注意,您应该类似地将基于索引的键分配给行 -^{:key row}如果您的表中有重复的行,则将不起作用。

于 2016-12-03T13:05:21.777 回答
0

您只需要调用gensym

(cell-component cell (gensym))

这是一种通用的方法。然而,通常最好在您的数据中找到一些已经提供独特差异的属性。

如果您希望看到从 0 开始计数的数字,那么您可以编写自己的序列生成器:

(def uniq-key (atom -1))
(defn gen-key []
  (swap! uniq-key inc)) 

第一次打电话给(gen-key)你0,第二次1等。

于 2016-12-03T11:00:14.667 回答
0

我建议定义试剂成分接受propschildren作为参数。

(defn my-li
  [:keys [a-string]]
  [:li
   a-string])

(defn my-list
  [{:keys [color]} & children]
  [:ul
   {:style {:background-color color}}
   (map-indexed #(with-meta %2 {:key %1}) children)])

(defn thelist []
  [my-list
   {:color "#ccc"}
   [my-li "one"]
   [my-li "two"]])

改编自https://github.com/reagent-project/reagent/issues/68

于 2019-02-21T13:57:10.877 回答