科百科
当前位置: 首页 范文大全

v-if和v-show不能同时使用(v-bind及class)

时间:2023-06-08 作者: 小编 阅读量: 4 栏目名: 范文大全

在数据绑定中,最常见的两个需求就是元素的样式名称class和内联样式style的动态绑定,它们也是HTML属性,因此可以使用v-bind指令。只需要用v-bind计算出表达式最终的字符串也可以,不过有时候表达式的逻辑较为复杂,使用字符串拼接方法较难阅读和维护,所以Vue.js增强了对class和sytle的绑定。

DOM 元素经常会动态地绑定一些 class 类名或 style 样式。

一、了解 v-bind 指令

v-bind 指令的主要用法是动态更新 HTML 元素上的属性,可使用 v-bind 指令绑定 class 和 style 。如下,示例:

<div > <a v-bind:href="url">我是一个链接</a> <img v-bind:src="http://img.studyofnet.comimgUrl"> <!-- 缩写为 --> <a :href="url">我是一个链接</a> <img :src="http://img.studyofnet.comimgUrl"> </div> <script> var app = new Vue({ el: "#app", data: { url: 'https://www.github.com', imgUrl: 'http://bingbinlee.com/img.pang' } }) </script>

链接的 href 属性和图片的 src 属性都被动态设置了,当数据变化时,就会重新渲染。

在数据绑定中,最常见的两个需求就是元素的样式名称 class 和内联样式 style 的动态绑定,它们也是 HTML 属性,因此可以使用 v-bind 指令。只需要用 v-bind 计算出表达式最终的字符串也可以,不过有时候表达式的逻辑较为复杂,使用字符串拼接方法较难阅读和维护,所以 Vue.js 增强了对 class 和 sytle 的绑定。

二、绑定 class 的几种方式

2.1 对象语法

给 v-bind:class 设置一个对象,可以动态地切换 class ,例如:

<div > <div :></div> </div> <script> var app = new Vue({ el: "#app", data: { isActive: true } }) </script>

上面示例中,类名 active 依赖于数据 isActive, 当其为 true 时,div 会拥有类名 Active,为 false 时则没有,所以上例最终渲染完的结果是:

<div ></div>

对象中也可以传入多个属性,来动态切换 class 。另外,:class 可以与普通 class 共存,例如:

<div > <div:></div> </div> <script> var app = new Vue({ el: '#app', data: { isActive: true, isError: false } }) </script>

:class 内的表达式每项为真时,对应的类名就会加载,上面渲染后的结果为:

<div ></div>

当数据 isActive 或 isError 变化时,对应的 class 类名也会更新。比如当 isError 为 ture 时,渲染后的结果为:

<div ></div>

当 :class 的表达式过长或逻辑复杂时,还可以绑定一个计算属性,这是一种很友好和常见的用法,一般当条件多于两个时,都可以使用 data 或 computed ,例如使用计算属性:

<div > <div :></div> </div> <script> var app = new Vue({ el: "#app", data: { isActive: true, error: null }, computed: { classes: function () { return { active: this.isActive && !this.error, 'text-fail': this.error && this.error.type === 'fail' } } } }) </script>

除了计算属性,也可以直接绑定一个 Object 类型得数据,或者使用类似计算属性的 methods 。

2.2 数组语法

当需要应用多个 class 时,可以使用数组语法,给 :class 绑定一个数组,应用一个 class 列表:

<div > <div :></div> </div> <script> var app = new Vue ({ el: "#app", data: { activeCls: 'active', errorCls: 'error' } }) </script>

渲染后的结果为:

<div ></div>

也可以使用三元表达式来根据条件切换 class ,例如下面的示例:

<div > <div :></div> </div> <script> var app = new Vue ({ el: '#app', data: { isActive: true, activeCls: 'active', errorCls: 'error' } }) </script>

样式 error 会始终应用,当数据 isActive 为真时,样式 active 才会被应用。class 有多个条件时,这样写较为烦琐,可以在数组语法中使用对象语法:

<div > <div :></div> </div> <script> var app = new Vue ({ el: "#app", data: { isActive: ture, errorCls: 'error' } }) </script>

当然,与对象语法一样,也可以使用 data、computed 和 methods 三种方法,以计算属性为例:

<div > <button :></button> </div> <script> var app = new Vue ({ el: '#app', data: { size: 'large', disabled: true }, computed: { classes: function () { return [ 'btn', { ['btn-'this.size]: this.size !== '', ['btn-disabled']: this.disabled } ]; } } }) </script>

示例中的样式 btn 会始终应用,当数据 size 不为空时,会应用样式前缀 btn- ,后加 size 的值;当数据 disabled 为真时,会应用样式 btn-disabled,所以该示例最终渲染的结果为:

<button ></button>

使用计算属性给元素动态设置类名,在业务中经常用到,尤其是在写复用的组件时,所以在开发过程中,如果表达式较长或逻辑复杂,应该尽可能地优先使用计算属性。

三、在组件上使用

如果直接在组件上使用 class 或 :class ,样式规则会直接应用到这个组件的根元素上,例如声明一个简单的组件:

Vue.component('my-component', { template: '<p >我是个文本</p>' });

然后在调用这个组件时,应用上面的对象语法或数组语法给组件绑定 class ,以对象语法为例:

<div > <my-component :></my-component> </div> <script> var app = new Vue ({ el: "#app", data: { isActive: true } }) </script>

最终组件渲染后的结果为:

<p >我是个文本</p>

这种用法仅适用于自定义组件的最外层是一个根元素,否则会无效,当不满足这种条件或需要给具体的子元素设置类名时,应当使用组件的 props 来传递(这些用法同样适用于绑定内联样式 style 的内容)。

四、绑定内联样式

使用 v-bind:style (即 :style)可以给元素绑定内联样式,方法与 :class 类似,也有对象语法和数组语法,看起来很像直接在元素上写 CSS :

<div > <div :>我是个文本</div> </div> <script> var app = new Vue ({ el: "#app", data: { color: 'red', fontSize: 14 } }) </script>

CSS 属性名称使用驼峰命名 (camelCase)或短横分割命名(kebab-case),渲染后的结果为:

<div >红色文本</div>

大多数情况下,直接写一长串的样式不便于阅读和维护,所以一般写在 data 或 computed 里,以 data 为例改写下面的示例:

<div > <div :>我是一个红色的文本</div> </div> <script> var app = new Vue ({ el: "#app", data: { styles: { color: 'red', fontSize: 14'px' } } }) </script>

应用多个样式对象时,可以使用数组语法:

<div :>文本</div>

在实际业务中,:style 的数组语法并不常用,因为往往可以写在一个对象里面;而较为常用的应当时计算属性。

另外,使用 :style 时,Vue.js 会自动给特殊的 CSS 属性名称增加前缀,比如 transform 。

在笔记本电脑屏幕上的概念

    推荐阅读
  • CVVT是什么(cvvt是什么意思)

    CVVT系统包括以下部分:油压控制阀、进气凸轮齿板、曲轴位置传感器、凸轮轴位置传感器、机油泵和发动机电子控制单元。进气凸轮齿板包括由正时皮带驱动的外齿轮、连接到进气凸轮的内齿轮和可在内齿轮和外齿轮之间移动的控制活塞。当计算机接收到输入信号时,如发动机转速、进气空风量、节气门位置、发动机温度等。计算机还将使用凸轮位置传感器和曲轴位置传感器来确定进气凸轮的实际气门正时。

  • 我再也没有那种感觉是什么歌(我再也没有那种感觉完整歌词)

    下面希望有你要的答案,我们一起来看看吧!我再也没有那种感觉是什么歌是刘雨Key演唱的《我再也没有那种感觉》。

  • 哈伦裤怎么搭配上衣好看(今年最流行的哈伦裤)

    即便你是矮个子也能轻松驾驭起来,松紧的腰部让你穿起来舒适又自在,上身随便搭配一件今年流行的人像印花T恤,好看又能让你轻松的凹造型,穿上就好时髦了。搭配3、冰丝哈伦裤印花T恤缤纷的夏日,穿上一条休闲时尚的冰丝空调哈伦裤,带给你冰爽舒适的肌肤体验,摆脱夏季的闷热和束缚,让肌肤自由呼吸。

  • 选择的句子经典语录(选择很重要的句子经典的话语)

    自以为拥有财富的人,其实是被财富所拥有。我们在面临选择时,只有作出了正确的选择,人生的画卷才会更加美丽,人生的舞剧才会更加精彩。无论发生什么,我都会坚定的走向你,不迷惑,不慌张,不犹豫。早晨给自己一个微笑,种上一天的阳光。轰轰烈烈的仅是刺激的过程,酒尽人离散才是爱情最终的结果。正确的选择将迎来光明的大道,错误的选择可能会将人带进罪恶的深渊。寂寞,空虚,附着在被伤的千疮百孔的心上。

  • 靠谱瘦身的方法(有什么可以瘦身的运动)

    靠谱瘦身的方法游泳,从塑形效果排行榜上看,游泳绝对是名列前茅。大量实例证明,通过游泳运动来减肥的人,其肌肉线条流畅,身型窈窕多姿。跳绳运动对人体心肺系统等各种脏器有很大的益处,其减肥效果更是受到人们的推崇,跳绳绝对是一种低耗时、高耗能的有氧运动。下蹲运动随时可以进行,并不需要刻意抽出固定的时间进行锻炼,你甚至可以在看电视的时候做这个动作。

  • 薯条怎样炸才不会粘在一起(炸薯条不会黏在一起的做法)

    薯条怎样炸才不会粘在一起?下面内容希望能帮助到你,我们来一起看看吧!薯条怎样炸才不会粘在一起炸薯条之前可以将薯条放在冷冻室内冷冻一段时间,拿出薯条后,在薯条变软之前让它下锅,这样炸出来的薯条就不会粘在一起了。薯条是一种以马铃薯为原料,源起于比利时,切成条状后油炸而成的食物,这种食物在快餐店经常会见到。薯条流行于世界各地,这种食物的原料十分简单,但是做出来的口感却非常好。

  • 是谁发明了奥运五环旗?五环的五个颜色分别代表哪个洲?

    1863年,顾拜旦出生于法国一个贵族家庭,因其对奥林匹克不朽的功绩,而被誉为“奥林匹克之父”。1925年,顾拜旦以国际奥委会荣誉主席身份退休,1937年于日内瓦过世,应其本人要求,其遗体葬在国际奥委会总部所在地洛桑,而心脏则长埋在奥林匹克运动发源地奥林匹亚。

  • 阿姨的老公怎么称呼(阿姨的老公如何称呼)

    阿姨的老公怎么称呼一般称呼阿姨的丈夫为姨夫或者姨丈。根据大姨和小姨也有对应不同的叫法,如果是母亲的姐姐,其老公就叫大姨夫、大姨父、姨爸。如果是母亲的妹妹,其老公就叫小姨夫、小姨夫、姨爹。姨父的姊妹,跟随堂姊/堂兄/堂妹/堂弟称“姑妈”。舅母的姊妹,跟随舅表姊/舅表兄/舅表妹/舅表弟称“姨妈”。舅母的姊妹称你为“甥女/甥男”。所代指的关系亦非原指。

  • 海的尽头是草原几月几日上映(新档期适合全家观看的电影海的尽头是草原)

    最近有一部电影引起了我的注意,那就是《海的尽头是草原》。内蒙古天气多变很多时候需要顺应天气,等很久才能有想要的光影,这就要求导演有耐心且有掌控剧组工作节奏的能力,不要过度的浪费时间。除了“人”因素推动这部电影的完整度,在“景”上面,内蒙古天然就的自然景观也是这部电影的一大看点。家的含义,中国人的情感都被这部电影完整的传递到观众心里。9月9日,让我们一起更爱这个家。

  • 如何做煎萝卜丝(怎样煎萝卜丝)

    如何做煎萝卜丝将葱、姜切成末,放置在盘中备用;将虾皮切碎放置于盘中。将萝卜擦成细丝,并撒上些许盐,轻轻揉搓,然后用纱布拧出其中的水分。取3个鸡蛋放置碗中用筷子搅匀,取适量面粉先加入水搅拌,然后将搅拌好的鸡蛋倒入其中,搅拌均匀成面糊。取少许花生油倒入事先烧热的煎锅中,用勺子将萝卜丝面糊铲入锅中,用木铲将面糊摊匀成圆饼状,直至将两面煎至金黄色即可。将煎好的萝卜丝铲入盘中,稍冷即可食用。