Tailwind CSS Academy · पाठ

React में सशर्त क्लास

कंपोनेंट प्रॉप्स और स्थिति के आधार पर सशर्त रूप से Tailwind क्लास लागू करने और उन्हें सुरक्षित रूप से मर्ज करने के लिए clsx या tailwind-merge का उपयोग करें, ताकि क्लास टकराव न हो।

पाठ 2, कुल 4 में से13 चरण

React में सशर्त क्लास, CoddyKit पर Tailwind CSS Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Tailwind CSS Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Tailwind CSS Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

स्ट्रिंग जोड़ने की समस्या

React में Tailwind क्लास को सशर्त रूप से लागू करना शुरुआत में आसान लगता है, लेकिन सरल स्ट्रिंग जोड़ना जल्द ही त्रुटि-प्रवण हो जाता है। टेम्पलेट लिटरल से स्ट्रिंग जोड़ने पर undefined या false अनजाने में className में शामिल हो सकते हैं, जिससे DOM में अमान्य क्लास नाम आ जाते हैं। इससे भी गंभीर बात यह है कि परस्पर विरोधी Tailwind यूटिलिटी — जैसे text-blue-500 और text-red-500 — एक-दूसरे को रद्द नहीं करतीं; किसकी प्राथमिकता होगी, यह आपकी className स्ट्रिंग के क्रम से नहीं, बल्कि स्टाइलशीट के क्रम से निर्धारित होता है।

// Problematic — may include 'false' or 'undefined' in class list
function Button({ disabled, primary }) {
  return (
    <button
      className={'px-4 py-2 rounded ' +
        primary && 'bg-blue-500 text-white' +  // bug: && short-circuit
        disabled && 'opacity-50'               // 'false' in string
      }
    >
      Click me
    </button>
  );
}

सशर्त क्लास के लिए clsx का उपयोग

clsx एक छोटी यूटिलिटी है जो सशर्त मानों, ऑब्जेक्ट और ऐरे से className स्ट्रिंग सुरक्षित रूप से बनाती है। यह false, null और undefined जैसे असत्य मानों को हटा देती है, इसलिए आपके DOM में हमेशा साफ़ क्लास नाम आते हैं। आप स्ट्रिंग, बूलियन मानों वाले ऑब्जेक्ट या इनमें से किसी के ऐरे पास कर सकते हैं। इसे npm install clsx से इंस्टॉल करें और जहाँ भी सशर्त क्लास तर्क की आवश्यकता हो, वहाँ इम्पोर्ट करें।

import clsx from 'clsx';

function Button({ disabled, primary, className }) {
  return (
    <button
      className={clsx(
        'px-4 py-2 rounded font-medium transition-colors',
        primary && 'bg-blue-600 text-white hover:bg-blue-700',
        !primary && 'bg-gray-100 text-gray-900 hover:bg-gray-200',
        disabled && 'opacity-50 cursor-not-allowed',
        className  // allow caller to pass extra classes
      )}
      disabled={disabled}
    >
      Click me
    </button>
  );
}

clsx ऑब्जेक्ट सिंटैक्स

clsx एक ऑब्जेक्ट सिंटैक्स स्वीकार करता है, जिसमें कुंजियाँ क्लास नाम और मान बूलियन शर्तें होती हैं। यह तब विशेष रूप से पढ़ने योग्य होता है जब आपके पास किसी उद्देश्य के अनुसार समूहित कई सशर्त क्लास हों। आप एक ही clsx कॉल में ऑब्जेक्ट सिंटैक्स को क्रमिक स्ट्रिंग आर्ग्युमेंट के साथ मिला सकते हैं, जिससे बिना शर्त वाली आधार क्लास को सशर्त वैरिएंट क्लास से अलग करना आसान हो जाता है।

import clsx from 'clsx';

function Alert({ type }) {
  return (
    <div
      className={clsx(
        // Unconditional base classes
        'rounded-lg border p-4 flex items-start gap-3',
        // Conditional classes via object syntax
        {
          'bg-red-50 border-red-200 text-red-800': type === 'error',
          'bg-yellow-50 border-yellow-200 text-yellow-800': type === 'warning',
          'bg-green-50 border-green-200 text-green-800': type === 'success',
          'bg-blue-50 border-blue-200 text-blue-800': type === 'info'
        }
      )}
    >
      {/* alert content */}
    </div>
  );
}

क्लास टकराव की समस्या

clsx साफ़ क्लास स्ट्रिंग बनाने के बावजूद Tailwind क्लास के टकराव की समस्या बनी रहती है। यदि पैरेंट text-blue-500 लागू करता है और चाइल्ड या ओवरराइड text-red-500 लागू करता है, तो दोनों क्लास DOM में दिखाई देती हैं। CSS कैस्केड क्रम (DOM क्रम नहीं) यह तय करता है कि किसकी प्राथमिकता होगी — यानी स्टाइलशीट में Tailwind ने जिसे सबसे बाद में जनरेट किया हो। इससे ओवरराइड का व्यवहार अनिश्चित हो जाता है, खासकर जब कॉल करने वाले कॉम्पोनेंट से className प्रॉप पास किए जाते हैं।

// Class conflict example
function Badge({ className }) {
  return (
    <span className={clsx('bg-blue-500 text-white px-2 py-0.5 rounded', className)}>
      Tag
    </span>
  );
}

// Caller tries to override background
<Badge className="bg-red-500" />
// Result: both bg-blue-500 AND bg-red-500 in the DOM
// Which one wins depends on Tailwind's stylesheet order, not your intent

tailwind-merge टकरावों का समाधान करता है

tailwind-merge (twMerge) Tailwind के यूटिलिटी समूहों को समझता है और यह सुनिश्चित करता है कि किसी भी परस्पर विरोधी प्रॉपर्टी का अंतिम मान लागू हो। यह समझता है कि bg-blue-500 और bg-red-500 दोनों background-color सेट करते हैं, इसलिए यह केवल अंतिम वाले को रखता है। इसे npm install tailwind-merge से इंस्टॉल करें और अनुमानित ओवरराइड व्यवहार के लिए अपनी clsx कॉल को twMerge से रैप करें।

import { twMerge } from 'tailwind-merge';
import clsx from 'clsx';

function Badge({ className }) {
  return (
    <span
      className={twMerge('bg-blue-500 text-white px-2 py-0.5 rounded', className)}
    >
      Tag
    </span>
  );
}

// Caller override now works correctly!
<Badge className="bg-red-500" />
// Result: only bg-red-500 (bg-blue-500 is removed by twMerge)

cn() हेल्पर पैटर्न

अधिकांश Next.js और React प्रोजेक्ट में आपको cn() नाम का एक यूटिलिटी फ़ंक्शन दिखाई देगा, जो clsx और tailwind-merge को एक सुविधाजनक कॉल में जोड़ता है। यह पैटर्न इतना सामान्य है कि shadcn/ui के साथ create-next-app इसे डिफ़ॉल्ट रूप से शामिल करता है। इसे एक बार किसी यूटिलिटी फ़ाइल में परिभाषित करें और जहाँ भी सशर्त, टकराव-मुक्त क्लास प्रबंधन की आवश्यकता हो, वहाँ इम्पोर्ट करें।

// lib/utils.ts
import { clsx, type ClassValue } from 'clsx';
import { twMerge } from 'tailwind-merge';

export function cn(...inputs: ClassValue[]) {
  return twMerge(clsx(inputs));
}

// Usage in any component
import { cn } from '@/lib/utils';

function Card({ className, children }) {
  return (
    <div className={cn(
      'rounded-xl border bg-white shadow-sm p-6',
      className
    )}>
      {children}
    </div>
  );
}

स्थिति के आधार पर सशर्त क्लास

cn() हेल्पर तब विशेष रूप से उपयोगी होता है जब कॉम्पोनेंट की स्थिति दृश्य बदलाव नियंत्रित करती है। टॉगल स्विच, सक्रिय नेविगेशन आइटम या सत्यापन त्रुटियों वाले फ़ॉर्म फ़ील्ड — इन सभी को JavaScript स्थिति के आधार पर बदलने वाली क्लास की आवश्यकता होती है। ऑब्जेक्ट सिंटैक्स के साथ cn का उपयोग करने पर स्थिति और स्टाइल के बीच संबंध तुरंत स्पष्ट हो जाता है — कॉम्पोनेंट पढ़ने वाला कोई भी व्यक्ति देख सकता है कि किन शर्तों पर कौन-सी क्लास लागू होंगी।

import { cn } from '@/lib/utils';

function NavItem({ href, active, children }) {
  return (
    <a
      href={href}
      className={cn(
        'flex items-center gap-2 px-3 py-2 rounded-lg text-sm font-medium',
        'transition-colors duration-150',
        {
          'bg-blue-50 text-blue-700': active,
          'text-gray-600 hover:bg-gray-100 hover:text-gray-900': !active
        }
      )}
    >
      {children}
    </a>
  );
}

className प्रॉप सुरक्षित रूप से पास करना

पुनः उपयोग योग्य कॉम्पोनेंट के लिए एक महत्वपूर्ण डिज़ाइन निर्णय यह है कि className प्रॉप को कैसे संभाला जाए। twMerge का उपयोग यह सुनिश्चित करता है कि कॉल करने वाले द्वारा दी गई क्लास डिफ़ॉल्ट क्लास को सही ढंग से ओवरराइड करे। हालाँकि, कुछ क्लास को कभी ओवरराइड नहीं किया जाना चाहिए — जैसे कॉम्पोनेंट का लेआउट निर्धारित करने वाली संरचनात्मक क्लास। एक तरीका यह है कि संरचनात्मक क्लास को मर्ज किए बिना लागू करें और केवल प्रस्तुति संबंधी क्लास को कॉल करने वाले के इनपुट के साथ मर्ज करें।

import { cn } from '@/lib/utils';

function Input({ className, hasError, ...props }) {
  return (
    <input
      className={cn(
        // Base structural: never overridden
        'block w-full rounded-lg border px-3 py-2 text-sm',
        'placeholder:text-gray-400 focus:outline-none focus:ring-2',
        // Conditional state classes
        hasError
          ? 'border-red-300 focus:ring-red-500'
          : 'border-gray-300 focus:ring-blue-500',
        // Caller overrides presentational classes
        className
      )}
      {...props}
    />
  );
}

डायनेमिक क्लास नामों से बचना

Tailwind का JIT इंजन स्रोत फ़ाइलों को पूर्ण स्ट्रिंग के रूप में स्कैन करके क्लास नामों का पता लगाता है। क्लास नामों को कभी भी डायनेमिक रूप से न बनाएँ, जैसे 'text-' + color + '-500' जैसी अधूरी स्ट्रिंग जोड़कर। JIT स्कैनर इनका पता नहीं लगा पाएगा और प्रोडक्शन बंडल से ये क्लास हटा दी जाएँगी। हमेशा पूर्ण क्लास नाम वाली स्ट्रिंग का उपयोग करें, भले ही इसके लिए लंबी सशर्त अभिव्यक्ति लिखनी पड़े।

// WRONG — JIT cannot detect these dynamic class names
const colors = { info: 'blue', error: 'red' };
<div className={'text-' + colors[type] + '-500'} />

// CORRECT — full class names that JIT can detect
const colorMap = {
  info: 'text-blue-500 bg-blue-50',
  error: 'text-red-500 bg-red-50',
  success: 'text-green-500 bg-green-50'
};
<div className={cn('rounded p-3', colorMap[type])} />

क्लास गणनाओं को मेमोआइज़ करना

जब कोई कॉम्पोनेंट बार-बार रेंडर होता है और उसमें जटिल className गणनाएँ होती हैं, तो परिणाम को useMemo से मेमोआइज़ करने पर विचार करें। clsx और twMerge ऑपरेशन तेज़ होते हैं, लेकिन प्रति सेकंड सैकड़ों बार रेंडर होने वाले कॉम्पोनेंट (जैसे वर्चुअल लिस्ट आइटम) में छोटी-छोटी बचत भी जुड़ जाती है। अधिक सामान्य स्थिति में, क्लास गणना को JSX के बाहर किसी चर में निकालना प्रदर्शन की परवाह किए बिना पठनीयता सुधारता है।

import { useMemo } from 'react';
import { cn } from '@/lib/utils';

function ListItem({ selected, variant, className }) {
  const itemClasses = useMemo(() => cn(
    'flex items-center gap-3 px-4 py-3 cursor-pointer',
    'border-b border-gray-100 transition-colors',
    {
      'bg-blue-50 border-l-2 border-l-blue-500': selected,
      'hover:bg-gray-50': !selected,
      'opacity-50 pointer-events-none': variant === 'disabled'
    },
    className
  ), [selected, variant, className]);

  return <div className={itemClasses}>{/* content */}</div>;
}

सशर्त क्लास तर्क का परीक्षण

प्रतिगमन रोकने के लिए जटिल सशर्त क्लास तर्क वाले कॉम्पोनेंट के लिए यूनिट परीक्षण लिखें। React Testing Library का उपयोग करके आप प्रॉप मानों के आधार पर विशिष्ट Tailwind क्लास के मौजूद या अनुपस्थित होने की पुष्टि कर सकते हैं। यह पहुँच-योग्यता से संबंधित क्लास के लिए विशेष रूप से महत्वपूर्ण है — यह परीक्षण करना कि अक्षम बटन में cursor-not-allowed और opacity-50 हैं, आपको आश्वस्त करता है कि UI संकेत सही हैं।

// Button.test.tsx
import { render, screen } from '@testing-library/react';
import { Button } from './Button';

test('disabled button has correct classes', () => {
  const { container } = render(
    <Button disabled>Submit</Button>
  );
  const btn = container.firstChild;
  expect(btn.className).toContain('opacity-50');
  expect(btn.className).toContain('cursor-not-allowed');
});

test('primary variant applies correct colors', () => {
  const { container } = render(
    <Button primary>Submit</Button>
  );
  expect(container.firstChild.className).toContain('bg-blue-600');
});

त्वरित जाँच

इस पाठ में Tailwind CSS Mastery की अवधारणाओं की अपनी समझ जाँचें।

पाठ का पुनरावलोकन

इस पाठ में आपने सीखा: clsx असत्य मानों को हटाकर सशर्त क्लास स्ट्रिंग सुरक्षित रूप से बनाता है; tailwind-merge परस्पर विरोधी Tailwind यूटिलिटी का समाधान करता है, जिससे सबसे बाद में लागू की गई यूटिलिटी प्रभावी होती है; और cn() हेल्पर दोनों को एक ही कॉल में जोड़ता है, जिसका उपयोग आपके पूरे React प्रोजेक्ट में किया जा सकता है। आगे हम टाइप किए गए वैरिएंट API के लिए CVA के साथ कॉम्पोनेंट वैरिएंट सीखेंगे।

शुरुआत निःशुल्क

एआई शिक्षक के साथ HTML सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
30
पाठ
120

अक्सर पूछे जाने वाले प्रश्न

क्या “React में सशर्त क्लास” पाठ निःशुल्क है?

हाँ—“React में सशर्त क्लास” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Tailwind CSS Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Tailwind CSS Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“React में सशर्त क्लास” में मैं क्या सीखूँगा?

कंपोनेंट प्रॉप्स और स्थिति के आधार पर सशर्त रूप से Tailwind क्लास लागू करने और उन्हें सुरक्षित रूप से मर्ज करने के लिए clsx या tailwind-merge का उपयोग करें, ताकि क्लास टकराव न हो। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Tailwind CSS Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Tailwind CSS Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Tailwind CSS Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“React में सशर्त क्लास” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Tailwind CSS Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Tailwind CSS Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Next.js में Tailwind सेट अप करना
  2. React में सशर्त क्लास
  3. CVA के साथ कंपोनेंट वैरिएंट
  4. tailwind-merge से क्लास टकराव से बचना
← Tailwind CSS Academy पर वापस जाएँ