0

尝试使用 clojurescript 中的 antd 我正在寻找一种惯用的方式来解构 js 对象。所以假设我们想做例如

import { Layout } from 'antd';

const { Header, Footer, Sider, Content } = Layout;

我怎样才能从 clojurescript 做到这一点而不必写冗长的

(let [Sider (.-Sider antd/Layout)
            Header (.-Header antd/Layout)
            Content (.-Content antd/Layout)
            Footer (.-Footer antd/Layout)]
  ;; and here goes the hiccup using Sider etc.
)

提前致谢

弗里克

4

2 回答 2

0

这是我目前更喜欢这样做的方式:

(let [[Sider Header Content Footer]
      (as-> antd/Layout $ [(.-Sider $) (.-Header $) (.-Content $) (.-Footer $)])]
;; and here goes the hiccup using Sider etc.
)

要不然:

(let [[Sider Header Content Footer]
      ((juxt #(.-Sider %) #(.-Header %) #(.-Content %) #(.-Footer %)) antd/Layout)]
;; and here goes the hiccup using Sider etc.
)
于 2019-10-10T17:40:52.553 回答
0

有用的解构形式 (:keys, :strs) 不起作用,因为常规 JS 对象不是 CLJS 映射。也许您可以创建一个 util 函数aget并使用常规位置解构?

(defn obj-props [obj props]
  (map #(aget obj (name %)) props))

(let [[Sider Header Content Footer] (obj-props antd/Layout '[Sider Header Content Footer])]
 ;; Sider, Header, etc. are bound here
 )

我在cljs-oops库的Cljs Cheat Sheet上找到了一个建议,其中又提到了 ,并且提到了aget docsagetgoog.object/get

于 2019-10-09T06:11:59.257 回答