关于ClojureScript中通过REPL重载re-frame组件的疑问
ClojureScript REPL重载单个组件的正确方式
你的理解没错——确实可以通过REPL单独重载组件,但需要完成两个关键步骤,而不是只修改代码却不执行求值:
第一步:重新求值组件定义
修改main-panel的代码后,必须在REPL里重新执行这个函数的定义。比如选中整个(defn main-panel [] ...)代码块,在Conjure中用cpp命令(Calva中用「Evaluate Top Level Form」)执行,让新的组件定义覆盖旧的。如果只在编辑器里改代码却不执行求值,REPL中的组件还是旧版本,浏览器不会有变化。第二步:触发视图更新
因为你用的是re-frame,视图渲染依赖订阅的数据源。如果只是修改了组件的静态文本(比如把"Hello from "改成"Hi from "),而订阅的::subs/name值没有变化,re-frame不会自动重绘视图。这时候需要手动触发更新:- 方式一:触发一个会改变订阅数据的事件,比如在REPL中执行
(re-frame.core/dispatch [::events/set-name "Updated Name"]),订阅数据变化后,视图会自动重新渲染,用上新的组件定义。 - 方式二:强制刷新视图,执行
(re-frame.core/clear-subscription-cache!),然后重新求值根组件的定义(比如你的根组件是(defn root [] [main-panel]),就重新执行这个defn),让应用重新挂载根组件。
- 方式一:触发一个会改变订阅数据的事件,比如在REPL中执行
你之前保存文件能看到变化,是因为保存触发了整个文件的重载——工具自动帮你重新求值了所有定义,并且可能触发了视图刷新。而用REPL单独重载组件,就需要手动完成上述两个步骤。
内容的提问来源于stack exchange,提问作者DoucheBro
相关产品推荐
相关产品推荐

