IDC

CSS也能像组件状态一样响应式更新?

作者:admin 2021-08-12 我要评论

大家好,我是卡颂。 不知道平时在项目里你怎么处理 CSS 呢? 我们知道,由于原生 CSS 存在一些问题,比如: 复用时容易样式冲突 没有作用域、没有模块化 没有编...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

大家好,我是卡颂。

不知道平时在项目里你怎么处理CSS呢?

我们知道,由于原生CSS存在一些问题,比如:

  • 复用时容易样式冲突
  • 没有作用域、没有模块化
  • 没有编程能力

社区涌现出很多解决方案,比如:

  • 命名规范(比如BEM规范)
  • 模块规范(CSS Modules)
  • CSS预处理器(比如Less
  • CSS In JS
  • CSS框架(Tailwind CSS

......

如果我们按以下三个维度评判这些方案:

  • 上手难度:与原生CSS越接近,越好上手
  • 灵活性:拥有越强编程能力,越灵活
  • 能力:能解决多少原生CSS的问题

会发现每个方案都有自己的优势与短板。

比如:

  • CSS In JS方案用JSCSS,拥有极高灵活性,但加大了上手难度
  • LessCSS预处理器)可以看作CSS的超集,上手难度低、有一定编程能力,但是CSS自身的问题他也存在

业界常见做法是:同时使用BEM规范(解决命名冲突问题)+ CSS预处理器。

进击的Vue CSS解决方案

我们用这三个维度分析下VueSFC(Single-File-Component,单文件组件):

<template>
  <p>xxx</p>
</template>

<script>
  // ...
</script>

<style scoped>
  p {
    color: #0f0;
  }
</style>
  • 上手难度:样式在<style>标签内书写,与原生CSS别无二致,上手简单,符合直觉
  • 能力:scoped标识提供了模块化能力
  • 灵活性:可以使用各种预处理器,有一定灵活性

可以看到,Vue SFC采用的是一种各方面没有明显短板,局部很突出(上手难度低)的CSS方案。

随着Vue3.2发布,Vue SFC中的CSS属性获得了响应式更新能力,使其灵活性大大提升。

响应式CSS属性

对于如下Vue SFC

<template>
  <div class="text">hello</div>
</template>

<script>
export default {
  data() {
    return {
      color: 'red'
    }
  }
}
</script>

<style>
.text {
  color: v-bind(color);
}
</style>

<script>标签内定义了状态color = 'red'

.text使用v-bindcolor属性绑定该状态。效果如下:

为了验证响应式更新能力, 为div增加点击事件:

  <div class="text" @click="color= color === 'red' ? 'green' : 'red'">hello</div>

点击后会让color状态在redgreen间切换。可以看到,页面样式也会同步变化:

Demo地址

不仅是color,你可以为任何CSS属性绑定状态。

那么这个特性是如何实现的呢?

实现原理

每个使用v-bind绑定到CSS属性的状态对应一个CSS变量,该CSS变量会作为style属性赋值给组件最外层DOM

在我们的例子中:

.text {
  color: v-bind(color);
}

其中v-bind(color)会成为CSS变量:

并作为style属性赋值给div

.text经过编译会使用该CSS变量:

.text {
  // 编译前
  /* color: v-bind(color); */
  // 编译后
  color: var(--469af010-color);
}

当颜色变化后,CSS变量的值随之变化:

所以,要使用这个特性需要目标浏览器支持CSS变量。

Vue3放弃IE这可是说到做到的。

总结

Vue官方称该特性为State-Driven Dynamic CSS

经过这波操作,Vue SFCCSS灵活性有了很大提高。

并且,有了v-bind这个开头,相信未来会出现更多与响应式更新挂钩的自定义CSS指令

之前的自定义指令都是运行时的,以后的指令可能会是基于AST的编译时了。这种转变,你接受吗?


本文转自网络,版权归原作者所有,原文链接:https://segmentfault.com/a/1190000040501099

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 2020年12月超实用设计干货大合集

    2020年12月超实用设计干货大合集

  • 深入理解JavaScript中的箭头函数

    深入理解JavaScript中的箭头函数

  • Skywalking分布式链路追踪入门

    Skywalking分布式链路追踪入门

  • 连续3年稳居第一,全球1240万用户,Jav

    连续3年稳居第一,全球1240万用户,Jav

腾讯云代理商
海外云服务器