最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React?classnames原理及測試用例

 更新時(shí)間:2022年12月19日 16:22:04   作者:codeniu  
這篇文章主要為大家介紹了React?classnames原理及測試用例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

本期的源碼閱讀任務(wù)是:

  • 學(xué)會(huì) classnames 的用法
  • 學(xué)會(huì) classnames 的原理
  • 測試用例的使用

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

classnames 的用法

Classname 是一個(gè) JavaScript 庫,它允許您有條件地將類名連接在一起。在構(gòu)建 React 組件或需要根據(jù)某些條件動(dòng)態(tài)生成類名時(shí),它可能非常有用。

下面是一個(gè)如何使用 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 函數(shù)接受一個(gè)類名和一個(gè)將類名映射為布爾值的對(duì)象。如果給定類名的布爾值為 true,則該類名將包含在類名的最終列表中。如果值為 false,則不包括類名。

還可以將一個(gè)字符串作為第二個(gè)參數(shù)傳遞給類名,在這種情況下,如果值為 true,那么它將被添加到類名的最終列表中。

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

學(xué)會(huì) classnames 的原理

classnames 源碼并不復(fù)雜,除去一些兼容性判斷,主要功能實(shí)現(xiàn)的代碼如下:

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(" ");
}

主要工作原理如下:

  • 函數(shù)聲明了一個(gè)名為 class 的空數(shù)組,該數(shù)組將用于存儲(chǔ)生成的類名。
  • 然后,函數(shù)進(jìn)入一個(gè)循環(huán),循環(huán)遍歷傳遞給函數(shù)的參數(shù)。對(duì)于每個(gè)參數(shù),執(zhí)行以下步驟:
  • 檢查參數(shù)的類型。如果它是一個(gè)字符串或數(shù)字,添加到類數(shù)組。
  • 如果參數(shù)是數(shù)組,則函數(shù)檢查它是否為非空。如果是,則函數(shù)以數(shù)組元素作為參數(shù)遞歸地調(diào)用自身,并將結(jié)果添加到類數(shù)組中。
  • 如果參數(shù)是一個(gè)對(duì)象,那么函數(shù)將檢查它是否有一個(gè) toString 方法,該方法不是本機(jī) Object.Prototype.toString 方法。如果是這樣,調(diào)用 oString 的結(jié)果將添加到類數(shù)組中。如果不是,函數(shù)將遍歷對(duì)象自己的可枚舉屬性,并將屬性名稱添加到類數(shù)組中(如果它們的對(duì)應(yīng)值為真)。
  • 循環(huán)結(jié)束后,將類數(shù)組合并到一個(gè)單獨(dú)的字符串中,使用一個(gè)空格字符作為分隔符,并返回結(jié)果字符串。

測試用例的使用

className 庫使用 Mocha 進(jìn)行代碼測試:

Mocha 是一個(gè)運(yùn)行在 Node.js 和瀏覽器上的 JavaScript 測試框架。它用于編寫和運(yùn)行 JavaScript 代碼的測試用例。

使用 Mocha 寫測試用例的簡單示例:

const assert = require("assert");
describe("myFunction", () => {
  it("should return the expected result", () => {
    assert.equal(myFunction(1, 2), 3);
  });
});
  • it 函數(shù)用于定義單個(gè)測試用例。
  • 斷言模塊用于驗(yàn)證函數(shù)是否返回預(yù)期的結(jié)果。

一些測試用例

describe('classNames', function () {
    // 測試能夠識(shí)別具有真值得對(duì)象
    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 函數(shù)是否正確地處理了其輸入?yún)?shù)中的假值,并且只在生成的類名字符串中包含真值。
    it('joins arrays of class names and ignore falsy values', function () {
            assert.equal(classNames('a', 0, null, undefined, true, 1, 'b'), 'a 1 b');
    });
    // 這個(gè)測試用例檢查 classNames 函數(shù)是否正確地處理了各種不同類型的參數(shù)
    it('supports heterogenous arguments', function () {
            assert.equal(classNames({a: true}, 'b', 0), 'a b');
    });
    // 這個(gè)測試用例檢查 classNames 函數(shù)是否正確地從生成的類名字符串中刪除了前導(dǎo)空格和尾隨空格。
    it('should be trimmed', function () {
            assert.equal(classNames('', 'b', {}, ''), 'b');
    });
    // 這個(gè)測試用例檢查 classNames 函數(shù)在調(diào)用時(shí)是否返回一個(gè)空字符串,該函數(shù)的唯一參數(shù)是一個(gè)空對(duì)象。
    it('returns an empty string for an empty configuration', function () {
            assert.equal(classNames({}), '');
    });
    // ... 省略部分測試用例
});

總結(jié)

Classname 非常有用,它能夠根據(jù)應(yīng)用程序的狀態(tài)構(gòu)建動(dòng)態(tài)類名。避免編寫冗長和重復(fù)的 if-else 語句來構(gòu)建類名。同時(shí),源碼測試用例寫得非常詳盡,很有借鑒意義,可以用來參考給自己的代碼寫一些測試用例。

以上就是React classnames原理及測試用例的詳細(xì)內(nèi)容,更多關(guān)于React classnames測試用例的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決React報(bào)錯(cuò)Expected an assignment or function call and instead saw an expression

    解決React報(bào)錯(cuò)Expected an assignment or funct

    這篇文章主要為大家介紹了React報(bào)錯(cuò)Expected an assignment or function call and instead saw an expression解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • ReactNative踩坑之配置調(diào)試端口的解決方法

    ReactNative踩坑之配置調(diào)試端口的解決方法

    本篇文章主要介紹了ReactNative踩坑之配置調(diào)試端口的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 淺談React前后端同構(gòu)防止重復(fù)渲染

    淺談React前后端同構(gòu)防止重復(fù)渲染

    這篇文章主要介紹了淺談React前后端同構(gòu)防止重復(fù)渲染,首先解釋React前后端同構(gòu)、React首屏渲染的概念。然后通過這2個(gè)概念解決服務(wù)端渲染完成后瀏覽器端重復(fù)渲染的問題。有興趣的可以了解一下
    2018-01-01
  • React父組件調(diào)用子組件中的方法實(shí)例詳解

    React父組件調(diào)用子組件中的方法實(shí)例詳解

    最近做一個(gè)React項(xiàng)目,所有組件都使用了函數(shù)式組件,遇到一個(gè)父組件調(diào)用子組件方法的問題,下面這篇文章主要給大家介紹了關(guān)于React父組件調(diào)用子組件中方法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • React中redux的使用詳解

    React中redux的使用詳解

    Redux 是一個(gè)狀態(tài)管理庫,它可以幫助你管理應(yīng)用程序中的所有狀態(tài),Redux的核心概念之一是Store,它表示整個(gè)應(yīng)用程序的狀態(tài),這篇文章給大家介紹React中redux的使用,感興趣的朋友一起看看吧
    2023-12-12
  • 詳解React 16 中的異常處理

    詳解React 16 中的異常處理

    這篇文章主要介紹了詳解React 16 中的異常處理的相關(guān)資料,React 16.x 版本中,引入了所謂 Error Boundary 的概念,從而保證了發(fā)生在 UI 層的錯(cuò)誤不會(huì)連鎖導(dǎo)致整個(gè)應(yīng)用程序崩潰;未被任何異常邊界捕獲的異??赡軙?huì)導(dǎo)致整個(gè) React 組件樹被卸載,需要的朋友可以參考下
    2017-07-07
  • 解決React報(bào)錯(cuò)Property does not exist on type 'JSX.IntrinsicElements'

    解決React報(bào)錯(cuò)Property does not exist on 

    這篇文章主要為大家介紹了React報(bào)錯(cuò)Property does not exist on type 'JSX.IntrinsicElements'解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • react?中?mobx的使用案例詳解

    react?中?mobx的使用案例詳解

    這篇文章主要介紹了react?中?mobx的使用案例詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • 在react中使用tailwind的問題

    在react中使用tailwind的問題

    這篇文章主要介紹了在react中使用tailwind的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 詳解React 和 Redux的關(guān)系

    詳解React 和 Redux的關(guān)系

    這篇文章主要為大家介紹了React 和 Redux的關(guān)系,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11

最新評(píng)論

区。| 英山县| 恩平市| 从江县| 浏阳市| 荔波县| 政和县| 阿图什市| 牡丹江市| 永年县| 玛多县| 安化县| 蚌埠市| 乌什县| 吕梁市| 井冈山市| 乐业县| 汕头市| 定日县| 毕节市| 嵩明县| 杭锦后旗| 定边县| 鹤庆县| 上思县| 久治县| 宜良县| 宣武区| 保靖县| 普陀区| 孟村| 志丹县| 丽江市| 海阳市| 丰镇市| 永和县| 乐都县| 汶川县| 永年县| 开封市| 伊春市|