基础/类与样式绑定

标签的 classstyle 也属于 attribute,因此可以通过 v-bind 指令进行绑定。

先来复习一下 Vue 的指令:

v-baz:value.foo="bar"

前缀 v- ,指令名称 baz,参数是 : 后面的 value ,赋值是一个表达式 bar 回去找名称为 bar 的变量,修饰符是 foo

绑定HTMl class

html 复制代码
<div :class="[
  'base-class',
  ...classObj,
  { active: isActive },
  otherClass
]" ></div>

<script setup>
  import { ref, computed } from 'vue'
  
  const isActive = ref(false)
  const classObj = ref({
    outer: true
  })
  const otherClass = computed(() => 'other-class')
</script>

文档里有一个示例

html 复制代码
<div :class="classObject"></div>

<script setup>
  import { ref, computed } from 'vue'
  
  const isActive = ref(true)
  const error = ref(null)
  const classObject = computed(() => ({ 
    active: isActive.value && !error.value,
    'text-danger': error.value && error.value.type === 'fatal'
  }))
</script>

这是通过计算属性的方式去绑定 class ,但是中带你不在这里,不知道大家有没有注意到 const error = ref(null) 这个 error 变量初始化赋值的是 null

然后在进行判断的时候 error.value && error.value.type === 'fatal' 检测 error 有值并且 errortype 属性值为 fatal 时渲染这个 text-danger class。

在 《JavaScript高级程序设计》 第四版这本书里讲到:null 通常作为空对象的指针来使用,如果这个变量要存储一个对象,但是现在又没有这个要存储的数据,那么就用null来填充这个变量,也就是使用null作为初始值。当然你也可以存储任何类型的值。

在组件上绑定 class

在只有一个根元素的组件中,给组件绑定 class 最终会应用到组件根元素上。

html 复制代码
<!-- 组件A A.vue -->
<div class="foo"></div>
html 复制代码
<!-- 父组件中使用 -->
<div>
  <A class="baz" />
</div>
html 复制代码
<!-- 组件A 最终生效的class -->
<div class="foo baz"></div>

什么是只有一个根元素的组件

html 复制代码
<template>
  <!-- 根元素 div -->
  <div>
    <h1>Hello</h1>
    <p>lorem</p>
  </div>
</template>

什么是多个根元素的组件

html 复制代码
<template>
  <!-- 第一个根元素 div -->
  <div></div>
  <!-- 第二个根元素 h1 -->
  <h1>Hello</h1>
  <!-- 第三个根元素 p -->
  <p>lorem</p>
</template>

绑定内联样式 也就是绑定 style

html 复制代码
<template>
   <h1 
     :style="[
       {
         color: isActive ? 'red' : '#000',
         fontSize: `${curFontSize}px`,
         ...computedStyle
       },
       otherStyle
     ]"
   >
     Hello
   </h1>
</template>

<script setup>
  import { ref, computed } from 'vue'
  
  const isActive = ref(true)
  const curFontSize = ref(20)
  const otherStyle = ref({
    padding: '8px',
    margin: '8px',
    border: '1px solid #000',
  })
  const computedStyle = computed(() => {
    if (isActive.value) {
      return {
        boxShadow: '0 0 10px 0 rgba(0,0,0,0.15)'
      }
    }
    return {}
  })
</script>
相关推荐
~无忧花开~12 分钟前
React生命周期全解析
开发语言·前端·javascript·react.js·前端框架·react
cj814031 分钟前
Prompt,Agent,Skill,Mcp分别于langchain有什么关系
前端
SuperEugene1 小时前
Axios + Vue 错误处理规范:中后台项目实战,统一捕获系统 / 业务 / 接口异常|API 与异步请求规范篇
前端·javascript·vue.js·前端框架·axios
行走的陀螺仪1 小时前
手写 Vue3 极简 i18n
前端·javascript·vue.js·国际化·i18n
羽沢311 小时前
一篇简单的STOMP教程QAQ
前端·javascript·stomp
code_Bo1 小时前
使用AI完成Swagger接口类型在前端自动生成的工具
前端·后端·架构
加个鸡腿儿1 小时前
从"包裹器"到"确认按钮"——一个组件的三次重构
前端·vue.js·设计模式
子兮曰1 小时前
AI写代码坑了90%程序员!这5个致命bug,上线就炸(附避坑清单)
前端·javascript·后端
猪八宅百炼成仙1 小时前
PanelSplitter 组件:前端左右布局宽度调整的实用解决方案
前端
BUG胡汉三2 小时前
自建在线文档编辑服务:基于 Collabora CODE + Spring Boot + Vue 3 的完整实现
vue.js·spring boot·后端·在线编辑