Bläddra i källkod

feat(utils): 增加bem方法

zhongmingkun 5 år sedan
förälder
incheckning
fc4848531a
1 ändrade filer med 46 tillägg och 0 borttagningar
  1. 46 0
      src/utils/bem.js

+ 46 - 0
src/utils/bem.js

@@ -0,0 +1,46 @@
+/**
+ * bem helper
+ * b() // "button"
+ * b("text") // "button__text"
+ * b({ disabled }) // "button button--disabled"
+ * b("text", { disabled }) // "button__text button__text--disabled"
+ * b(["disabled", "primary"]) // "button button--disabled button--primary"
+ */
+
+const ELEMENT = "__";
+const MODS = "_";
+
+function join(name, el, symbol) {
+  return el ? name + symbol + el : name;
+}
+
+function prefix(name, mods) {
+  if (typeof mods === "string") {
+    return join(name, mods, MODS);
+  }
+
+  if (Array.isArray(mods)) {
+    return mods.map(item => prefix(name, item));
+  }
+
+  const ret = {};
+  if (mods) {
+    Object.keys(mods).forEach(key => {
+      ret[name + MODS + key] = mods[key];
+    });
+  }
+
+  return ret;
+}
+
+export function useBEM(name) {
+  return function(el, mods) {
+    if (el && typeof el !== "string") {
+      mods = el;
+      el = "";
+    }
+    el = join(name, el, ELEMENT);
+
+    return mods ? [el, prefix(el, mods)] : el;
+  };
+}