Clojurescript: как идиоматическим способом уничтожить js-объект - PullRequest
0 голосов
/ 08 октября 2019

Пытаясь использовать antd из clojurescript, я ищу идиоматический способ деструктурирования 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.
)

заранее спасибо

fricke

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Вот как я сейчас предпочитаю это делать:

(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.
)
0 голосов
/ 09 октября 2019

Полезные формы деструктуризации (: keys,: strs) не будут работать, потому что обычный объект JS не является картой CLJS. Может быть, вы можете создать утилитарную функцию около 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 cljs-oops библиотека, в которой, в свою очередь, упоминается aget, а aget docs упоминается goog.object/get ?

...