Vue3样式绑定

今天和大家分享关于Vue中的样式和class的绑定,

首先声明,这篇文章出现的class不是类声明的关键字,而是标签内部的属性,用于实现样式

在原生html中,我们给一个元素添加样式的时候,大概有这么两种方式

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title></head><body>    <div style="color:red">我是一个红色的小可爱</div></body></html>

第二种方式就是在head标签之间,添加style标签,将样式统一写在style之间,然后在标签中定义对应的class

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>        .red_color{            color:red        }</style></head><body>    <div class="red_color">我同样是一个红色的小可爱</div></body></html>

对于Vue来说,有以下四种方式定义样式和class

一、通过Vue提供的v-bind方式绑定字符串,就像这样

<html>  <head>    <style>      .red_color{        color:red      }      .green_color{        color:green      }      .yellow_color{        color:yellow      }    </style>  </head>  <body>    <script>      const app = Vue.createApp({          data(){              return {                  classString:'red_color'              }          },          template: `<div :class="classString">Hello World</div>`      })      const vm = app.mount('#root')    </script>  </body></html>

最后渲染出来的DOM长这样

<div class="red_color">Hello World</div>

二、class绑定的还可以是个Object,这个Object比较特别,key为定义好的class,value为Boolean,为true的时候,添加该class,否则不添加该class

<html>  <head>    <style>      .red_color{        color:red      }      .green_color{        color:green      }      .yellow_color{        color:yellow      }</style>  </head>  <body>    <script>      const app = Vue.createApp({          data(){              return {                  classObj:{                    red_color: true,                    green_color: true,                    yellow_color: false                }              }          },          template: `<div :class="classObj">Hello World</div>`      })      const vm = app.mount('#root')</script>  </body></html>

最后渲染出来的DOM长这样

<div class="red_color green_color">Hello World</div>

三、class绑定的还可以是个Array,当然Array中的元素也可以是个Object,只不过这个Object的规则和上面的一样

<html>  <head>    <style>      .red_color{        color:red      }      .green_color{        color:green      }      .yellow_color{        color:yellow      }</style>  </head>  <body>    <script>      const app = Vue.createApp({          data(){              return {                  classArray:['red_color','green_color',{yellow_color: true}]              }          },          template: `<div :class="classArray">Hello World</div>`      })      const vm = app.mount('#root')</script>  </body></html>

最后渲染出来的DOM长这样

<div class="red_color green_color yellow_color">Hello World</div>

四、还可以通过绑定style的方式

<html>  <body>    <script>      const app = Vue.createApp({          data(){              return {                  styleObj:{                    color:'yellow'                }              }          },          template: `<div :style="styleObj">Hello World</div>`      })      const vm = app.mount('#root')</script>  </body></html>

当然最后就在页面中渲染出黄色的元素

上面介绍的都没涉及到组件,要是页面中有组件又会是什么样呢

对于组件中样式,有这么两种情况,一个是子组件中只有一个最外层元素包裹的时候,是可以沿着父组件传递下去的,也就是对应的class给子组件内部,或者直接给在父页面的子组件上效果是一样的

<html>  <head>    <style>      .red_color{        color:red      }      .green_color{        color:green      }      .yellow_color{        color:yellow      }</style>  </head>  <body>    <script>      const app = Vue.createApp({          data(){             return {}          },          template: `<div>                      Hello World                      <demo class="green_color" />                    </div>`      })      app.component('demo',{ // 只有一个最外层元素的时候,把class给组件上也可以实现        template:`<div>single</div>`      })      const vm = app.mount('#root')</script>  </body></html>

上面的代码,将class在父页面给子组件,效果和直接在子组件中添加class效果是一样的,渲染出来的DOM也是一样的

<div>    Hello World    <div class="green_color">        single    </div></div>

但是当子组件不仅是一个最外层元素包裹的时候,是不能“向下传递”的,如果也想获取在组件中注册的class,可以这样实现

<html>  <head>    <style>      .red_color{        color:red      }      .green_color{        color:green      }      .yellow_color{        color:yellow      }</style>  </head>  <body>    <script>      const app = Vue.createApp({          data(){             return {}          },          template: `<div>                      Hello World                      <demo class="green_color" />                    </div>`      })      app.component('demo',{ // 只有一个最外层元素的时候,把class给组件上也可以实现        template:`<div :class="$attrs.class">one</div>                <div>two</div>`      })      const vm = app.mount('#root')</script>  </body></html>

又是前端进步的一天,一起加油!

大家还可以扫描二维码,关注我的微信公众号,蜗牛全栈。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞鹰3995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值