文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

React classnames原理及测试用例

2022-12-19 18:01

关注

前言

本期的源码阅读任务是:

源码地址:JedWatson/classnames: A simple javascript utility for conditionally joining classNames together (github.com)

classnames 的用法

Classname 是一个 JavaScript 库,它允许您有条件地将类名连接在一起。在构建 React 组件或需要根据某些条件动态生成类名时,它可能非常有用。

下面是一个如何使用 classnames 的例子:

import classnames from 'classnames';
const Button = ({ primary, size }) => {
  const classes = classnames('btn', {
    'btn-primary': primary,
    'btn-large': size === 'large',
    'btn-small': size === 'small',
  });
  return <button className={classes}>Click me</button>;
};

在上面的示例中,classnames 函数接受一个类名和一个将类名映射为布尔值的对象。如果给定类名的布尔值为 true,则该类名将包含在类名的最终列表中。如果值为 false,则不包括类名。

还可以将一个字符串作为第二个参数传递给类名,在这种情况下,如果值为 true,那么它将被添加到类名的最终列表中。

const classes = classnames('btn', primary && 'btn-primary');

学会 classnames 的原理

classnames 源码并不复杂,除去一些兼容性判断,主要功能实现的代码如下:

function classNames() {
  var classes = [];
  for (var i = 0; i < arguments.length; i++) {
    var arg = arguments[i];
    if (!arg) continue;
    var argType = typeof arg;
    if (argType === "string" || argType === "number") {
      classes.push(arg);
    } else if (Array.isArray(arg)) {
      if (arg.length) {
        var inner = classNames.apply(null, arg);
        if (inner) {
          classes.push(inner);
        }
      }
    } else if (argType === "object") {
      if (
        arg.toString !== Object.prototype.toString &&
        !arg.toString.toString().includes("[native code]")
      ) {
        classes.push(arg.toString());
        continue;
      }
      for (var key in arg) {
        if (hasOwn.call(arg, key) && arg[key]) {
          classes.push(key);
        }
      }
    }
  }
  return classes.join(" ");
}

主要工作原理如下:

测试用例的使用

className 库使用 Mocha 进行代码测试:

Mocha 是一个运行在 Node.js 和浏览器上的 JavaScript 测试框架。它用于编写和运行 JavaScript 代码的测试用例。

使用 Mocha 写测试用例的简单示例:

const assert = require("assert");
describe("myFunction", () => {
  it("should return the expected result", () => {
    assert.equal(myFunction(1, 2), 3);
  });
});

一些测试用例

describe('classNames', function () {
    // 测试能够识别具有真值得对象
    it('keeps object keys with truthy values', function () {
            assert.equal(classNames({
                    a: true,
                    b: false,
                    c: 0,
                    d: null,
                    e: undefined,
                    f: 1
            }), 'a f');
    });
    // 检查 classNames 函数是否正确地处理了其输入参数中的假值,并且只在生成的类名字符串中包含真值。
    it('joins arrays of class names and ignore falsy values', function () {
            assert.equal(classNames('a', 0, null, undefined, true, 1, 'b'), 'a 1 b');
    });
    // 这个测试用例检查 classNames 函数是否正确地处理了各种不同类型的参数
    it('supports heterogenous arguments', function () {
            assert.equal(classNames({a: true}, 'b', 0), 'a b');
    });
    // 这个测试用例检查 classNames 函数是否正确地从生成的类名字符串中删除了前导空格和尾随空格。
    it('should be trimmed', function () {
            assert.equal(classNames('', 'b', {}, ''), 'b');
    });
    // 这个测试用例检查 classNames 函数在调用时是否返回一个空字符串,该函数的唯一参数是一个空对象。
    it('returns an empty string for an empty configuration', function () {
            assert.equal(classNames({}), '');
    });
    // ... 省略部分测试用例
});

总结

Classname 非常有用,它能够根据应用程序的状态构建动态类名。避免编写冗长和重复的 if-else 语句来构建类名。同时,源码测试用例写得非常详尽,很有借鉴意义,可以用来参考给自己的代码写一些测试用例。

以上就是React classnames原理及测试用例的详细内容,更多关于React classnames测试用例的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯