试剂在挂载前获取元素内容

问题描述

我正在向应用程序中添加一些试剂,该应用程序已经在服务器上从数据库中完成了一些打rendering渲染。显然做出了反应,然后钩入了可以看到并挂载的html。

我想做一些渐进的增强,即应该安装一个react / reagent组件,但是我还需要它要安装在上面的div的原始文本,它由数据库放在那里。因此要做出反应,它是在静态HTML中装载时将被覆盖。我想先保存该元素的内容,然后再“删除”。

这是行不通的

(defn by-id [id] (js/document.getElementById id))

(when-let [el (by-id "lesson-app")]        ; only mount when this el is present
  (let [lesson-text (by-id "lesson-app")]  ; try to get el contents before mount
    (console.log lesson-text)              ; <- this logs contents *after* mount!!
    (rdom/render [lesson-app] el)))        ; mount the component

在此处登录控制台的是dom元素 安装后。为什么呢?

想知道我是否可以使用Form-2组件并获取let中的内容。不过,这对我不起作用,很有趣,想知道为什么有人可以解释。

更新

我已成功将文本作为html属性传递,如here所述。但这意味着要进行渐进式增强,我需要渲染两次文本,一次渲染为attr,一次渲染为普通文本。

更新2

我觉得这可能是出于 惯例 鼓励成语 和/或也许做出反应的速度不允许您传递html元素内容(这样做显然不违反物理定律)。如果这是正确的,那么付出的一点代价就是对于渐进式应用程序,我们必须将文本复制为html元素内容和data-attribute属性,但这至少对于我当前的情况并不可怕。

解决方法

此功能isn't supported是应诉。

我们改用html data-属性。

例如:

(defn ^:export run []
  (when-let [el (by-id "lesson-app")]
    (let [data-text (.getAttribute el "data-text")]
      (rdom/render [lesson-app data-text] el))))