【问题标题】:What is the correct way to dynamically render components in reagent?在试剂中动态渲染组件的正确方法是什么?
【发布时间】:2019-09-12 14:15:07
【问题描述】:

在 React 中动态渲染组件是其使用的基础。这很容易做到,如下所示:

  render() {
    return (
      <div className="blocks_loop">
        {this.props.blocks.map(block => (
          <div className="block" />
        ))}
      </div>
    )
  }

在此示例中,您将获得与 blocks 一样多的 div 渲染。我正在尝试使用试剂来实现相同的目标,其中一部分我已在this 帖子中记录。有一些人这样做的例子,比如this 之一,但它们似乎都包括使用我不想使用的lists - 它只是不符合我的目的。我只想取出与放入的物品一样多的组件。

更新

我现在有这段代码试图遵循下面的答案,这意味着为my-map 中的每个键值对呈现 3 个 div。什么都没有渲染,它会抛出错误react-dom.development.js:507 Warning: Functions are not valid as a React child.:

(ns mapping-test.views
  (:require
   [re-frame.core :as re-frame]
   [mapping-test.subs :as subs]))

(defn main-panel []

  (def my-map {:a 1 :b 2 :c 3})

  (defn a-component []
    [:h1 "This is a component rendering"])

  (defn my-loop [my-map]
    (for [value my-map]
      [a-component]))

  (fn []
    [my-loop my-map]))

【问题讨论】:

  • “它们只是不适用于任何严肃的应用程序”需要引用。
  • 好的,也许有人用过一次,但你能回答这个问题吗? ;)
  • 如果“问题”归结为“请将此 javascript 代码转换为 ClojureScript”,不,我们不会在这里这样做(没有人表现出自己的善意努力和具体的、狭隘的问题); Meta Stack Overflow 上的大量参考资料可用于此效果,请特别参阅 Is "How do I convert code from this language to this language too broad?"。显示您在 ClojureScript 中尝试过的操作以及遇到的特定故障模式。
  • (在修改此内容时——请非常明确地说明您试图避免“使用lists”的意思,以及您期望的解决方案不这样做是为了看起来像。如果您将任何类型的序列视为列表,我不明白您将如何存储或传递可变数量的项目没有 某种存储它的序列类型)。
  • 嗨@CharlesDuffy - 不,我不是在寻找任何人在这里翻译我的代码。我来自 js 背景,正在尝试学习 ClojureScript。我的观点是,通过反应(我使用的试剂显然是它的 ClojureScript 化身),有一种简单、标准且有据可查的方法,如我给出的代码示例所示。在花费大量时间尝试使用 ClojureScript 实现相同目标之后,我无法做到这一点,正如您在我链接到的帖子中看到的那样,这只是一个又一个错误。当我说lists 时,显然我不是指 Clojure 列表,我指的是 html 元素。

标签: clojure clojurescript reagent


【解决方案1】:
(defn my-component [blocks]
   [:div.blocks_loop
     (for [b blocks]
       [:div.block])])

由于您正在创建打嗝,您可以使用任何 clojure 代码来映射或循环访问您的数据。

【讨论】:

  • 值得注意的是,blocks 这里是一个序列。当 OP 说他们不想要“使用lists”时,这是否意味着他们根本不想要任何序列类型? (老实说,我不知道他们在问什么,所以我不知道这个答案或任何其他答案是否满足它)。
  • 我认为这只是语言障碍。对于初学者来说,“动态”构建打嗝之类的东西并不明显。 Luckliy SO 有一个投票按钮;)
  • 感谢@JochenBedersdorfer 的直截了当的回答 - 同样,当我说列表时,我指的是html / hiccup / jsx,就像我提供的链接中那样,而不是lists,就像在 Clojure 数据结构中那样。所以如果我想循环一个实际的组件(在一个单独的函数中),我可以用[function-returning-hiccup])])之类的东西替换你的代码行[:div.block])])吗?
  • 当然。这就是你在打嗝中嵌套组件的方式。只需使用名称即可。
  • 这里是有关何时在打嗝中使用 [] vs() 的相关文档:reagent-project.github.io/docs/master/…
猜你喜欢
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多