You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue中如何将prop作为BEM修饰符实现类名拼接?

解决Vue组件中用Prop作为BEM修饰符的类名拼接问题

你遇到的问题是因为在Vue模板里直接用Mustache语法({{}})拼接类名的方式不符合Vue的模板规则,下面给你几种简单可行的实现方案:

方式一:数组语法动态绑定类名

这是最直接的写法,把固定类名和动态修饰符类名放在数组里即可:

<div :class="['badge', `badge--${$props.type}`]">

这里用ES6模板字符串拼接修饰符类名,Vue会自动将数组里的类名合并成最终的class属性,完全符合BEM命名规范。

方式二:对象语法(带存在性判断)

如果想避免type为空时出现badge--这种无效类名,可以用对象语法做个简单判断:

<div :class="{
  'badge': true,
  [`badge--${$props.type}`]: $props.type
}">

只有当type存在且不为空字符串时,对应的修饰符类名才会被添加,更严谨。

方式三:计算属性(推荐复杂场景)

如果组件的类名逻辑需要复用或者后续有扩展需求,用计算属性会让代码更清晰:

<template>
  <div :class="badgeClasses">
    <!-- 组件内容 -->
  </div>
</template>

<script>
export default {
  props: {
    type: {
      type: String,
      default: 'default' // 设置默认值,保证总有合法的修饰符
    }
  },
  computed: {
    badgeClasses() {
      return ['badge', `badge--${this.type}`]
      // 也可以用对象写法做判断:
      // return {
      //   'badge': true,
      //   [`badge--${this.type}`]: !!this.type
      // }
    }
  }
}
</script>

为什么原来的写法会报错?

在Vue模板里,{{}}是用来插值文本内容的,不能直接在HTML属性中这样拼接变量。直接写class="badge badge--{{this.$props.type}}"会被当成普通字符串处理,不会解析$props.type的值,自然就会出现类名错误或者语法问题。

内容的提问来源于stack exchange,提问作者LeBlaireau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:27:29