为什么更新我的嵌套试剂组件没有更新它?

问题描述 投票:0回答:2

我在 Reagent + ShadowCLJS 中有一个三重嵌套组件(在不同的文件中)。编辑并保存此文件时,更改不会立即显示,直到编辑并保存父组件为止。

例如,NAV 嵌套在 DASHBOARD 中,DASHBOARD 本身又嵌套在 APP 中。编辑和保存 DASHBOARD 也会导致浏览器中发生更改,但编辑和保存 NAV 不会,直到 DASHBOARD 本身被修改,然后 NAV 才会在浏览器中显示更改。

示例代码:

(ns app.core
  (:require [app.views.dashboard :as dash]))
(defn app[]
  [dashboard])
(ns app.views.dashboard
  (:require [app.components.nav :as nav]))
(defn dashboard[]
  [:div 
    [:div "Dashboard"]
    [nav/nav]])
(ns app.components.nav)
(defn nav[]
  [:div "Navigation"])

构建配置:

;;shadow-cljs.edn
...
{:app {:target :browser
       :modules {:main {:entries [app.core]}}}
...

我尝试取消命名空间的嵌套,以便组件在目录中彼此相邻,但仍然三重嵌套。这也行不通。

clojurescript reagent shadow-cljs
2个回答
1
投票

我在 CLJS 中写过关于 hot-reload 的文章,也许你可以在那里找到答案。

通常我希望你的设置能够正常工作,但我怀疑试剂/反应决定在某个时刻跳过渲染。它们会记住一些组件,并且由于 CORE 不会改变,因此当触摸 NAV 时,它可能会决定不需要执行任何操作。

您可以通过在构建配置中设置

:devtool {:reload-strategy :full}
来强制完全重新加载,这应该可以解决此问题。然而,在较大的构建中,它可能会变得有些慢。


1
投票

经过5个小时的折腾,发现如果C嵌套在B中,而B又嵌套在A中(A(B(C))),那么不仅要在B中导入C,而且还必须导入它所以我的解决方案是将

:require
app.components.nav
也放在
app.core
内。

我不太确定为什么会这样,所以如果其他人愿意做出解释,我们将非常欢迎!

© www.soinside.com 2019 - 2024. All rights reserved.