我有两个试剂组件将显示在我的Web应用程序的不同页面上。单独测试,它们都完全按照应有的方式工作。当我尝试渲染它们时,只显示一个。
这是clojurescript:
(defn mount-components []
(r/render [#'password-component] (.getElementById js/document "password"))
(r/render [#'test-component] (.getElementById js/document "test")))
(defn init! []
(mount-components))
在后端我有这个:
(defn password-page []
(layout/base
[:h1 "Change your password"]
[:div#password]))
(defn home-page []
(layout/base
[:h1 "Hello!"]
[:div#test]))
(defroutes app-routes
(GET "/" [] home-page)
(get "/password" [] password-page))
编译完clojurescript并查看页面后,只显示密码组件。如果我在mount-components
函数中交换订单,那么test-component
是第一个,只显示test-component
而不是password-component
。
如何同时显示两个组件?
答案 0 :(得分:2)
我认为问题可能是您实施中的一种设计缺陷。在反应程序中,状态原子的变化将触发重新渲染。从提供的代码中,不清楚“触发器”是什么导致重新渲染发生。它可能会实际看到整个页面代码,看看你如何调用javascript - 它可能只是init只在第一页加载而不是每页都运行。可能发生的事情是
使用试剂,我认为如果将客户端实现为单页面应用程序(SPA),它会更好。您使用试剂原子来存储您的应用程序状态,并使用该原子中的值来确定/控制在页面上呈现组件的时间/时间。回调服务器主要用于来回传递数据而不是页面html(粗略简化并忽略客户端渲染等内容)。
如果你真的想按照自己的方式去做,你可能需要将你的渲染命令放在不同的函数中,然后在每个页面中进行不同的javascript调用,这将调用相应的'run'函数来渲染组件。或者,您可以将组件链接到某种状态标志,该状态标志在加载新页面时更新,以便在新页面到达时重新运行mount-components功能。