ReactNext
React-documentationBasics-1

1.6 About JSX

Welcome to React Next Documentation Bangla

JSX কি?

JSX হলো জাভাস্ক্রিপ্টের একটি সিনট্যাক্স এক্সটেনশন, যা আমাদেরকে HTML এর মতো মার্কাপ লিখতে সাহায্য করে। যখন তুমি JSX ব্যবহার করো, তখন একই জায়গায় (কম্পোনেন্টের ভিতর) জাভাস্ক্রিপ্টের লজিক এবং HTML এর মার্কাপ একসাথে লিখতে পারো। এর ফলে, যদি কখনো কিছু পরিবর্তন করতে হয়, তাহলে তোমার কাছে বেশিরভাগ সময় বেশি ফ্লেক্সিবিলিটি থাকে।

JSX দেখতে একদম HTML এর মতো মনে হলেও, এটি আসলে HTML নয়; বরং এটি অনেক বেশি Strict। যদি JSX এ কোথাও ভুল হয়, তবে তা সাথে সাথে Error দিয়ে জানিয়ে দেয়।

HTML এর মতো, JSX তে আমরা শুধুমাত্র স্ট্যাটিক কন্টেন্ট লিখতে পারি না; বরং আমরা ডাইনামিক ভ্যালু ব্যবহার করতে পারি।

JSX লিখার রুলসগুলো কি কি?


JSX লিখতে গেলে কিছু নিয়ম মেনে চলতে হয়। চলুন দেখি সেগুলো কী কী:

1. Return a Single Root Element

JSX কে অবশ্যই একটি সিঙ্গেল রুট এলিমেন্ট রিটার্ন করতে হবে। যদি একাধিক এলিমেন্ট রিটার্ন করতে হয়, তাহলে একটি প্যারেন্ট এলিমেন্ট দিয়ে wrap করতে হবে। সাধারণত <div> ব্যবহার করা হয়, যদিও কখনো কখনো এটি অপ্রয়োজনীয় হতে পারে।

❌ ভুল উদাহরণ

export default function Profile() {
    return (
        <h1>Hello Mr XX</h1>
        <p>Your age is 30</p>
        // এই কোডটা কাজ করবেনা, কারণ দুইটা এলিমেন্টকে রিটার্ন করা হয়েছে।
    );
}

✅ সঠিক উদাহরণ

export default function Profile() {
  return (
    <div>
      <h1>Hello Mr XX</h1>
      <p>Your age is 30</p>
    </div>
    // এই কোডটা কাজ করবে, কারণ দুইটা এলিমেন্টকে একটি প্যারেন্ট `<div>` দিয়ে wrap করা হয়েছে।
  );
}

যদি অতিরিক্ত <div> এলিমেন্ট রেন্ডার করতে না চান, তাহলে Fragment ব্যবহার করতে পারো:

import React, { Fragment } from "react";
 
export default function Profile() {
    return (
        <Fragment>
            <h1>Hello Mr XX</h1>
            <p>Your age is 30</p>
        </Fragment>
    );
}
// অথবা সংক্ষিপ্তভাবে
export default function Profile() {
    return (
        <>
            <h1>Hello Mr XX</h1>
            <p>Your age is 30</p>
        </>
    );
}

কেন আমাদের একটি মূল JSX রিটার্ন করতে হয়?


যেকোন প্রোগ্রামিং ভাষায় একটি ফাংশন থেকে কেবল একটি ডেটা টাইপ/স্ট্রাকচার রিটার্ন করা যায়। যেমন:

function returnOne() {
  return 1;
} // একটি নাম্বার রিটার্ন করা।
function returnTwo() {
  return 100, 500;
} // এইটি একটি সিনট্যাক্স এরর।

এখন, JSX এর ক্ষেত্রে:

function returnTwoJSX() {
    return (<h1>Hi</h1> <h2>Hello</h2>) // এটি সিনট্যাক্স এরর।
}

কিন্তু আমরা একটি Array এর ভিতরে অথবা একটি প্যারেন্ট এলিমেন্টের ভিতরে রেখে একটি ডেটা হিসেবেই return করতে পারি।

সল্যুশন ১ - প্যারেন্ট এলিমেন্ট দিয়ে Wrap করা

function returnParentJSX() {
  return (
    <div>
      <h1>Hi</h1>
      <h2>Hello</h2>
    </div>
  );
}
// Behind the scene
// এখানে return হচ্ছে একটি single object যেখানে props হিসেবে children রয়েছে।

সল্যুশন ২ - প্যারেন্ট হিসেবে Fragment ব্যবহার করা।

function returnFragmentJSX() {
  return (
    <>
      <h1>Hi</h1>
      <h2>Hello</h2>
    </>
  );
}
// Behind the scene
// এটি একাধিক এলিমেন্টকে একটি Fragment হিসেবে রিটার্ন করছে।

2. Close All Tags


JSX এ ব্যবহৃত প্রতিটি ট্যাগ অবশ্যই ক্লোজ করা লাগবে। সেলফ ক্লোজিং ট্যাগ যেমন <img>, <hr> ইত্যাদির ক্ষেত্রে অবশ্যই এভাবে লিখতে হবে: <img />, <hr />

উদাহরণ

export default function MyImage() {
  return <img src="image.jpg" alt="Example" />;
}

3. camelCase for Attributes

JSX এ যেহেতু আমরা JavaScript লিখছি, সেহেতু multiple-word এর attribute গুলোকে camelCase এ লিখতে হবে।

উদাহরণ

export default function MyComponent() {
  return <div className="my-class">Hello World</div>;
}

Notes:

  • class attribute টা যেহেতু জাভাস্ক্রিপ্টের রিজার্ভ কিওয়ার্ড, তাই আমাদের class ব্যবহার করতে পারবোনা। এর পরিবর্তে className ব্যবহার করতে হবে।

JSX এর কার্যকারিতা


যদি JSX এর বদলে সরাসরি JavaScript Object Return করা হয়:

function returnDirectObject() {
  return {
    type: "div",
    props: {
      className: "bg-white",
      children: [
        { type: "h1", props: { children: "Hi" } },
        { type: "p", props: { children: "Hello World" } },
      ],
    },
  };
}

এটি কাজ করবেনা, কারণ এই Object টি React এর ওয়েতে বানানো হয়নি। React createElement ফাংশনের মাধ্যমে Object তৈরি করে:

import { createElement } from "react";
 
function returnDirectObject() {
  return createElement(
    "div",
    { className: "bg-white" },
    createElement("h1", { className: "text-2xl" }, "Hi"),
    createElement("p", null, "Hello World")
  );
}

উপসংহার

JSX আমাদেরকে HTML এর মতো মার্কাপ লিখতে সহায়তা করে এবং এর সাথে যুক্ত জাভাস্ক্রিপ্টের কার্যকারিতাও ব্যবহার করতে দেয়। JSX এর কিছু নির্দিষ্ট রুলস মেনে চললে আমরা কার্যকরী ও ডাইনামিক UI তৈরি করতে পারি। মনে রেখো, সঠিকভাবে JSX ব্যবহার করলে তোমার কোড পরিষ্কার ও ব্যবহারে সহজ হয়।

On this page