首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用specter合并两个不同的集合?

如何使用specter合并两个不同的集合?
EN

Stack Overflow用户
提问于 2019-08-19 12:29:00
回答 1查看 118关注 0票数 1

我试图编写一个合并方法来动态生成CSS样式。这个方法应该采用breakpoints,styles param,并创建一个映射,我们用它来使用stylefy进行样式化。

我试着用幽灵来做这件事,但是无法得到想要的结果。

到目前为止我尝试过的代码:

代码语言:javascript
复制
(defn merge-style
  [breakpoints style]
  (let [media-queries (s/transform [s/ALL] #(hash-map :min-width (str %1 "px")) breakpoints)]
  breakpoints))

该方法的工作方式如下:

代码语言:javascript
复制
(def breakpoints ["320px" "600px" "1280px"])
(def style {:padding-top ["20px" "30px" "40px" "50px"]
            :margin "30px"
           })

(merge-style breakpoints style)

输出应该如下所示:

代码语言:javascript
复制
{:padding-top "20px"
 :margin "30px"
 ::stylefy/media {{:min-width "320px"} {:padding-top "30px"}
                  {:min-width "600px"} {:padding-top "40px"}
                  {:min-width "1280px"} {:padding-top "50px"}}
 }

解决方案:我使用以下函数为自己解决了这个问题

代码语言:javascript
复制
(defn- get-media-queries
  [breakpoints styles]
  (let [base-style (s/transform [s/MAP-VALS] #(%1 0) styles)
        styles-maps (s/setval [s/MAP-VALS empty?] s/NONE (s/setval [s/MAP-VALS s/FIRST] s/NONE styles))
        styles-list (map (fn [[key val]] (map #(hash-map key %1) val)) styles-maps)
        styles-final (apply vdu/merge-maps styles-list)
        breaks (map #(hash-map :min-width %1) breakpoints)
        styles-merged (into {} (mapv vector breaks styles-final))
        ]
    (assoc base-style ::stylefy/media styles-merged)))

非常感谢你提供的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-19 16:52:19

这件事不需要幽灵。只需使用基本Clojure:

代码语言:javascript
复制
(ns tst.demo.core
  (:use demo.core tupelo.core tupelo.test) )

(def desired
  {:padding-top   "20px"
   :margin        "30px"
   :stylefy/media {{:min-width "320px"}  {:padding-top "30px"}
                   {:min-width "600px"}  {:padding-top "40px"}
                   {:min-width "1280px"} {:padding-top "50px"}}})

(def breakpoints [320 600 1280])
(def padding-top ["30px" "40px" "50px"])
(def base {:padding-top "20px"
           :margin      "30px"})

(dotest
  (let [mw     (for [it breakpoints]
                 {:min-width (str it "px")})
        pt     (for [it padding-top]
                 {:padding-top it})
        pairs  (zipmap mw pt)
        result (assoc base :stylefy/media pairs)]
    (is= desired result)))

注意,由于我没有stylefy的命名空间别名,所以我只使用关键字的单冒号版本。

更新2019年-9-12

我只是重新浏览了这篇文章,并且注意到我应该使用zipmap而不是zip,即使以前的版本(意外地!)得到正确的答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57556783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档