一、Vue样式绑定

在Vue中,我们可以通过多种方式动态地绑定样式,让界面根据数据状态变化而自动更新样式。

1. class样式绑定

(1) 字符串写法

适用场景:样式的类名不确定,需要动态指定

<template><div><!-- 绑定class样式--字符串写法 --><div class="basic" v-bind:class="styleDyn" @click="changeStyle">{{name}}</div></div>
</template><script>
export default {data() {return {name: 'Vue样式绑定示例',styleDyn: 'normal'}},methods: {changeStyle() {this.styleDyn = this.styleDyn === 'normal' ? 'active' : 'normal';}}
}
</script><style>
.basic {width: 200px;height: 50px;line-height: 50px;text-align: center;border: 1px solid #ccc;margin-bottom: 10px;
}
.normal {background-color: #f5f5f5;color: #333;
}
.active {background-color: #42b983;color: white;font-weight: bold;
}
</style>

解析

  • 通过v-bind:class(可简写为:class)绑定一个字符串变量

  • 点击div时,changeStyle方法会切换styleDyn的值

  • 样式会在'normal'和'active'之间切换

(2) 数组写法

适用场景:要绑定的样式的个数不确定,名字也不确定

<template><div><!-- 绑定class样式--数组写法 --><div class="basic" :class="arr1">{{name}}</div><button @click="addClass">添加样式</button><button @click="removeClass">移除样式</button></div>
</template><script>
export default {data() {return {name: '数组写法示例',arr1: ['style1', 'style2']}},methods: {addClass() {this.arr1.push('style' + (this.arr1.length + 1));},removeClass() {this.arr1.pop();}}
}
</script><style>
.style1 {border-radius: 5px;
}
.style2 {box-shadow: 0 0 5px #999;
}
.style3 {transform: rotate(5deg);
}
.style4 {background: linear-gradient(to right, #ff9966, #ff5e62);
}
</style>

解析

  • 通过数组可以动态添加/移除多个class

  • 点击按钮可以动态修改数组内容,从而改变应用的样式

(3) 对象写法

适用场景:要绑定的样式的个数确定,名字也确定,但要动态决定是否使用

<template><div><!-- 绑定class样式--对象写法 --><div class="basic" :class="obj">{{name}}</div><button @click="toggleBold">切换加粗</button><button @click="toggleItalic">切换斜体</button></div>
</template><script>
export default {data() {return {name: '对象写法示例',obj: {bold: false,italic: true,underline: true}}},methods: {toggleBold() {this.obj.bold = !this.obj.bold;},toggleItalic() {this.obj.italic = !this.obj.italic;}}
}
</script><style>
.bold {font-weight: bold;
}
.italic {font-style: italic;
}
.underline {text-decoration: underline;
}
</style>

解析

  • 对象写法的键是class名,值是布尔值,决定是否应用该class

  • 可以通过修改对象的属性值来动态切换样式

2. 内联样式绑定

(1) 对象写法
<template><div><!-- 绑定内联style样式--对象写法 --><div class="basic" :style="styleObj">{{name}}</div><button @click="changeColor">改变颜色</button></div>
</template><script>
export default {data() {return {name: '内联样式对象写法',styleObj: {color: 'blue',fontSize: '20px',backgroundColor: '#f0f0f0'}}},methods: {changeColor() {const colors = ['red', 'green', 'blue', 'orange', 'purple'];this.styleObj.color = colors[Math.floor(Math.random() * colors.length)];}}
}
</script>

解析

  • 样式属性名需要使用驼峰命名法(如fontSize而不是font-size

  • 可以动态修改样式对象的属性值来改变元素样式

(2) 数组写法
<template><div><!-- 绑定内联style样式--数组写法 --><div class="basic" :style="styleArr">{{name}}</div></div>
</template><script>
export default {data() {return {name: '内联样式数组写法',styleArr: [{ color: 'red', fontSize: '18px' },{ backgroundColor: '#eee', padding: '10px' }]}}
}
</script>

解析

  • 数组中可以包含多个样式对象,它们会被合并后应用到元素上

  • 适用于需要组合多个样式对象的场景

二、条件渲染

Vue提供了两种条件渲染的方式:v-ifv-show

1. v-if 系列指令

<template><div><h2>v-if示例</h2><button @click="toggleShow">切换显示</button><p v-if="show">这是v-if控制的内容</p><p v-else-if="show === null">这是v-else-if控制的内容</p><p v-else>这是v-else控制的内容</p><template v-if="loginType === 'username'"><label>用户名</label><input placeholder="请输入用户名" key="username-input"></template><template v-else><label>邮箱</label><input placeholder="请输入邮箱" key="email-input"></template><button @click="toggleLoginType">切换登录方式</button></div>
</template><script>
export default {data() {return {show: true,loginType: 'username'}},methods: {toggleShow() {if (this.show === true) {this.show = null;} else if (this.show === null) {this.show = false;} else {this.show = true;}},toggleLoginType() {this.loginType = this.loginType === 'username' ? 'email' : 'username';}}
}
</script>

特点

  • v-if是真正的条件渲染,元素会被完全销毁和重建

  • v-if是惰性的,初始条件为假时什么也不做,直到条件变为真才会渲染

  • v-if可以和v-else-ifv-else一起使用,但必须保持结构连续

  • 使用key可以管理可复用的元素,避免Vue高效复用元素带来的问题

2. v-show 指令

<template><div><h2>v-show示例</h2><button @click="toggleVisible">切换显示</button><p v-show="visible">这是v-show控制的内容</p><!-- v-show不支持template语法 --><div v-show="visible"><p>v-show只是简单地切换CSS的display属性</p><p>无论条件如何,元素始终会被渲染并保留在DOM中</p></div></div>
</template><script>
export default {data() {return {visible: true}},methods: {toggleVisible() {this.visible = !this.visible;}}
}
</script>

特点

  • v-show只是简单地切换元素的displayCSS属性

  • 无论初始条件如何,元素始终会被渲染并保留在DOM中

  • v-show不支持<template>元素,也不能和v-else配合使用

3. v-if vs v-show 对比

特性v-ifv-show
渲染方式条件为假时不渲染DOM总是渲染,只是切换display
切换开销高(销毁/重建)低(只是CSS切换)
初始渲染开销低(条件为假时)高(总是会渲染)
适用场景切换不频繁频繁切换
支持语法支持template和v-else不支持template

选择建议

  • 如果需要非常频繁地切换,使用v-show更好

  • 如果在运行时条件很少改变,使用v-if更好

  • 如果涉及权限控制等一次性判断,优先使用v-if

三、综合实战示例

<template><div><h1>Vue样式与条件渲染综合示例</h1><!-- 样式绑定 --><div class="panel" :class="panelClasses"><h2>用户信息</h2><div v-if="userLoggedIn" class="user-info"><p>用户名: {{user.name}}</p><p>会员等级: {{user.level}}</p></div><div v-else class="login-prompt"><p>请先登录查看用户信息</p><button @click="login">登录</button></div></div><!-- 条件渲染 --><div class="control-panel"><button @click="toggleTheme">切换主题</button><button @click="toggleLoginStatus">切换登录状态</button><button @click="toggleWarning">切换警告状态</button></div><!-- 动态样式 --><div :style="warningStyle" v-show="showWarning">警告:这是一条重要提示信息!</div></div>
</template><script>
export default {data() {return {userLoggedIn: false,showWarning: false,darkTheme: false,user: {name: '张三',level: '黄金会员'},warningStyle: {padding: '10px',margin: '10px 0',borderRadius: '4px',color: 'white'}}},computed: {panelClasses() {return {'dark-theme': this.darkTheme,'logged-in': this.userLoggedIn,'warning-active': this.showWarning}}},methods: {login() {this.userLoggedIn = true;this.showWarning = false;},toggleTheme() {this.darkTheme = !this.darkTheme;this.warningStyle.backgroundColor = this.darkTheme ? '#ff7043' : '#f44336';},toggleLoginStatus() {this.userLoggedIn = !this.userLoggedIn;},toggleWarning() {this.showWarning = !this.showWarning;}}
}
</script><style>
.panel {padding: 20px;border: 1px solid #ddd;border-radius: 5px;margin-bottom: 20px;transition: all 0.3s ease;
}.dark-theme {background-color: #333;color: #fff;border-color: #555;
}.logged-in .user-info {background-color: #e8f5e9;padding: 10px;border-radius: 4px;
}.dark-theme.logged-in .user-info {background-color: #1b5e20;
}.login-prompt {text-align: center;padding: 20px;
}.login-prompt button {padding: 5px 15px;background-color: #42b983;color: white;border: none;border-radius: 3px;cursor: pointer;
}.control-panel {margin-bottom: 20px;
}.control-panel button {margin-right: 10px;padding: 5px 10px;cursor: pointer;
}.warning-active {border-left: 4px solid #f44336;
}
</style>

解析

  1. 综合使用了class的对象绑定语法,根据多个条件计算class

  2. 使用v-if和v-else实现条件渲染

  3. 使用v-show控制警告信息的显示/隐藏

  4. 动态修改内联样式

  5. 展示了不同场景下样式和条件渲染的应用

通过这个综合示例,我们可以看到Vue的样式绑定和条件渲染如何协同工作,创建出动态、响应式的用户界面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86451.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86451.shtml
英文地址,请注明出处:http://en.pswp.cn/web/86451.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

固态电池火热-美国固态电池企业QuantumScape宣布,产能规模化迈出了重要一步

美国固态电池企业QuantumScape宣布&#xff0c;其先进的Cobra隔膜工艺已成功集成到基线电池生产中&#xff0c;标志着公司生产能力规模化迈出了重要一步。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 600478 科力远 业绩固态电池 | 1.科力远发布20…

Python 商务数据分析—— NumPy 学习笔记Ⅰ

一、NumPy 简介 1.1 NumPy 特性 高性能科学计算库&#xff1a;专为处理多维数组设计&#xff0c;底层用 C 语言实现&#xff0c;运算速度远超 Python 原生列表。 矢量运算&#xff1a;支持批量数据操作&#xff0c;避免显式循环&#xff0c;代码更简洁高效。 广播机制&…

中州养老:搭建环境(第二节)

目录 项目初始工程搭建: 不同项目需要的前后端环境也不同 前端项目搭建: 熟悉模块的方式 代码阅读 如何开发一个接口 Swagger(接口文档) Api注解的说明 ​​​​​​​项目初始工程搭建: 公司项目分两种,新立项目(0-1)和已有项目开发(1-2) 熟悉项目结构,每个模块对应的…

[1-01-01].第78节:Java8新特性 - Lambda表达式

java基础语法大纲 一、Lambda 表达式 1.1.概述&#xff1a; 1.Lambda 是一个匿名函数&#xff0c;我们可以把 Lambda 表达式理解为是一段可以传递的代码&#xff08;将代码像数据一样进行传递&#xff09;2.使用Lambda 表达式可以写出更简洁、更灵活的代码。作为一种更紧凑的…

【2025.6.27 校内 NOI 模拟赛】总结(贪心, 容斥、组合计数, dsu on tree、 虚树)

文章目录 时间安排反思题解[六省联考 2017] 期末考试&#xff08;贪心&#xff0c; 枚举&#xff09;[JSOI2019] 神经网络&#xff08;容斥&#xff0c; 组合计数&#xff0c; 树背包&#xff09;[ZJOI2019] 语言&#xff08;dsu on tree&#xff0c; 虚树&#xff0c; 结论&am…

实际前端开发中,常用指令的封装

实际前端开发中&#xff0c;常用指令的封装 全局指令处理步骤main.ts指令目录结构src/directives/index.ts 一、输入框空格禁止指令1、指令文件clearSpace.ts2、指令使用 全局指令处理步骤 main.ts import { createApp } from "vue"; import App from "./App.…

鸿蒙OH南向开发 轻量系统内核(LiteOS-M)【异常调测】

基本概念 OpenHarmony LiteOS-M提供异常接管调测手段&#xff0c;帮助开发者定位分析问题。异常接管是操作系统对运行期间发生的异常情况进行处理的一系列动作&#xff0c;例如打印异常发生时异常类型、发生异常时的系统状态、当前函数的调用栈信息、CPU现场信息、任务调用堆栈…

算法-堆排序

文章目录 整体架构流程技术细节小结 整体架构流程 大顶推&#xff1a;是构建一个完整的二叉树 大顶推&#xff1a;即父节点的值大于左右子树的值。 循环构建大顶推 在给定的数组&#xff0c;既可以明确树的高度。 在循环的时候&#xff0c;构建树的高度从lgn至0。即从堆低往堆…

【鸿蒙HarmonyOS Next App实战开发】二维码生成技术实现与解析

随着移动应用开发中对便捷交互体验的需求日益增长&#xff0c;二维码作为信息传递的重要载体&#xff0c;其生成与使用变得越来越普遍。本文将基于鸿蒙HarmonyOS应用开发框架&#xff0c;详细介绍如何实现一个功能完备的二维码生成器&#xff0c;并附上完整代码解析。 注意该实…

1 Studying《Is Parallel Programming Hard》6-9

目录 Chapter 6 Partitioning and Synchronization Design 6.1 分区练习 6.2 设计准则 6.3 同步粒度 6.4 并行快速路径 6.5 超越党派分歧 6.6 分区、并行和优化 Chapter 7 Locking 7.1 活命 7.2 锁的类型 7.3 锁定实施问题 7.4 基于锁的存在性保证 7.5 锁定&a…

Java练习题精选16-20

Java练习题精选16-20 一、第十六题二、第十七题三、第十八题四、第十九题五、第二十题一、第十六题 现有一个存放学生成绩的数组{66, 77, 88, 99},要求将该数组正序输出每个下标所对应的元素。 public class Test {public static void main(String[] args) {int<

新能源知识库(68)汽车电镀与蒸汽

汽车电镀是提升零部件耐磨性、抗腐蚀性和美观性的关键工艺&#xff0c;其流程根据基材&#xff08;金属或塑料&#xff09;和部件功能需求有所差异。 汽车电镀是以 基材特性和 功能需求为导向的精密工艺&#xff1a; ​金属件​&#xff1a;核心流程为 ​除油→酸洗→电镀→钝…

Veo 3 视频生成大模型完整操作教程(2025)

随着 AI 多模态能力的飞跃&#xff0c;Google DeepMind 发布的 Veo 3 成为了生成视频领域的一颗重磅炸弹。它不仅能够根据文本生成高质量的视频画面&#xff0c;还能同步生成对白、背景音和环境音&#xff0c;是目前最接近真正“AI 导演”的大模型。 本文将带你详细了解 Veo 3…

10【认识文件系统】

1 认识硬件——磁盘 1.1 物理构成 磁盘是计算机中唯一的机械设备&#xff0c;同时也是一种外部存储设备&#xff08;外设&#xff09;。早期的计算机通常配备的是机械硬盘&#xff08;HDD&#xff09;&#xff0c;依靠磁头和盘片的机械运动来进行数据的读写。但随着用户对计算…

Windows命令连接符的安全风险分析与防御策略

1. 命令连接符简介 在 Windows 的命令行环境&#xff08;CMD/PowerShell&#xff09;中&#xff0c;命令连接符用于在同一行执行多个命令&#xff0c;提高效率。然而&#xff0c;攻击者常利用这些符号构造恶意命令&#xff0c;绕过安全检测或执行多阶段攻击。 常见命令连接符…

大屏可视化制作指南

一、大屏可视化概述 &#xff08;一&#xff09;概念 大屏可视化是指通过大屏幕展示复杂数据的视觉呈现形式&#xff0c;它借助图形、图表、地图等元素&#xff0c;将海量数据以直观易懂的方式呈现出来&#xff0c;帮助用户快速理解数据背后的含义和价值。 &#xff08;二&a…

Halcon ——— OCR字符提取与多类型识别技术详解

工业视觉实战&#xff1a;OCR字符提取与多类型识别技术详解 在工业自动化领域&#xff0c;OCR字符提取是产品追溯、质量控制和信息读取的核心技术。本文将深入解析Halcon中OCR字符提取的全流程&#xff0c;重点解释核心算子参数&#xff0c;并提供完整的工业级代码实现。 一、O…

嵌入式项目:基于QT与Hi3861的物联网智能大棚集成控制系统

关键词&#xff1a;MQTT、物联网、QT、网络连接、远程控制 一、系统概述 本系统是一套完整的智能大棚监控解决方案&#xff0c;由两部分构成&#xff1a; 基于Hi3861的嵌入式硬件系统&#xff08;负责环境数据采集和设备控制&#xff09;基于Qt开发的跨平台控制软件&#xf…

揭开 Git 裸仓库的神秘面纱:`git clone --mirror` 详解与使用指南

大家好&#xff01;在使用 Git 进行版本控制时&#xff0c;我们最熟悉的莫过于那些带有工作目录的本地仓库了——我们在里面编辑文件、提交代码&#xff0c;然后推送到远程仓库。但有时候&#xff0c;我们可能会遇到一种特殊的仓库&#xff1a;裸仓库&#xff08;Bare Reposito…

opensuse安装rabbitmq

您好&#xff01;安装 RabbitMQ 消息队列是一个非常棒的选择&#xff0c;它是许多现代应用架构中的核心组件。 在 openSUSE Tumbleweed 上安装 RabbitMQ 主要有两种流行的方式&#xff1a;一种是使用系统的包管理器 zypper&#xff0c;另一种是使用 Docker 容器。我将为您详细…