在Vue3工程中封装一个bem规范的hooks

简介: # 引言好多小伙伴的css命名上比较头疼,今天我们来一起学习一下bem规范,并在Vue3项目中封装个函数用于返回bem规范的命名。# 什么是bembem是block element modifier的缩写,b对应block(块),e对应element(元素),m对应modifier(修饰符)。bem是由Yandex团队提出的一种前端命名**css**的命名规范。> - -中划线,作为连字符使用,用于某个块或者某个子元素的多单词间的连接记号。> - __ 双下划线:用于连接块和块之间的子元素。> - _ 单下划线 :用来描述一个块或者块的子元素的一种状态。# demo

引言

好多小伙伴的css命名上比较头疼,今天我们来一起学习一下bem规范,并在Vue3项目中封装个函数用于返回bem规范的命名。

什么是bem

bem是block element modifier的缩写,b对应block(块),e对应element(元素),m对应modifier(修饰符)。

bem是由Yandex团队提出的一种前端命名css的命名规范。

  • -中划线,作为连字符使用,用于某个块或者某个子元素的多单词间的连接记号。
  • __ 双下划线:用于连接块和块之间的子元素。
  • _ 单下划线 :用来描述一个块或者块的子元素的一种状态。

demo

我们来一起看一下bem的demo

el-form
el-input__inner
el-form--default
el-form-item
el-scrollbar__wrap--hidden-default
el-form-item--default
el-form-item__content--xxx
is-success或者is-required

实战

接下来我们在工程中封装一个hooks,目录下创建use-namespace目录,use-namespace目录下创建index,ts文件,先看下文件内容,文件内容如下:

import { computed, unref } from "vue";
// 默认命名前缀
export const defaultNamespace = "etu";
export const statePrefix = "is";

const _bem = (
  namespace: string,
  block: string,
  blockSuffix: string,
  element: string,
  modifier: string,
) => {
  let cls = `${namespace}-${block}`;

  if (blockSuffix) {
    cls += `-${blockSuffix}`;
  }

  if (element) {
    cls += `__${element}`;
  }

  if (modifier) {
    cls += `--${modifier}`;
  }
  return cls;
};

export const useNamespace = (block: string) => {
  // 命名前缀也就是命名空间
  const namespace = computed(() => defaultNamespace);
  // 创建块 例如:el-form
  const b = (blockSuffix = "") =>
    _bem(unref(namespace), block, blockSuffix, "", "");
  // 创建元素 例如:el-input__inner
  const e = (element?: string) =>
    element ? _bem(unref(namespace), block, "", element, "") : "";
  // 创建块修改器 例如:el-form--default
  const m = (modifier?: string) =>
    modifier ? _bem(unref(namespace), block, "", "", modifier) : "";
  // 创建前缀块元素 例如:el-form-item
  const be = (blockSuffix?: string, element?: string) =>
    blockSuffix && element
      ? _bem(unref(namespace), block, blockSuffix, element, "")
      : "";
  // 创建元素修改器 例如:el-scrollbar__wrap--hidden-default
  const em = (element?: string, modifier?: string) =>
    element && modifier
      ? _bem(unref(namespace), block, "", element, modifier)
      : "";
  // 创建块前缀修改器 例如:el-form-item--default
  const bm = (blockSuffix?: string, modifier?: string) =>
    blockSuffix && modifier
      ? _bem(unref(namespace), block, blockSuffix, "", modifier)
      : "";
  // 创建块元素修改器 例如:el-form-item__content--xxx
  const bem = (blockSuffix?: string, element?: string, modifier?: string) =>
    blockSuffix && element && modifier
      ? _bem(unref(namespace), block, blockSuffix, element, modifier)
      : "";
  // 创建动作状态 例如:is-success is-required
  const is: {
    (name: string, state: boolean | undefined): string;
    (name: string): string;
  } = (name: string, ...args: [boolean | undefined] | []) => {
    const state = args.length >= 1 ? args[0]! : true;
    return name && state ? `${statePrefix}-${name}` : "";
  };

  return {
    namespace,
    b,
    e,
    m,
    be,
    em,
    bm,
    bem,
    is,
  };
};

接下来我们在使用的时候,比如需要创建一个形如el-menuGroup__mode,el-menuGroup-menuTrigger__bgColor--textColor的类,我们可以导入我们封装好的规范。

<script setup lang="ts" name="EtuMenuGroup">
import { computed } from "vue";
import { useNamespace } from "@etu-design/hooks";

const props = defineProps({
    // 无关代码省略了...
});
const bem = useNamespace("menuGroup");
const tClass = computed(() => {
  // el-form-item__content--xxx
  return [
    bem.e(props.mode),
    bem.bem(props.menuTrigger, props.bgColor, props.textColor),
  ];
});
</script>

好处

bem有很多好处,除了命名规范易读,如果写scss的同学们可能会发现,bem的命名规范能完美的发挥scss的特性。

注意

bem不宜嵌套过深,一般推荐不超过四层。

相关文章
|
4天前
|
前端开发 JavaScript API
基于Vue3+Hooks实现4位随机数和60秒倒计时
本文介绍了如何在Vue3中使用Hooks API来实现生成4位随机数和执行60秒倒计时的功能,并提供了详细的代码示例和运行效果展示。
21 1
基于Vue3+Hooks实现4位随机数和60秒倒计时
|
3天前
|
JavaScript 算法 API
Vue 3有哪些新特性
【8月更文挑战第16天】Vue 3有哪些新特性
20 1
|
4天前
|
JavaScript UED
如何在Vue3项目中使用防抖节流技巧
在Vue 3项目中使用防抖和节流技巧以优化组件性能,包括使用`lodash`库和自定义实现这两种方法。
8 0
如何在Vue3项目中使用防抖节流技巧
|
4天前
|
JavaScript
创建 Vue3 项目
创建 Vue3 项目
10 0
|
3天前
|
JavaScript
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
这篇文章介绍了在Vue项目中如何实现执行删除等危险操作时的二次确认机制,使用Element UI的`el-popconfirm`组件来弹出确认框,确保用户在二次确认后才会执行删除操作。
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
|
3天前
|
JavaScript
如何创建一个Vue项目(手把手教你)
这篇文章是一篇手把手教读者如何创建Vue项目的教程,包括使用管理员身份打开命令行窗口、找到存放项目的位置、通过vue-cli初始化项目、填写项目信息、进入项目目录、启动项目等步骤,并提供了一些常见第三方库的引入方法。
如何创建一个Vue项目(手把手教你)
|
3天前
|
前端开发
StringBoot+Vue实现游客或用户未登录系统前、可以浏览商品等信息、但是不能购买商品或者加入购物车等操作。登录系统显示用户的登录名(源码+讲解)
这篇文章介绍了使用StringBoot+Vue实现用户登录状态判断的方法,包括前端加载用户信息和后端设置session的源码示例。
|
4天前
|
JavaScript 编译器
成功解决:Module build failed: Error: Vue packages version mismatch
这篇文章记录了解决Vue项目中遇到的"Module build failed: Error: Vue packages version mismatch"错误的步骤,原因是项目中Vue依赖的版本不一致,解决方法是删除`node_modules`后重新安装指定版本的Vue和`vue-template-compiler`,确保版本匹配,最终成功运行项目。
成功解决:Module build failed: Error: Vue packages version mismatch
|
4天前
|
JavaScript
在Vue中使用Avue、配置过程以及实际应用
这篇文章介绍了作者在Vue项目中集成Avue组件库的完整过程,包括安装、配置和实际应用,展示了如何利用Avue实现动态表单和数据展示的功能。
在Vue中使用Avue、配置过程以及实际应用
|
4天前
|
JavaScript
Vue devDependencies 与 dependencies 能别
Vue devDependencies 与 dependencies 能别
10 3