clojure - 如何在clojurescript中自定义本机对象的打印功能
问题描述
我正在寻找自定义反应元素的显示方式,这是代码:
(require ["react" :as react])
(defn react-element? [obj]
(if-let [sym (aget obj "$$typeof")]
(= js/Symbol
(type sym))))
(extend-protocol IPrintWithWriter
object
(-pr-writer [obj writer _]
(js/console.log "hello")
(cond (react-element? obj)
(write-all writer
(-> (js->clj obj)
(dissoc "$$typeof")
str))
:else
(write-all writer (str obj)))))
(react/createElement "h2" nil "Hello, World!")
我期望输出是
{:type "h2", :key nil, :ref nil, :props {:children "Hello, World!"}}}
但它仍然打印出正常的#js 元素:
#js {"$$typeof" Symbol(react.element),
:type "h2", :key nil, :ref nil,
:props #js {:children "Hello, World!"}, :_owner nil}
有没有办法自定义这种行为?
解决方案
根本原因是在标准lib打印代码中,implements?
被使用和satisfies?
未被使用。这有效地将打印覆盖限制为非本机类型的内容。(implements?
不适用于本机类型)。
这可能不是故意的,可以使用https://dev.clojure.org/jira/browse/CLJS-2812修复
推荐阅读
- windows-10 - 尝试在 virtualbox 上运行 macOS Catalina 10.15 时卡在 EFI shell 上
- c# - ML 模型在重新训练后不会重新加载(仅在之前进行过预测的情况下)
- php - 使用 htaccess 和 php 开关配置 url 时我很困惑
- solidity - 以太坊构造函数混淆
- flutter - 如何在三个容器之间切换
- mongodb - 转储在 docker 容器上运行的 mongo 数据库
- node.js - Mongoose 和 Express JS,查找范围内的文档
- typescript - 如何将索引签名与已知属性混合?
- python - 我怎样才能得到无尽的期望?
- javascript - JavaScript 如何创建动态变量