在Clojure(不是ClojureScript)中,如何检查给定组件是否实现了协议?
(defui MyComp
static my-protocol
(aaa [this] []))
(satisfies? my-protocol MyComp) ;; false
(satisfies? om.next.protocols/IReactChildren MyComp) ;; false
;; but
(.aaa ( MyComp nil nil nil nil)) ;; []
答案 0 :(得分:0)
据我所知,om.next不直接支持,因为defui
的行为与defrecord
不完全相同。
一种方式(由未经处理使用)是将协议的实现放在meta
数据中。与tony kay的对话:
tony.kay [6:02 PM]因此,clj land中的defui会添加“协议”的东西 元数据只需一秒...... https://github.com/untangled-web/untangled-client/blob/0b2fdfec1f0dde2d1d95b5a4d092131ca6fdc8f4/src/untangled/client/core.cljc#L90-L96 这就是为什么我们需要像
get-initial-state
这样的函数。我们可以打电话 cljs中的协议,但不是clj,因为js允许他的宏 将它们放入到位Om组件必须存储React 互操作的组件,所以我们实际上并没有使用协议本身, 只是模拟语法,这是我们需要的清理工作的一部分 在很多我们的文档/指南中梳理用于服务器端渲染。您 例如,不能在您的用户界面中调用initial-state
并期望 clj-land喜欢它,但我们的许多例子都是在它之前编写的 存在,如果你想做ss渲染,现在技术上是错误的
这也是om.next在服务器端渲染中的完成方式。
中看到不幸的是,由于这些方法需要覆盖defui
,因此它们不能很好地组合在一起。