新鲜出炉:小巧优雅的 css-in-js库StyledFc

这篇具有很好参考价值的文章主要介绍了新鲜出炉:小巧优雅的 css-in-js库StyledFc。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

StyledFc

一个简单的运行时css-in-js库,用于封装react组件

  • 零依赖
  • 非常小,< 3kb.
  • 运行时生成css
  • 支持css变量
  • 支持类似less的嵌套css样式
  • 支持props动态css
  • 支持typescript

演示

安装

pnpm add styledfc
# or
npm install styledfc
# or
yarn add styledfc

用法

拟开发一个Card组件,组件有一个title属性,用于显示标题,一个footer属性,用于显示底部内容,children属性作为卡片的内容区。

基本用法

import { styled } from "styledfc" 

export type  CardProps = React.PropsWithChildren<{
    title:string 
    footer?:string
  }>

export const Card = styled<CardProps>((props,{className})=>{
    const { title,children,footer} =props
    return (
      <div  className={className}>
        <div className="title">            
            {title}
        </div>
        <div className="content">{children}</div>
        <div className="footer">{footer}</div>
      </div>
    )
  },{ // 组件样式
    position:"relative",
    width:"100%",
    border:"1px solid #ccc",
    borderRadius:"4px" 
  })

  • 以上代码将创建一个Card组件,为样式生成一个样式类(名称是随机生成的)并插入到head标签中。
  • 然后将className属性传递给组件,组件将使用这个类名来应用样式。

实际上,你可以在head发现一个类似这样的CSS样式,其中的类名style.id均是自动生成的。也可以通过options参数来指定styleIdclassName

<style id="6rxqfu">
.sw6y3s4{
    position:relative;
    width:100%;
    border:1px solid #ccc;
    border-radius:4px;
}
</style>

嵌套样式

接下来我们来为Card组件的titlefooter添加样式.

export const Card = styled<CardProps>((props,{className})=>{
    const { title,children,footer} =props
    return (
      <div  className={className}>
        <div className="title">            
            {title}
        </div>
        <div className="content">{children}</div>
        <div className="footer">{footer}</div>
      </div>
    )},{ // 组件样式
      position:"relative",
      width:"100%",
      border:"1px solid #ccc",
      borderRadius:"4px",
      "& > .title":{
        fontSize:"20px",
        fontWeight:"bold",
      },
      "& > .footer":{
        borderTop:"1px solid #ccc",
        padding:"8px",
        textAlign:"right"
      }
  })
  • 以上我们为titlefooter添加了样式。
  • 使用&符号来表示当前父类元素,使用的方式与lesssass等嵌套CSS的语法类似。

head生成的样式如下:

<style id="6rxqfu">
.sw6y3s4{
    position:relative;
    width:100%;
    border:1px solid #ccc;
    border-radius:4px;
}
.sw6y3s4 > .title{
    font-size:20px;
    font-weight:bold;
}
.sw6y3s4 > .footer{
    border-top:1px solid #ccc;
    padding:8px;
    text-align:right;
}
</style>

动态样式

styledfc支持使用props来动态设置样式。

我们想让卡片content的背景颜色可以通过props.bgColor属性来指定。


export const Card = styled<CardProps>((props,{className,getStyle})=>{
    const { title,children,footer} =props
    return (
      <div  className={className} style={getStyle()}>
        <div className="title">            
            {title}
        </div>
        <div className="content">{children}</div>
        <div className="footer">{footer}</div>
      </div>
    )},{ // 组件样式
      position:"relative",
      width:"100%",
      border:"1px solid #ccc",
      borderRadius:"4px",
      "& > .title":{
        fontSize:"20px",
        fontWeight:"bold",
      },
      "& > .footer":{
        borderTop:"1px solid #ccc",
        padding:"8px",
        textAlign:"right"
      },
      "& > .content":{
        padding:"8px",
        backgroundColor:(props)=>props.bgColor
      }
  })
  • 为了支持动态属性,我们需要使用getStyle函数来获取动态样式,然后注入到组件的根元素中。
  • getStyle函数返回一个css样式对象,可以直接传递给style属性。
  • 任意css属性均可以使用(props)=>{....}来动态生成CSS属性值。

CSS变量

styledfc支持使用css变量。可以在getStyle函数中传入更新后的css变量。


export const Card = styled<CardProps>((props,{className,getStyle})=>{
    const { title,children,footer} =props
    const [primaryColor,setPrimaryColor] = React.useState("blue")
    return (
      <div className={className} style={getStyle({"--primary-color":primaryColor})}>
        <div className="title">            
            {title}<button onClick={()=>setPrimaryColor('red')}>
        </div>
        <div className="content">{children}</div>
        <div className="footer">{footer}</div>
      </div>
    )},{ // 组件样式
      position:"relative",
      width:"100%",
      border:"1px solid #ccc",
      borderRadius:"4px",
      "--primary-color":"blue",
      "& > .title":{
        fontSize:"20px",
        fontWeight:"bold",
        color:"var(--primary-color)"
      },
      "& > .footer":{
        borderTop:"1px solid #ccc",
        padding:"8px",
        textAlign:"right"
      },
      "& > .content":{
        padding:"8px",
        backgroundColor:(props)=>props.bgColor
      }
  })
  • 以上我们在根样式中声明了一个--primary-colorcss变量。
  • 然后我们在title样式中使用了--primary-color变量。
  • getStyle函数支持传入更新css变量。

小结

  • 默认只需要在组件引用className即可。
  • 如果需要使用props动态css属性,需要使用getStyle函数来获取动态css样式并注入到根元素中。
  • getStyle函数支持传入更新css变量。

Hook

styledfc还提供了一个useStyle钩子,用于在函数组件中使用。

同样功能的Card组件可以使用useStyle钩子来实现。

import { useStyle } from "styledfc"
export const Card2:React.FC<React.PropsWithChildren<CardProps>> = ((props:CardProps)=>{
    const { title } = props
    const [titleColor,setTitleColor] = useState("blue")
    const {className,getStyle } =  useStyle({
        // 此处是组件样式
    })
    return (
      <div className={className} style={getStyle({"--title-color":titleColor},props)}>
        <div className="title">            
            <span>{title}</span>
            <span className="tools"><button onClick={()=>setTitleColor(getRandColor())}>Change</button></span>
        </div>
        <div className="content">          
            {props.children}
        </div>
        <div className="footer">{props.footer}</div>
      </div>
    )
  })
  • useStyle钩子返回classNamegetStyle,用来注入样式类名和动态样式。
  • getStyle函数支持传入更新css变量。如果使用到props动态样式,则需要传入props参数。
  • useStyle钩子支持传入options参数来配置styleIdclassName
  • useStylestyled函数功能一样,唯一的区别是useStylehead注入的样式表在组件卸载时会自动移除。

配置

styledfc支持以下options参数来配置。文章来源地址https://www.toymoban.com/news/detail-832526.html

// styled(<React.FC>,<styles>,<options>)
export interface StyledOptions{
    // 样式表的ID,没有指定则会自动生成
    styleId?:string                          
    // 生成的样式类名,如果没有指定则自动生成 
    className?:string                        
}

API

export interface StyledOptions{
    // 生成的样式表id,如果没有指定则自动生成
    styleId?:string                          
    // 生成的css类名,如果没有指定则自动生成
    className?:string                
}
export type StyledComponentParams ={
    // 生成的css类名
    className:string
    // 生成的样式表id
    styleId:string
    // css变量
    vars:Record<string,string | number> 
    // 获取动态css样式,当使用props动态css时需要使用getStyle注入css样式对象,例如style={getStyle()}
    getStyle : ()=>Record<string,string | number>
}

export type StyledComponent<Props> = (props:React.PropsWithChildren<Props>,params:StyledComponentParams)=>React.ReactElement

styled<Props>(FC: StyledComponent<Props>,styles:CSSObject,options?:StyledOptions)

到了这里,关于新鲜出炉:小巧优雅的 css-in-js库StyledFc的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 腾讯云服务器租用报价表新鲜出炉(轻量和CVM价格)

    腾讯云服务器分为轻量应用服务器和云服务器CVM,CVM为专业级云服务器,适用于企业级如科学计算、集群应用、高容灾等使用场景;轻量应用服务器适用于个人博客简单的Web应用或测试环境使用。 腾讯云服务器租用价格表2023新版报价出炉,轻量服务器2核2G4M带宽88元一年、

    2024年02月04日
    浏览(43)
  • elasticsearch集群安装+安全验证+kibana安装,新鲜出炉的蚂蚁金服面经

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新网络安全全套学习资料》

    2024年04月26日
    浏览(35)
  • 新鲜出炉的 MVVM 脚手架 —— KtArmor-MVVM,面试安卓系统架构

    } 通过 @BindViewModel 注解viewModel 变量,KtArmor-MVVM 通过 反射 ,自动创建 LoginViewModel 实例, 并赋值给 viewModel 变量。直接使用即可! @BaseUrl(API.BASE_URL) // 看这里!! interface ApiService { @POST(API.LOGIN) suspend fun login(@Query(“username”) username: String, @Query(“password”) password: String): BaseRe

    2024年04月10日
    浏览(47)
  • 新鲜出炉!由腾讯安全深度参编的“首份网络安全态势感知国家标准”发布

    近日, 公安部第三研究所牵头、腾讯安全深度参编的信息安全国家标准《信息安全技术-网络安全态势感知通用技术要求》 ,由国家标准化管理委员会正式发布,将于2023年10月1日起实施。 作为国内首份网络安全态势感知的国家标准 ,它规范了网络安全态势感知体系的 数据汇

    2024年02月06日
    浏览(50)
  • 新鲜出炉的蚂蚁金服面经,Flutter与Native交互,谈一谈Binder的原理和实现一次拷贝的流程

    super.dispose(); } void updateMapMarker() async { await platform.invokeMethod(‘refrashMap’, “我是参数”); } // This widget is the root of your application. @override Widget build(BuildContext context) { print(‘-------------build--------------’); updateMapMarker(); return Scaffold( body: Stack( children: [ Center( child: AndroidView(viewType: ‘

    2024年04月13日
    浏览(36)
  • 【开发环境】VSCode 安装插件 ( 简体中文插件 | Open in Browser 插件 | Auto Rename Tag 插件 | JS-CSS-HTML Formatter 插件 )

    在 VSCode 中 , 左侧的 按钮 是 扩展 按钮 , 使用 Ctrl + Shift + X 也可以快速进入插件安装界面 ; 在弹出的 扩展 面板中 , 可以搜索和安装插件 ; 在扩展工具面板中 , 搜索 Chinese , 可以看到 简体中文 插件 , 安装该插件后 , 界面会变为简体中文界面 ; 安装完毕后 , 重启 VSCode 即可完成

    2024年02月13日
    浏览(50)
  • 记录--纯CSS实现一个简单又不失优雅的步骤条

    步骤条是一种用于引导用户按照特定流程完成任务的导航条,在各种分步表单交互场景中广泛应用。先来看一下几个主流前端 UI 框架中步骤条组件的样子: ElementPlus AntDesign OpenTiny iView 我们可以发现,步骤条通常由编号、名称和引导线三个基本要素组成。本文中要实现的是一

    2024年02月08日
    浏览(44)
  • CSS查缺补漏之《如何优雅解决margin垂直方向塌陷与合并问题?》

    一:父子元素之间margin垂直方向塌陷问题 在处理margin垂直方向问题时,经常会遇到在给子元素设置margin时,导致效果出现在了父元素上;如下代码所示: 代码原义是想实现三方面: ① 将box1的margin-top调为50px,使其与父元素之间形成空隙; ② 将box2的margin-top调为20px,使其与

    2024年02月10日
    浏览(51)
  • JS策略模式,如何优雅地处理复杂逻辑

    JavaScript策略模式是一种常用的设计模式,它可以帮助我们优雅地处理复杂的逻辑。在本文中,我们将通过一个实际的例子来说明策略模式的应用。 策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式让算法的变化

    2024年02月10日
    浏览(39)
  • Nuxt.js--》解密Nuxt.js:构建优雅、高效的现代化Vue.js应用

            博主今天开设Nuxt.js专栏,带您深入探索 Nuxt.js 的精髓,学习如何利用其强大功能构建出色的前端应用程序。我们将探讨其核心特点、灵活的路由系统、优化技巧以及常见问题的解决方案。无论您是想了解 Nuxt.js 的基础知识,还是希望掌握进阶技巧,本专栏都将满

    2024年02月16日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包