问题描述
我正在向应用程序中添加一些试剂,该应用程序已经在服务器上从数据库中完成了一些打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))))