前端_Vue_4.类与样式绑定、条件渲染

news2024/11/29 0:40:43

文章目录

  • 一、Class与Style绑定
    • 1.1. 绑定HTML class
      • 1.1.1. 绑定对象
      • 1.1.2. 绑定数组
      • 1.1.3. 在组件上使用
    • 1.2. 绑定内联样式
      • 1.2.1. 绑定对象
      • 1.2.2. 绑定数组
      • 1.2.3. 自动前缀
      • 1.2.4. 样式多值
  • 二、条件渲染
    • 2.1. v-if
    • 2.2. v-else
    • 2.3. v-else-if
    • 2.4. \<template\> 上的 v-if
    • 2.5. v-show
    • 2.6. v-if vs. v-show
    • 2.7. v-if 和 v-for


一、Class与Style绑定

数据绑定的一个常见需求场景是操纵元素的CSS class列表和内联样式。因为 class 和 style 都是attribute,我们可以和其他attribute一样使用 v-bind将它们和动态字符串绑定。但是,在处理比较复杂的绑定时,通过拼接生成字符串是麻烦且易出错的。因此,Vue专门为class 和 style的v-bind用法提供了特殊的功能增强。除了字符串外,表达式的值也可以是对象或数组。

内联样式
内联样式,又称行内样式,就是在HTML标签内部通过style属性来直接设置元素的CSS样式,
语法:
<标记 style="样式的属性名1:样式的属性值1;属性名2:属性值2;......"></标记>
由于内联样式直接插入标签中,故是最直接的一种方式,同时也是修改最不方便的样式

1.1. 绑定HTML class

1.1.1. 绑定对象

HTML中的class
在对网页中的class不了解的情况下,从面向对象直接跳转到网页开发,很可能会被class搞晕。因为网页中的class和面向对象中的class(类)有着天壤之别。
首先,它的语法是这样的:
<element class="classname"> // 在标签元素中的class attribute
标签中的class 属性通常用于指向样式表的类。在样式表中,定义类的样式。然后给标签的class attribute赋予该类。该标签的就会获得该类的样式。

我们可以给 :class (v-bind:class的缩写)传递一个对象来动态切换class:

<div :class="{ active: isActive }"></div>

上面的语法表示 active 是否存在取决于数据属性 isActive 的真假值。

你可以在对象中写多个字段来操作多个class。此外, :class 指令也可以和一般的 class attribute共存。举例来说,下面这样的状态:

data() {
	return {
		isActive: true,
		hasError: false
	}
}

配合以下模板:

<div
	class="static"
	:class="{ active: isActive, 'text-danger': hasError }"
></div>

渲染的结果会是:

<div class="static active"></div>

当 isActive 或者 hasError 改变时,class列表会随之更新。举例来说,如果 hasError 变为 true,class列表也会变成 “static active text-danger”。

前文讲过,布尔型attribute会根据true和false值来决定attribute是否会存在于DOM上。这边类似。

绑定的对象并不一定需要写成内联字面量的形式,也可以直接绑定一个对象:

data() {
	return {
		classObject: {
			active: true,
			'text-danger': false
		}
	}
}
<div :class="classObject"></div>

这也会渲染出相同的结果。我们也可以绑定一个返回对象的计算属性。这是一个常见且很有用的技巧:

data() {
	return {
		isActive: true,
		error: null
	}
},
computed: {
	classObject() {
		return {
			active: this.isActive && !this.error,
			'text-danger': this.error && this.error.type === 'fatal'
		}
	}
}
<div :class="classObject"></div>

1.1.2. 绑定数组

我们可以给 :class 绑定一个数组来渲染多个 CSS class:

data() {
	return {
		activeClass: 'active',
		errorClass: 'text-danger'
	}
}
<div :class="[activeClass, errorClass]"></div>

渲染的结果是:

<div class="active text-danger"></div>

如果你也想在数组中有条件地渲染某个class,你可以使用三元表达式:

<div :class="[isActive ? activeClass : '', errorClass]"></div>

errorClass 会一直存在,但 activeClass 只会在 isActive 为真时才存在。
然而,这可能在有多个依赖条件的class时会有些冗长。因此,也可以在数组中嵌套对象:

<div :class="[{ active: isActive }, errorClass]"></div>

1.1.3. 在组件上使用

本节假设你已经有了Vue组件的知识基础。如果没有,你也可以暂时跳过,以后再阅读。

对于只有一个根元素的组件,当你使用了 class attribute 时,这些class会被添加到根元素上,并与该元素上已有的class合并。

举例来说,如果你声明了一个组件名叫 MyComponent,模板如下:

<!--子组件模板-->
<p class="foo bar">Hi!</p>

在使用时添加一些class:

<!--在使用组件时-->
<MyComponent class="baz boo"/>

渲染出的HTML为:

<p class="foo bar baz boo">Hi</p>

Class的绑定也是同样的:

<MyComponent :class="{ active: isActive }"/>

当 isActive 为真时,被渲染的HTML会是:

<p class="foo bar active">Hi</p>

如果你的组件有多个根元素,你将需要指定哪个根元素来接收这个class。你可以通过组件的$attrs 属性来实现指定:

$
$符号是美元的简称,读作dollar,发音英 [ˈdɒlə(r)];美 [ˈdɑ:lə(r)]。
Vue在组件实例上暴露的内置API使用 $ 作为前缀。
<!--MyComponent 模板使用 $attrs 时-->
<p :class="$attrs.class">Hi!</p>
<span>This is a child component</span>
<MyComponent class="baz"/>

这将被渲染为:

<p class="baz">Hi!</p>
<span>This is a child component</span>

1.2. 绑定内联样式

1.2.1. 绑定对象

:style 支持绑定JavaScript对象值,对应的是HTML元素的style属性:

data() {
	return {
		activeColor: 'red',
		fontSize: 30
	}
}
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>

尽管推荐使用camelCase(驼峰式),但 :style 也支持 kebab-cased(短横线式) 形式的CSS属性key(对应其CSS中的实际名称),例如:

<div :style="{ 'font-size': fontSize + 'px' }"></div>

直接绑定一个样式对象通常是一个好主意,这样可以使模板更加简洁:

data() {
	return {
		styleObject: {
			color: 'red',
			fontSize: '13px'
		}
	}
}
<div :style="styleObject"></div>

同样的,如果样式对象需要更复杂的逻辑,也可以使用返回样式对象的计算属性。

1.2.2. 绑定数组

我们还可以给 :style 绑定一个包含多个样式对象的数组。这些对象会被合并后渲染到同一元素上:

<div :style="[baseStyles, overridingStyles]"></div>

1.2.3. 自动前缀

当你在 :style 中使用了需要浏览器特殊前缀的CSS属性时,Vue会自动为他们加上相应的前缀。Vue是在运行时检查该属性是否支持在当前浏览器中使用。如果浏览器不支持某个属性,那么将尝试加上各个浏览器特殊前缀,以找到哪一个是被支持的。

1.2.4. 样式多值

你可以对一个样式属性提供多个(不同前缀的)值,例如:

<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>

数组仅会渲染浏览器支持的最后一个值。在这个示例中,在支持不需要特别前缀的浏览器中会渲染为 display: flex。


二、条件渲染

2.1. v-if

v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回真值时才被渲染。

<h1 v-if="awesome">Vue is awesome!</h1>

2.2. v-else

也可以用 v-else 为 v-if 添加一个 “else区块”。

<button @click="awesome = !awesome">Toggle</button>
<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no 😢</h1>

在这里插入图片描述
一个 v-else 元素必须跟在一个 v-if 或者 v-else-if 元素后面,否则它将不会被识别。

2.3. v-else-if

顾名思义, v-else-if 提供的是相应于 v-if 的 “else if区块”。它可以连续多次重复使用:

<div v-if="type === 'A'">
	A
</div>
<div v-else-if="type === 'B'">
	B
</div>
<div v-else-if="type === 'C'">
	C
</div>
<div v-else>
	Not A/B/C
</div>

和 v-else 类似,一个使用 v-else-if 的元素必须紧跟在一个 v-if 或一个 v-else-if 元素后面。

2.4. <template> 上的 v-if

因为 v-if 是一个命令,他必须依附于某个元素。但如果我们想要切换不止一个元素呢?在这种情况下我们可以在一个 <template> 元素上使用 v-if ,这只是一个不可见的包装器元素,最后渲染的结果并不会包含合格 <template> 元素。

<template v-if="ok">
	<h1>Title</h1>
	<p>Paragraph 1</p>
	<p>Paragraph 2</p>
</template>

v-else 和 v-else-if 也可以在 <template> 上使用。

2.5. v-show

另一个可以用来按条件显示一个元素的指令是 v-show 。其用法基本一样:

<h1 v-show="ok">Hello!</h1>

不同之处在于 v-show 会在DOM渲染中保留该元素;v-show 仅切换了该元素上名为 display 的CSS属性。

v-show 不支持在<template>元素上使用,也不能和 v-else 搭配使用。

2.6. v-if vs. v-show

v-if 是 “真实的” 按条件渲染,因为它确保了在切换时,条件区块内的事件监听器和子组件都会被销毁与重建。

v-if 也是惰性的:如果在初次渲染时条件值为false,则不会做任何事。条件区块只有当条件首次变为true时才被渲染。

相比之下, v-show 简单许多,元素无论初始条件如何,始终会被渲染,只有CSS display属性会被切换。

总的来说, v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要频繁切换,则使用 v-show 较好;如果在运行时绑定条件很少改变,则 v-if 会更合适。

2.7. v-if 和 v-for

当 v-if 和 v-for 同时存在于一个元素上的时候, v-if 会首先被执行。

警告
同时使用 v-if 和 v-for 是不推荐的,因为这样两者的优先级不明显。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑开不了机系统应该如何恢复正常

电脑不仅携带方便&#xff0c;而且功能也十分强大&#xff0c;不过电脑使用时会时不时出现问题&#xff0c;如果电脑开不了机怎么办 怎么回事?这是我们经常会遇到的这种的问题&#xff0c;今天小编就和大家分享电脑开不了机了的原因及解决方法。 工具/原料&#xff1a; 系统…

outlook中抄送操作和163撤回邮件

(1)CC和BCC 电子邮件中的CC 英文全称是 Carbon Copy(抄送)。 电子邮件中的BCC英文全称是 Blind Carbon Copy(暗抄送)。 两者的区别在于在BCC栏中的收件人可以看到所有的收件人名(TO&#xff0c;CC&#xff0c;BCC)&#xff0c;而在TO和CC栏中的收件人看不到BBC的收件人名。 …

Android 代码混淆Proguard

混淆概念 Android代码混淆&#xff0c;又称Android混淆&#xff0c;是伴随着Android系统的流行而产生的一种APP保护技术&#xff0c;用于保护APP不被破解和逆向分析。 在Android的具体表现就是打包时&#xff0c;将项目里的包名、类名、变量名根据混淆规则进行更改&#xff0c…

【POJ No. 1743】音乐主题 Musical Theme

【POJ No. 1743】音乐主题 Musical Theme 北大OJ 题目地址 【题意】音乐旋律被表示为N &#xff08;1≤N ≤20000&#xff09;个音符的序列&#xff0c;它们是[1, 88]内的整数&#xff0c;每个音符都代表钢琴上的一个键。许多作曲家都围绕一个重复的主题谱写音乐&#xff0c;该…

建木HA部署

背景 在建木v2.6.1之前&#xff0c;建木Server仅支持单机部署&#xff0c;如果出现单机故障&#xff0c;难以应用于在线场景&#xff0c;并且单机压力过大时&#xff0c;会影响系统延展性。 什么是HA HA&#xff08;High Availability Cluster&#xff09;是高可用集群系统的…

【软件测试】开发人员不鸟自己?看看资深测试如何做的......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试人员经常抱怨开…

jsp+servlet+mysql实现的新闻发布管理系统源码+运行教程+文档

今天给大家演示一下一款由jsp servlet mysql实现的新闻发布管理系统&#xff0c;主要实现了前台游客浏览新闻、评论新闻&#xff0c;后台管理员管理新闻等功能&#xff0c;新闻有热点新闻、最新更新等方式在首页展示&#xff0c;还有幻灯片展示重大新闻等功能&#xff0c;满足了…

一招解决开发环境问题——远程容器开发指南

前言 使用C作为主要开发语言的程序猿们应该会认同搭建开发环境是一件烦人的事情。为了编译一个程序不仅需要下载各种依赖包&#xff0c;还可能面临本地系统不兼容、编译器版本不一致、包版本冲突等各种问题。笔者在运营iLogtail开源社区的过程中发现开发和调试环境问题也是成员…

web网页设计期末课程大作业——HTML+CSS+JavaScript美食餐饮文化主题网站设计与实现

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

为云原生插上翅膀,天翼云弹性存储CStor-CSI助力容器腾飞

云原生是一种新型技术体系&#xff0c;已成为云计算未来的发展方向&#xff0c;越来越多的数字化项目与云原生紧密相连。作为云原生的基座&#xff0c;容器是必不可少的核心技术。然而&#xff0c;以Docker为代表的容器引擎&#xff0c;并不能满足大批量的容器业务需求&#xf…

推荐一套yyds的Java学习资料(非常经典)

Java 是全球最受欢迎的编程语言之一&#xff0c;在世界编程语言排行榜 TIOBE 中&#xff0c;Java 一直霸占着前三名&#xff0c;有好多年甚至都是第一名。 最近几年&#xff0c;全球约有 1/3 的专业程序员将 Java 作为主要编程语言&#xff0c;这一比例在我国更是高达 1/2&…

CTFSHOW web入门 java反序列化篇 web855

web855 得到源码后看到readObject里面有两条路可以走 1、写文件&#xff0c;文件名固定&#xff0c;文件内容开头固定后面内容可以通过write写入 2、执行命令&#xff0c;但是shellcodoe是不可控的&#xff08;static&#xff09; 如果两条路分开来看都没啥可利用的价值&…

ai绘画新功能上线,说一句话就能生成好看的AI画作

ai绘画可以将自己的图片生成二次元&#xff0c;还可以通过关键词描述生成好看的画作&#xff0c;这些我们都早已尝试过了&#xff0c;并且也玩得不亦乐乎&#xff0c;但AI绘画还能进行语音创作&#xff0c;只需要同AI说一句话&#xff0c;它就能创造出相关的画作&#xff0c;所…

【Linux开发笔记】VSCode+WSL——Windows搭建最轻量便捷的Ubuntu/Linux开发环境

1.概述 我们一般搭建Ubuntu开发环境都是采用VMware或者VirtualBox的虚拟机安装Ubuntu的方案&#xff0c;但是这样的方案会有几个弊端&#xff1a; 安装、启动慢&#xff1b;使用图形桌面时卡顿、鼠标不跟手、打字有延迟&#xff1b;磁盘空间占用比较大&#xff1b;内存资源占用…

安卓开发Android studio学习笔记21:ViewPager两种方式实现引导页

实现引导页一、ViewPager实现引导页第一步&#xff1a;创建三个xml1.page1.xml2.page2.xml3.page3.xml第二步&#xff1a;创建适配器GuideAdapter第三步&#xff1a;创建引导页原点1.activity_guide.xml2.GuideActivity.java二、 ViewPager&#xff08;2&#xff09;实现引导页…

[附源码]Node.js计算机毕业设计电影售票管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Docker中的bridge模式,可以这么设置

最近有几个已经就业的小伙伴&#xff0c;过来问千锋健哥关于Docker网络配置的问题&#xff0c;他们在实际开发中还是有些疑问。关于Docker网络这一块的内容确实很多&#xff0c;为了让大家搞清楚这个问题&#xff0c;健哥准备搞几篇系列文章&#xff0c;来为各位小伙伴解惑。这…

小游戏开发者流量变现指南

2018年微信在其6.6.1版本中宣布支持小游戏&#xff0c;之后的几年&#xff0c;但凡能掀起各大社交平台上病毒式传播的&#xff0c;几乎都是小游戏。 小游戏玩法简单&#xff0c;传播机制简单&#xff0c;套路简单&#xff0c;连赚钱的本质也简单。就拿近期火爆的《羊了个羊》小…

程序员也可以很浪漫,精选10个圣诞节特效及源码

最近离圣诞节不远了、整理了一些关于圣诞相关的前端特效网页设计和小游戏的代码送大家、直接上效果吧。 代码过长的 可预览获取 圣诞节快乐 - 文字渐入动画 <body><svg viewport"0 0 300 300"><text class"Merry" x"150" y&qu…

货淋室及货通道维护要点有哪些

货淋室及货淋通道维护要点&#xff0c;货淋室是货物进入洁净室所必需的通道&#xff0c;它可以减少货物进出洁净室所带来的污染问题。 货淋室及货淋通道维护要点&#xff1a; 1、定期使用仪器测定设备的各项技术指标&#xff0c;如不符合技术参数要求应及时予以处理。 2、根…