首页 > 其他分享 >正确使用classnames库的方式摸索【玩转React】

正确使用classnames库的方式摸索【玩转React】

时间:2023-08-08 13:01:14浏览次数:30  
标签:classNames selected classnames React switch 玩转 true CSS

前言

我们日常开发使用的是React框架,主要采用JSX写法,而classnames与JSX十分般配,组合使用效果极佳,可以实现class的动态绑定。

接下来,通过对 classnames 源码的阅读,来进一步了解classnames出现的契机及其用法。

听说你叫 className

讲 classnames 之前,科普一点关于它「兄弟」 className 的知识点。

万物皆有源之 JSX

众所周知,在 Recat 中配合使用 JSX 语法。而 JSX 在语法上更接近 JavaScript 而不是 HTML,所以 React DOM 使用 camelCase(小驼峰命名)来定义属性的名称。

因此,在 React 中使用 className 为元素指定 CSS 的 class。

className 的两种用法

我们在 React 中是这样为元素添加样式的:

<div className="mt20">Hello World</div>

或者根据某个变量的值进行动态绑定,如下就根据 selected 的值判断是否为元素添加 active 样式:

<div className={`${selected ? 'active' : ''}`}>
  {selectedText}
</div>

必有但是

动态绑定的方式确实让代码变得更加灵活,但是上面这种 ES6 模板字符串的写法,当有多个判断的时,会显得臃肿且不好维护。

那,有没有更好的实现方案呢?

正确使用classnames库的方式摸索【玩转React】_React

classnames 出现的契机

每当遇到一个新知识点,我总是不由的想,它为什么会诞生?它帮忙解决了什么问题?

开发者需要什么?

从前面的文字中提取关键讯息,不难发现,开发者需要更简洁绑定多个 className 的方式。

classnames 是什么?

而 classnames 源码的第一句介绍,正好符合开发者的需要

A simple JavaScript utility for conditionally joining classNames together.

直译过来就是

一个简单的、有条件的绑定多个 className 的 JavaScript 实用函数.

classnames 的用法

用前先安装

classnames 是一个第三方 JavaScript 库,使用前需要先安装。

npm、bower、yarn三件套

# via npm
npm install classnames

# via Bower
bower install classnames

# or Yarn (note that it will automatically save the package to your `dependencies` in `package.json`)
yarn add classnames

语法

classnames 函数支持多个传参,参数的类型也支持数值、字符串、对象、数组等多种。

classnames(class1,class2,...classN)

用法很多样

基础用法

// 多个字符串 两种写法均可
classNames('mt10', 'font20') // => 'mt10 font20'
classNames('mt10 font20') // => 'mt10 font20'

//「字符串+对象」组合
classNames('switch', { selected: false }) // => 'switch'
classNames('switch', { selected: true }) // => 'switch selected'

// 对象 三种写法均可
classNames({ switch: true }, { selected: true }); // => 'switch selected'
classNames({ switch: true, selected: true }); // => 'switch selected'
classNames({ 'switch selected': true }); // => 'switch selected'

// 数组
classNames('font20', ['mt10', { switch: true, selected: false }]); // => 'font20 mt10 switch'

ES6 语法

支持动态类名

let type = 'disabled';
classNames('radio', { [`radio-${type}`]: true }); // => 'radio radio-disabled'
classNames('radio', `radio-${type}`); // => 'radio radio-disabled'

React 中使用

前面提到过 className 的知识点,React 中添加 class 使用 className。

import classNames from 'classnames';

const checkboxCls = classNames('checkbox-group', { 'checkbox-group-horizontal': true });
<div className={checkboxCls}></div>

总结

先来总结一下classnames的用法:

  1. classnames 支持多种写法。
  2. classnames 函数的入参是无序的,但是编写习惯是字符串类型的放前面,其他放在后面。
  3. classnames 函数会忽略入参中的错误值。
  4. classnames 函数支持动态类名。

对「CSS-in-JS」的思考

现状

由于我们项目几乎都用的 React 框架,而 CSS-in-JS 写法是如此丝滑。在 CSS 中使用 JS 变量,在基础组件的建设中很有帮助。

思考

很多事物带有两面性,CSS-in-JS 在拥有写法灵活和支持局部作用域的优势的同时,会增加运行开销和包大小。

有点像「鱼与熊掌」做选择的感觉,目前还比较难抉择。

替代

我读到了一篇文章,是Emotion 的第二大活跃维护者 Sam 分享《我们为何弃用 css-in-js》。这篇原文我没有办法打开,但是在掘金社区找到了译文,译文指路☞《为什么我们正在放弃 CSS-in-JS》

简单介绍一下这篇文章,文章前半部分介绍了 CSS-in-JS 的优缺点、复杂性。后半部分讲移除 CSS-in-JS 之后的新样式方案以及构建时 CSS-in-JS 方案看法。

带着这篇文章的结尾带来的启发,我开始考虑未来我们项目的改进方案。可能还需要多一些深入研究和局部实验之后才会有明确的答案。


作者:非职业「传道授业解惑」的开发者叶一一简介:「趣学前端」、「CSS畅想」系列作者,华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。如果看完文章有所收获,欢迎点赞

标签:classNames,selected,classnames,React,switch,玩转,true,CSS
From: https://blog.51cto.com/u_15838863/7007583

相关文章

  • React—02—描述UI
    不要在渲染dom的时候修改数据,否则可能会触发重新渲染。   React提供了“严格模式”,在严格模式下开发时,它将会调用每个组件函数两次。通过重复调用组件函数,严格模式有助于找到违反这些规则的组件。我们注意到,原始示例显示的是“Guest#2”、“Guest#4”和“Guest#6......
  • React Hook 的闭包陷阱
    参考文章1.从reacthooks“闭包陷阱”切入,浅谈reacthooks2.一文讲透ReactHooks闭包陷阱 HooksHooks是react自16.8引入的新特性,使得开发者在摆脱class定义组件的同时,也能够进行状态管理。这样,react组件完全进入函数式(FP)编程范式。既然进入了函数式编程的......
  • [React Typescript] Ensure correct inference for prop types with satisfies & Comp
    import{ComponentProps}from"react";import{Equal,Expect}from"../helpers/type-utils";constbuttonProps={type:"button",//@ts-expect-errorillegalProperty:"IAMILLEGAL",}asconstsatisfiesC......
  • 【腾讯云 Cloud Studio 实战训练营】基于Cloud Studio构建React完成点餐H5页面
    前言最近也是有机会参与到了腾讯云举办的腾讯云CloudStudio实战训练营,借此了解了腾讯云CloudStudio产品。腾讯云CloudStudio的出现是有一定创新性的,使用它进行开发免去了使用一些传统开发工具的成本。如下载一个开发工具就要进行基本的开发环境配置,以及下载、安装......
  • 异步请求返回处理之finally的用途,代码规范摸索【玩转JavaScript】
    前言最近在改动老代码时,发现了一个有趣的现象。对于异步请求返回结果处理中,使用finally做兜底处理,不同的页面并不统一,也就是有的页面使用了,有的页面没使用,没使用的页面增加了额外的失败的处理。所以finally到底要不要统一?本着代码规范化原则的思维,我准备一探究竟。文章速度finally......
  • 为react项目添加开发/提交规范(前端工程化、eslint、prettier、husky、commitlint、sty
    因历史遗留原因,接手的项目没有代码提醒/格式化,包括eslint、pretttier,也没有commit提交校验,如husky、commitlint、stylelint,与其期待自己或者同事的代码写得完美无缺,不如通过一些工具来进行规范和约束。eslinteslint是一个代码校验工具,用来规范项目代码风格。初始化通过n......
  • 【腾讯云Cloud Studio实战训练营】React 快速构建点餐页面
    前言:CloudStudio是一个在线的云集成开发环境(IDE),可以让开发人员在浏览器中轻松地开发、测试、调试和部署应用程序。它提供了基于云的计算资源和工具,例如代码编辑器、编译器、调试器、版本控制系统和项目管理工具等,使开发人员可以在任何地点使用任何设备进行开发,而不需要在本地安装......
  • 全能指挥官:玩转JavaScript命令模式,让代码听你的话!
    前言系列首发于公众号『非同质前端札记』,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。全能指挥官:玩转JavaScript命令模式,让代码听你的话!命令模式的含义命令模式指的是一个执行某些特定的指令。命令模式的示例demo://命令接口classCommand{execute(){......
  • 用React仿钉钉审批流
    引言这几天帮朋友忙,用了一周时间,高仿了一个钉钉审批流。这个东西会有不少朋友有类似需求,就分享出来,希望能有所帮助。为了方便朋友的使用,设计制作的时候,尽量做到节点配置可定制,减少集成成本。如果您的项目有审批流需求,这个项目可以直接拿过去使用。React初学者也可以把本项目当做......
  • 前端学习笔记202306学习笔记第四十八天-react-admin marmelab之6
            ......