个人写码感悟:TailwindCSS不要忽视子选择器

前段时间刷小红书看到这样一个贴子,其中作者配了这样一张图:

感觉很受启发,有时候自己嫌麻烦会在子组件上重复复制粘贴很多遍相同的样式代码,实际在其父组件中通过子选择器就可避免代码冗余的情况,刷过之后留了个印象。

今天在使用shadcn/ui的tabs组件时,我为了设置每个tab再悬浮时光标手势为pointer,未激活时字体为白色,背景为灰色,悬浮背景为浅灰色;激活时字体为黑色,背景为白色,悬浮背景不变色,我忽然想起了这个贴子,便想实际操作一下。

按照以往的写码习惯这些央视的编写会是下面这样:

js 复制代码
<TabsList className="flex-none w-full bg-gray-800 border-b border-gray-700 rounded-none h-auto">
    {CheckComponent && (
        <TabsTrigger
            value="check"
            className="flex-1 cursor-pointer text-white hover:bg-gray-700 data-[state=active]:text-black data-[state=active]:hover:bg-transparent"
        >
            Check
        </TabsTrigger>
    )}
    {CreateComponent && (
        <TabsTrigger
            value="create"
            className="flex-1 cursor-pointer text-white hover:bg-gray-700 data-[state=active]:text-black data-[state=active]:hover:bg-transparent"
        >
            Create
        </TabsTrigger>
    )}
    {EditComponent && (
        <TabsTrigger
            value="edit"
            className="flex-1 cursor-pointer text-white hover:bg-gray-700 data-[state=active]:text-black data-[state=active]:hover:bg-transparent"
        >
            Edit
        </TabsTrigger>
    )}
</TabsList>

而利用子选择器思路则是直接在每个TabsTrigger的父组件上用父级规则批量设置子组件样式:

js 复制代码
<TabsList className="flex-none w-full bg-gray-800 border-b border-gray-700 rounded-none h-auto 
    [&_button]:cursor-pointer 
    [&_button]:text-white 
    [&_button:not([data-state=active])]:hover:bg-gray-700 
    [&_button[data-state=active]]:text-black"
>
    {CheckComponent && (
        <TabsTrigger value="check" className="flex-1">
            Check
        </TabsTrigger>
    )}
    {CreateComponent && (
        <TabsTrigger value="create" className="flex-1">
            Create
        </TabsTrigger>
    )}
    {EditComponent && (
        <TabsTrigger value="edit" className="flex-1">
            Edit
        </TabsTrigger>
    )}
</TabsList>

这样做的优点在于方便后期做整体样式调整,而无需对每个TabsTrigger做一对一的修改,有些避免代码冗余,降低维护难度。

相关推荐
吃杠碰小鸡42 分钟前
高中数学-数列-导数证明
前端·数学·算法
kingwebo'sZone1 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word
xjt_09011 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农1 小时前
Vue 2.3
前端·javascript·vue.js
夜郎king2 小时前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落
夏幻灵3 小时前
HTML5里最常用的十大标签
前端·html·html5
Mr Xu_3 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
未来龙皇小蓝3 小时前
RBAC前端架构-01:项目初始化
前端·架构
程序员agions3 小时前
2026年,微前端终于“死“了
前端·状态模式
万岳科技系统开发3 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法