React拾遗:从10种现在流行的 CSS 解决方案谈谈我的最爱 (下)
2021-03-08 15:27
标签:方法 att 加载 多点 话题 作用 字符 gre classname 最近写React一直在纠结样式的问题,今天找了篇看起来很不错的文章,认真读三遍先... 原文链接:https://juejin.im/post/5b3dd2d25188251b193d2d7e If you are not paying for the product, you are the product. 终于有时间静下心学点东西,把这个系列最后一篇填上。 中篇 介绍了 tachyons, 本篇介绍个人的最爱,没有之一:styled-jsx。 在打算使用一个新 css 框架前,需要好好想清楚它是否在你的所有使用场景里圆满完成任务,我总结了几点: zeit 的一系列产品从 now,到 next.js,我算是一个脑残粉。简洁好用是我对 zeit 的项目的印象。而且一套库自成系统,styled-jsx 和 next.js 完美兼容。 styled-jsx 概括第一印象就是 React css 的 vue 解决。 然后就直接用了 只有这个p会被上样式 会被转化成 只有这个p会被上样式 从实现到原理,对比vue是不是非常像呢?如果你不喜欢将样式写在 render 里,styled-jsx 提供了一个 非常完美的css解决方案。 下面针对“选择标准”里提到的各个方面考察一下 styled-jsx 和 styled-components,Motion 等模板字符串的解决方案一样,动态css轻而易举 同个组件里可以写无限个``标签,这里的最佳实践是将静态的css放一个标签,动态的放另一个,每次渲染时只有动态的重新计算和渲染 两点注意: 两个字,插件。 一应俱全。以Sass为例: 即可使用Sass。 如同 Vue 以 全局样式注明 global 即可。 有极少情况(比如传一个全局类给三方库)需要使单个选择器全局化,语法类似 css-module 相对有点繁琐,思想是取得styled-jsx转化过后的类名,注入到三方库的className props里,这样即解决了支持,又保全了局部css,代码如下 当然,如果你不介意局部不局部,可以使用上面提到的 我使用VSCode: 其他的见 github 上 readme。 谢谢ziven27提议,我试着说说和现在最流行的 styled-components 库的区别。(方便讨论,“前者”代指style-jsx,“后者”代指style-components) 但对不提供 这里提到一个话题,到底是“魔术”好呢,还是朴实好呢?举个例子,比如theme(主题): 甚至还提供了一个HOC,在styled-components外使用theme 强大不强大?对比之下,styled-jsx没有任何与theme相关的api,只是朴朴实实地靠props传递达成主题: 这个问题要看应用场景和个人喜好吧,我属于不喜欢过多“魔术”,爱简单api(哪怕多点代码)的那派。大家有啥想法和指正,多多留言。 有2个细小缺点 之前有小伙伴留言表示有坑(谢谢,看到这样的留言觉得写blog的决定太对了) 个人觉得1的场景已经在上面讨论了,可以兼容。2的话,本人上个项目里裸prettier,所以没试过那个插件,在这里提一下。 总之目前用过一次,我很喜欢,也很满意。希望大家也找到自己喜欢的一个或者是一套解决方法。 最近面试,明白了自己有许多需要重点研究的课题。看了些 PWA 相关的文和视频,已经上船了。一句话:PWA 是未来,而且是近在眼前的未来。之后打算分享一下自己的学习笔记。 React拾遗:从10种现在流行的 CSS 解决方案谈谈我的最爱 (下) 标签:方法 att 加载 多点 话题 作用 字符 gre classname 原文地址:https://www.cnblogs.com/ssaylo/p/12874131.html
React拾遗:从10种现在流行的 CSS 解决方案谈谈我的最爱 (下)
当一个商品是“免费”的,那往往你成了商品。选择标准
styled-jsx
1. 基础用法
yarn add styled-jsx
安装后,不用import
,而是一个babel插件,.babelrc
配置:{
"plugins": [
"styled-jsx/babel"
]
}
render () {
return
className
例如const App = () => (
import _JSXStyle from ‘styled-jsx/style‘
const App = () => (
css
的工具函数:import css from ‘styled-jsx/css‘
export default () => (
2. 动态css
export default (props) => (
const Button = (props) => (
)
3. 如何使用Sass
yarn add -D node-sass styled-jsx-plugin-sass
.babelrc
配置{
"plugins": [
[
"styled-jsx/babel",
{ "plugins": ["styled-jsx-plugin-sass"] }
]
]
}
4. 全局css
scoped
为关键字,styled-jsx 以 global
为关键字。export default () => (
div :global(.react-select) {
color: red
}
5. 三方UI库的支持
import Link from ‘react-router-dom‘ // 例子,给Link组件添加样式
const scoped = resolveScopedStyles(
:global()
语法// 比如Form组件有类名form-item
export default () => (
6. 语法高亮与补完
7. 大小?性能?
8. style-jsx vs styled-components
&
嵌套,后者也是可以包裹组件最外层元素然后将其他元素样式统统写入的。虽然感觉不是后者的初衷。className
props的三方库完美整合(比前者简洁太多):const RedButton = styled(Button)`background: red;`
className
props的三方库一筹莫展(当然这种情况不太出现)。
.extends
样式继承以及.attrs
封装公用props。// styled-components 使用Provider提供主题,主题可以是样式,也可以是函数
const Button = styled.button`
color: ${props => props.theme.fg};
border: 2px solid ${props => props.theme.fg};
background: ${props => props.theme.bg};
font-size: 1em;
margin: 1em;
padding: 0.25em 1em;
border-radius: 3px;
`;
// 主题的样式
const theme = {
fg: ‘palevioletred‘,
bg: ‘white‘
};
// 换前景色和背景色的函数
const invertTheme = ({ fg, bg }) => ({
fg: bg,
bg: fg
});
render(
import { withTheme } from ‘styled-components‘
// styled-jsx
import { colors, spacing } from ‘../theme‘
import { invertColor } from ‘../theme/utils‘
const Button = ({ children }) => (
)
最后
react-app-rewired
来加入 babel plugin 的设置。同样觉得styled-jsx非常好,最近一直在用。
但目前还是有些不成熟的地方,主要是:
1、局部样式无法支持第三方组件标签,只能支持普通html标签
2、对stylelint缺乏支持,官方出的stylelint插件只是一个demo。在vscode中用stylelint插件时也是有很大的坑。
文章标题:React拾遗:从10种现在流行的 CSS 解决方案谈谈我的最爱 (下)
文章链接:http://soscw.com/index.php/essay/61861.html