首页 > 编程语言 >三千字详解 classnames,精读源码,解读重点功能的实现

三千字详解 classnames,精读源码,解读重点功能的实现

时间:2023-06-14 10:01:36浏览次数:48  
标签:function 精读 classnames js classNames 源码 arg true

前言

本文主要讲解 classnames 相关的知识点。

对 classnames 用法做了详细介绍。

对 classnames 源码,按照功能模块进行解读。尤其对于源码中关键代码从实现层面做了解读。

在总结过程中,对 CSS-in-JS 写法有了不同的想法,结合大佬的文章,将想法记录在了文末。

文章速读

阅读本篇文章,你将有如下图中的收获:

三千字详解 classnames,精读源码,解读重点功能的实现_源码

三千字详解 classnames,精读源码,解读重点功能的实现_classname_02

听说你叫 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,精读源码,解读重点功能的实现_源码_03

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>

小结

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

classnames 的原理

源码目录

功能模块

三千字详解 classnames,精读源码,解读重点功能的实现_源码_04

三千字详解 classnames,精读源码,解读重点功能的实现_classname_05

目录结构

classnames
 ┣ 

标签:function,精读,classnames,js,classNames,源码,arg,true
From: https://blog.51cto.com/u_15838863/6475617

相关文章

  • odoo16.0源码安装Ubuntu22.04环境
    同样使用的OS是ubuntu22.04,通过vbox虚拟机来进行测试安装。一、安装好虚拟环境以后,先更新一下当前系统sudoapt-getupdate&&sudoapt-getupgrade二、安装odoo运行环境依赖包、node.js包安装工具,以及rtlcss包sudo apt-get install npmxfonts-encodingsxfonts-utilspy......
  • 开源互联网医院系统源码开发:构建个性化、精准化医疗服务新模式
    时下,许多行业已经跟互联网有了非常深入的结合,今天我们要讲的医疗行业同样不例外。构建个性化、精准化医疗服务的新模式势在必行,而开源互联网医院系统源码开发则为实现这一目标提供了技术支持。一、开源互联网医院系统源码开发开源互联网医院系统源码开发是一种基于开源技术的医疗服......
  • IDEA查看jdk源码(附开源项目)
    文章目录一、获取源码二、将源码导入到IDEA中1、点击File->ProjectStructure2、在左侧栏选择SDKs,选择1.8,在选择“+”添加路径3、选择你JDK安装路径下的src.zip文件4、新添加的文件,在这里可以看到5、ExternalLibraries下的<1.7>下可以找到相应的src.zip文件,三、开源项目(JDK12)......
  • 直播软件源码,元素水平垂直居中
    直播软件源码,元素水平垂直居中  position:absolute; top:45%; left:50%; transform:translate(-50%,-50%);​以上就是直播软件源码,元素水平垂直居中,更多内容欢迎关注之后的文章 ......
  • 尚医通-day10【微信扫码登录】(内附源码)
    第01章-准备工作1、申请微信登录https://open.weixin.qq.com(1)注册开发者账号:准备营业执照(2)邮箱激活(3)完善开发者资料(4)开发者资质认证:1-2个工作日审批、300元(5)创建网站应用:提交审核,7个工作日审批(免费)(6)熟悉微信登录流程参考文档:https://developers.weixin.qq.com/doc/oplat......
  • Android-RIL&IMS源码分析
    一、需求1、了解IMS相关知识体系2、RILD与RILJ、IMS回调消息的机制二、相关概念2.1IMS        IMS全称是IPMultimediaSubsystem,中文意义为IP多媒体子系统。IMS是一种基于IP基础结构,能够融合数据、话音和移动等网络技术的系统。        IP=基于IP的......
  • 你真的读懂了Java源码?Collections源码初探
    最近重温Java知识,遇到不懂的问题搜索互联网/博客很难直接找到答案,还好如今有了chatGPT,比大多数CV复读机/纯文档翻译的内容更有用。很多文章总结冠以“深入理解xxx”,“万字长文详解xxx”的文章,也不过是演示一遍调用代码,让你知道了怎么用,在什么情况下用。但至于为什么这么用,以及Java......
  • 一对一直播源码平台搭建的关键条件,成败在此。
     网络时代的前进,人们对直播也有了新的要求,对于观众们来说,大多数观众更喜欢只让自己和主播进行交流,只有不仅仅能增加私密性,而且还能和自己喜欢的主播更加亲近真实,像是面对面一样;而对于主播而言,大部分主播都想让自己轻松许多,并且收益更高。而随着直播源码平台的发展,一对一直播源码......
  • 手撕switch处理String底层源码
    publicfinalclassStringimplementsjava.io.Serializable,Comparable<String>,CharSequence{ privatefinalchar[]value;privateinthash;//hash值publicString(Stringoriginal){this.value=original.value;//['a�......
  • Object源码阅读
    Object源码阅读native:本地栈方法,使用C语言中实现的方法。packagejava.lang;publicclassObject{ //注册本地方法privatestaticnativevoidregisterNatives();static{registerNatives();}//返回Object对象的classpublicfinalna......