ClojureScript中如何通过映射一次性设置JS对象的多个属性?
在ClojureScript中一次性设置DOM元素的多个属性
你原来的写法行不通,因为set! img {:src ...}是把整个映射直接赋值给img变量,而不是修改DOM元素的属性——DOM元素是JavaScript对象,得逐个操作它的属性。
要实现一次性设置多个属性,最简单的方式是自己写个辅助函数,遍历属性映射来逐个设置:
(defn set-dom-attrs! [elem attrs] (doseq [[attr-key value] attrs] (js/Reflect.set elem (name attr-key) value)))
然后这样使用:
(let [img (.createElement js/document "img")] (set-dom-attrs! img {:src "bunny-512.png" :height 64 :width 64}) ; 后续处理img的逻辑 )
如果不想单独定义函数,也可以用reduce直接实现:
(let [img (.createElement js/document "img") attrs {:src "bunny-512.png" :height 64 :width 64}] (reduce (fn [elem [k v]] (js/Reflect.set elem (name k) v) elem) img attrs))
要是你的项目用到了Reagent、Rum这类前端库,它们本身就提供了更简洁的DOM属性设置方式;但如果是原生ClojureScript开发,上面的方法就足够解决问题。
内容的提问来源于stack exchange,提问作者Nicolas Modrzyk
相关产品推荐
相关产品推荐

