CSS in JS
前面写了一篇: CSS in JS = JSS , 这个库你知道吗? - 掘金
在评论里有人说:
同时还发了一个沸点:
你听说过 JSS 吗?在 JS 中写 CSS,感觉有点奇葩。 - 沸点 - 掘金
大家都很有才,视野很开阔~~
本瓜所在的项目组技术栈主要是 Vue2,平常又疏于 CSS 探究,对 JSX 里融合写 CSS 这种全面组件化的写法了解不多。
我现在是意识到了,这种写法其实早就有了,可参见阮一峰的这篇:CSS Modules 用法教程 - 阮一峰的网络日志
简而言之,代码组织形式类似如下,从 A 到 B 的过程:
代码语言:javascript复制// *.scss
.item {
display: flex;
}
- A ` // Simply import import './foo.scss';
const App = () => (
代码语言:txt复制 {item}
)
代码语言:javascript复制* B
// import as a js module import styles from './foo.scss';
const App = () => (
代码语言:txt复制 {item}
)
代码语言:javascript复制编译出来的结果也不一样:
* A
foo bar
代码语言:javascript复制* B
foo bar
代码语言:txt复制
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 中,想动态控制样式,我们通常这样:
代码语言:javascript复制<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(65,184,131);
}
</style>
在 Vue3.2 中:
代码语言:javascript复制<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(65,184,131);
opacity: v-bind(opacity);
}
</style>
这个要借助 vite 编译:
代码语言:javascript复制npm init vite-app vars
npm i
npm run dev
然后就可以看到效果了
再补充一个颜色选择器的例子
代码语言:javascript复制<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 in JS 还是 JS in CSS,总之都想整合 JS 和 CSS 的能力,梳理一个新的模板规范。
后面还会怎么变?拭目以待。
- 为什么是 v-bind?有更多兴趣的可以看下 SFC style CSS variable injection (new edition) by yyx990803 · Pull Request #231 · vuejs/rfcs 尤大在这个 issues 下对大家关于自定义写法上建议的回答。
OK,以上便是本篇分享,希望各位工友喜欢~ 欢迎点赞、收藏、评论