CSS in JS

前面写了一篇: CSS in JS = JSS , 这个库你知道吗? –

在谈论里有人说:

CSS 考虑 ☞『CSS in JS』 or  『JS in CSS』 ?

CSS 考虑 ☞『CSS in JS』 or  『JS in CSS』 ?

CSS 考虑 ☞『CSS in JS』 or  『JS in CSS』 ?

一同还发了一个沸点:

你听说过 JSS 吗?在 JS 中写 CSS,感觉有点奇葩。 – 沸点 –

CSS 考虑 ☞『CSS in JS』 or  『JS in CSS』 ?

CSS 考虑 ☞『CSS in JS』 or  『JS in CSS』 ?

CSS 考虑 ☞『CSS in JS』 or  『JS in CSS』 ?


咱们都很有才,视野很开阔~~

本瓜所在的项目组技能栈主要是 Vue2,往常又疏于 CSS 探求,对 JSX 里融合写 CSS 这种全面组件化的写法了解不多。

我现在是意识到了,这种写法其实早就有了,可参见阮一峰的这篇:CSS Modules 用法教程 – 阮一峰的网络日志

简而言之,代码组织形式相似如下,从 A 到 B 的过程:

// *.scss
.item {
  display: flex;
}
  • A
// Simply import
import './foo.scss';
const App = () => (
  <div className="item">
    {item}
  </div>
)
  • B
// import as a js module 
import styles from './foo.scss';
const App = () => (
  <div className={styles.item}>
    {item}
  </div>
)

编译出来的成果也不一样:

  • A
<!-- Normal SCSS -->
<div class="item">foo bar</div>
  • B
<!-- SCSS with Class Module will have
     hash values suffixed to the class name -->
<div class="item-35ada5">foo bar</div>

CSS in JS ,将款式也整合在模板组件里面,确实就像有人所说的:“分久必合、合久必分”。

JS in CSS

后来又了解到:

除了 CSS in JS,还有一种方向是 JS in CSS;尤雨溪在 Vue3.2 提出,目的是:让咱们可以在 css 中运用 js 变量。SFC style CSS variable injection (new edition) by yyx990803 Pull Request #231 vuejs/rfcs

CSS in JS 是把 CSS 写在 JSX 模板中;

JS in CSS 是把 JS 变量写入 CSS 中;

想想咱们在 Vue2 中,想动态控制款式,咱们通常这样:

<template>
    <h1 :style="{opacity: opacity}">Vue</h1>
</template>
<script>
export default {
    data () {
        return { opacity: 0 }
    },
    mounted () {
        setInterval(() => {
            this.opacity >= 1 && (this.opacity = 0)
            this.opacity += 0.2
        }, 300)
    }
}
</script>
<style>
h1 {
    color: rgb(65184131);
}
</style>

在 Vue3.2 中:

<template>
    <h1>Vue</h1>
</template>
<script>
export default {
    data () {
        return { opacity: 0 }
    },
    mounted () {
        setInterval(() => {
            this.opacity >= 1 && (this.opacity = 0)
            this.opacity += 0.2
        }, 300)
    }
}
</script>
<style> 
h1 {
    color: rgb(65184131);
    opacity: v-bind(opacity);
}
</style>

这个要借助 vite 编译:

npm init vite-app vars
npm i
npm run dev

CSS 考虑 ☞『CSS in JS』 or  『JS in CSS』 ?

然后就可以看到作用了

CSS 考虑 ☞『CSS in JS』 or  『JS in CSS』 ?

再弥补一个色彩选择器的比如

<template>
  <div class="Example">
    <div class="area">
      <div class="form">
        <label>Select Color (SCSS)</label>
        <input type="color" v-model="themeColors.bgColor" />
      </div>
      <div class="preview">
        <span>{{ themeColors.bgColor }}</span>
        <div class="customColor"></div>
      </div>
    </div>
  </div>
</template>
<script>
import { ref } from "vue";
export default {
   setup() {
    const themeColors = ref({
      bgColor: ''
    })
    return {
      themeColors
    };
  },
};
</script>
<style lang="scss">
.Example {
  $customColor: v-bind('themeColors.bgColor');
  .customColor {
    background: $customColor;
    width: 100px;
    height: 50px;
  }
}
</style>

CSS 考虑 ☞『CSS in JS』 or  『JS in CSS』 ?

来历

小结

不管是 CSS in JS 仍是 JS in CSS,总归都想整合 JS 和 CSS 的才能,整理一个新的模板标准。

后边还会怎样变?拭目而待。

CSS 考虑 ☞『CSS in JS』 or  『JS in CSS』 ?

  • 为什么是 v-bind?有更多兴趣的可以看下 SFC style CSS variable injection (new edition) by yyx990803 Pull Request #231 vuejs/rfcs 尤大在这个 issues 下对咱们关于自定义写法上建议的回答。

OK,以上便是本篇分享,期望各位工友喜欢~ 欢迎点赞、保藏、谈论

我是安东尼 100 万人气前端技能博主 INFP 写作品格坚持 1000 日更文 ✍ 重视我,安东尼陪你一同度过漫长编程年月

加我微信 ATAR53,拉你入群,定期抽奖、粉丝福利多多。只学习交友、不推文卖课~

我的大众号:安东尼,在上面,不止编程,更多还有生活感悟~

我的 GithubPage: tuaran.github.io,它已经被维护 4 年+ 啦~


本文正在参与「金石方案 . 瓜分6万现金大奖」