۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

مقدمه JSX: HTML که جاوا اسکریپت را انجام می دهد

آن را دوست داشته باشید یا از آن متنفر باشید، JSX تأثیر زیادی بر مهندسی جلویی گذاشته است. در اینجا اولین معرفی کد زبان قالب جاوا اسکریپت مبتنی بر HTML است.

آن را دوست داشته باشید یا از آن متنفر باشید، JSX تأثیر زیادی بر مهندسی جلویی گذاشته است. در اینجا اولین معرفی کد زبان قالب جاوا اسکریپت مبتنی بر HTML است.

JSX راهی برای نوشتن HTML در داخل جاوا اسکریپت است، اما بیشتر شبیه راهی برای نوشتن جاوا اسکریپت در داخل HTML است. به عنوان یک زبان الگو، مورد علاقه برخی و نفرت دیگران است. در اینجا نگاهی به نحوه کار و چرایی اهمیت آن می‌اندازیم.

قالب سازی با JSX

JSX به عنوان یک زبان قالب برای چارچوب React بسیار محبوب معرفی شد. این به شما راهی برای تعریف ساختار نمای برنامه با نشانه گذاری HTML می دهد که با زمینه جاوا اسکریپت برنامه در تعامل است. این تصور ساده در مواجهه با خرد متعارف در مورد جدا کردن دیدگاه از رفتار است، به همین دلیل است که توسعه دهندگان تمایل دارند یا آن را دوست داشته باشند یا از آن متنفر باشند.

با نادیده گرفتن بحث در مورد JSX اصولاً، می‌توانیم روی این سوال تمرکز کنیم که چگونه از آن استفاده کنیم. JSX استاندارد واقعی برای موتورهای قالب واکنشی است و الهام‌بخش موتورهایی است که توسط دیگران مانند Vue، Svelte و غیره استفاده می‌شوند. شکل اولیه JSX در برنامه React به این صورت است (نسخه زنده را ببینید):


import React from 'react';
export function App(props) {
  return (
    <div className='App'>
      <h1>Greetings from InfoWorld</h1>
      <h2>This is some JSX</h2>
    </div>
  );
}

اگر به همه چیز داخل

نگاه کنید، خواهید دید که فقط HTML است. با این حال، در داخل جاوا اسکریپت پیچیده شده است. HTML یک مقدار بازگشتی برای تابع App است که یک جزء کاربردی در React است. نشانه گذاری JSX مقدار برگشتی تابع است.

در اصل، مقدار برگشتی JSX به موتور رندر React می گوید که خروجی کامپوننت چیست.

HTML در جاوا اسکریپت

روزی روزگاری، دیدن نشانه‌گذاری در جاوا اسکریپت عجیب بود، اما اکنون رایج است. در واقع، داشتن نشانه گذاری و جاوا اسکریپت با هم بسیار راحت است. فرض کنید می خواهیم متغیری را در نشانه گذاری وارد کنیم. ما می‌توانیم این کار را انجام دهیم (نسخه زنده را ببینید):


export function App(props) {
  let [name, setName] = React.useState("User");
  return (
    <div className='App'>
      <h1>Greetings from InfoWorld</h1>
      <h2>Hello {name}</h2>
    </div>
  );
}

اکنون ما از متغیر “name” در داخل JSX استفاده می کنیم. متغیر name با استفاده از قلاب React.useState ایجاد می‌شود، اما تا زمانی که در محدوده باشد، می‌تواند هر متغیر جاوا اسکریپت باشد. (هنگام استفاده از اجزای تابعی، قلاب useState روش صحیح استفاده از یک متغیر در JSX است.)

پرانتزهای فرفری اطراف name در قالب JSX نشان‌دهنده عبارت JSX است. آنها به شما این امکان را می دهند که عبارات جاوا اسکریپت را در داخل نشانه گذاری و همچنین ارجاع به متغیرها اجرا کنید. جاوا اسکریپت در زمینه بزرگتر کد اطراف اجرا می شود – به همین دلیل است که می توانید به متغیرها ارجاع دهید.

اکنون ما شروع به دیدن برخی از قدرت هایی می کنیم که باعث موفقیت JSX شده است. شما تمام امکانات جاوا اسکریپت، کتابخانه های وارداتی مانند چارچوب React و یک دستور کامل HTML را دریافت می کنید که می تواند به این ویژگی ها اشاره کند.

توجه داشته باشید که JSX می تواند از عبارات استفاده کند، اما نه از جاوا اسکریپت کامل. نتیجه عبارت را در مکانی که در قالب یافت می شود به نمای نمایش می دهد. چیزهایی که مقداری را بر نمی‌گردانند، مانند حلقه‌ها، کار نمی‌کنند. (این با برخی دیگر از ابزارهای قالب متفاوت است.)  

حلقه

شما می توانید بسیاری از کارها را با JSX انجام دهید، و یکی از مهم ترین آنها حلقه زدن است. بیایید بگوییم که ما مجموعه ای از نژادهای سگ در محدوده داریم و اکنون می خواهیم آنها را به نمایش بگذاریم. نحوه انجام این کار به این صورت است (نسخه زنده را ببینید):


<div className='App'>
    <h1>Greetings from InfoWorld</h1>
    <h2></h2>
    <h3>{breeds.map((breed) => {
    return <li key={breed}>{breed}</li>;
  })}</h3>
</div>

ما از تابع map برای تکرار روی نژادها و خروجی نشانه گذاری برای هر کدام استفاده می کنیم. چیزی که در نهایت به آن می رسیم HTML/JSX در داخل جاوا اسکریپت، داخل HTML/JSX، داخل جاوا اسکریپت است!

می‌توانیم با حذف عبارت return مقدار کد را کاهش دهیم، مانند:


<h3>{breeds.map((breed) => <li key={breed}>{breed}</li> )}</h3></code>

به خاطر داشته باشید که می توانید از روش های کاربردی دیگر مانند filter و reduce برای خروجی مجموعه ها به عنوان حلقه استفاده کنید. این به شما قدرتی در هنگام کار با حلقه ها می دهد. همچنین همیشه می توانید به جاوا اسکریپت در خود مؤلفه بروید تا متغیرهای داده را تغییر دهید و سپس در صورت لزوم آن را در اختیار JSX قرار دهید. (حتی می توانید HTML را در جاوا اسکریپت بنویسید و مستقیماً در JSX نمایش دهید.)

شرط

یکی دیگر از قابلیت‌های کلیدی، برخورد با جریان کنترل شرطی مانند if/then/else است. به عنوان مثال، چه می‌شود اگر هنگام بررسی نژادهای سگ خود، بخواهیم شرایطی مانند وجود فیلد breedOrigin را بررسی کنیم؟

بر اساس تنظیماتی که تاکنون داشته‌ایم، می‌توانیم این کار را انجام دهیم (نسخه زنده را ببینید):


<h3>{breeds.map((breed) =>
  <li key={breed.name}>{
    breed.breedInfo ? breed.name + ": " + breed.breedInfo : breed.name}</li> )}</h3>

در اینجا ما از یک عملگر سه تایی استفاده می کنیم ( نحو X ? Y : Z، که می گوید، اگر X، سپس Y، در غیر این صورت، Z). این معمولاً برای تصمیم‌گیری if/then/else در داخل یک عبارت JSX استفاده می‌شود.

یک راه دیگر برای نزدیک شدن به رندر شرطی، استفاده از یک تست موردی است تا فقط در صورت موفقیت آمیز بودن آزمایش، نشانه گذاری را ارائه کنید. به عنوان مثال، اگر بخواهیم فقط در صورتی لیست را رندر کنیم که آرایه دارای عناصر باشد (یک سناریوی رایج هنگام بارگیری داده ها از یک API راه دور)، می توانیم این کار را انجام دهیم (نسخه زنده را ببینید):


<div className='App'>
      <h1>Greetings from InfoWorld</h1>
      <h2></h2>
      { breeds.length > 0 && <>
        <h3>{breeds.map((breed) => <li key={breed.name}>{breed.breedInfo ? breed.name + ": " + breed.breedInfo : breed.name}</li> )}</h3>
        </>
      }
    </div>

اگر متغیر breeds را به‌عنوان یک آرایه خالی تنظیم کنید، JSX چیزی ارائه نمی‌کند.

قطعات

تگ‌های عنصر خالی را مشاهده خواهید کرد: <> و . این قطعات React هستند که توسط JSX پشتیبانی می شوند. ما می توانستیم از

استفاده کنیم اما <> اصطلاحی تر است. همچنین، قطعات به شما این امکان را می‌دهند که بسیاری از عناصر را در JSX بدون ایجاد یک عنصر پوشش غیرمعنای بپیچید.

رویدادها

قابلیت ضروری بعدی JSX که باید در مورد آن بدانید مدیریت رویداد است. برای مثال، می‌خواهیم کاربران بتوانند روی یک نژاد کلیک کنند و صفحه ویکی‌پدیا را برای آن نژاد باز کنند. می‌توانید کاری شبیه به این انجام دهید (نسخه زنده را ببینید):


let [breeds, setBreeds] = React.useState([
    {name:'Shih Tzu',breedInfo:'Pekanese and Lhasa Apso cross',link:'https://en.wikipedia.org/wiki/Shih_Tzu'},
    {name:'Labradoodle', link:'https://en.wikipedia.org/wiki/Labradoodle'},
    {name:'Vizla',breedInfo:'Hungarian breed'},
    {name:'Catahoula'}
  ]);
  const handleBreedClick = (wikiLink) => {
    window.open(wikiLink, '_blank');
  };
  return (
    <div className='App'>
      <h1>Greetings from InfoWorld</h1>
      <h2></h2>
      { breeds.length > 0 && <>
        <h3>
          {breeds.map((breed) =>
            <li key={breed.name} onClick={() => handleBreedClick(breed.link)}>{breed.breedInfo ? breed.name + ": " + breed.breedInfo : breed.name}
            </li>
          )}
        </h3>
        </>
      }
    </div>
  );

در اینجا، یک تابع handleBreedClick برای پاسخگویی به رویداد تعریف می کنیم. فقط ویکی لینک را در یک پنجره جدید باز می کند. برای ارسال رویداد، از کنترل‌کننده JSX onClick استفاده می‌کنیم: onClick={() => handleBreedClick(breed.link)}. متوجه خواهید شد که این دقیقاً مانند یک کنترل‌کننده HTML رویداد معمولی است، با این تفاوت که به جای حروف کوچک (onclick) در حروف کوچک (onClick) است.

شما همچنین می توانید کنترل کننده رویداد درون خطی را تعریف کنید. به عنوان مثال، وقتی روی آن کلیک کنید، یک هشدار باز می شود:

  • { alert(breed.name)}} />.

    به طور کلی، می‌توانید از عبارات JSX در پرانتزهای فرفری برای ارائه مقادیر برای ویژگی‌ها (props) در عناصر HTML استفاده کنید.

    طراحی

    عناصر JSX از سبک های CSS نیز پشتیبانی می کنند. شما می توانید این کار را با مرجع یا درون خطی مانند رویدادها انجام دهید. در اینجا یک نمونه از قبلی آمده است (نسخه زنده را ببینید):

    
    const listItemStyle = {
        cursor: 'pointer',
        margin: '10px 0',
        padding: '5px',
        backgroundColor: '#f5f5f5',
        border: '1px solid #ccc',
        borderRadius: '5px',
      };
    // … same
    <li style={listItemStyle} ... </li>
    

    درست مانند رویدادها، یک متغیر را در جاوا اسکریپت تعریف می کنیم و سپس به آن در ویژگی ارجاع می دهیم. در این مورد، ما از ویژگی style استفاده می کنیم و یک شی جاوا اسکریپت در اختیار آن قرار می دهیم. انتظار می رود که شی مجموعه ای از مقادیر کلیدی باشد که در آن کلید نام ویژگی CSS و مقدار آن رشته مقدار CSS است. ویژگی های CSS به جای نام های چین دار موجود در CSS از camelCase استفاده می کنند. (این برای دور زدن محدودیت‌های نامگذاری جاوا اسکریپت است.) بنابراین، color-background به backgroundColor تبدیل می‌شود.

    برای استفاده از یک استایل درون خطی، از قالب پرانتزی دوتایی استفاده می‌کنید، که عجیب به نظر می‌رسد، اما اساساً می‌گوید، این استایل است و اینجا یک شی جاوا اسکریپت برای برآورده کردن آن (نسخه زنده را ببینید):

    
    <li style={{backgroundColor:'#f5f5f5',padding:'5px'}} …>
    

    بررسی خطا

    یک سوال طبیعی این است که چگونه با خطاها در JSX برخورد کنیم، اما این یک سوال گسترده تر می شود زیرا JSX بخشی از React است. می‌توانید در اینجا درباره مدیریت خطاهای React و JSX بیشتر بیاموزید، از جمله نحوه استفاده از مؤلفه‌های ErrorBoundary برای بسته‌بندی بخش‌های خطا.

    نتیجه گیری

    شما نگاهی به اصول اولیه JSX انداخته اید. این اصول اولیه بیشتر قدرت مورد نیاز برای ساخت رابط های کاربری را در اختیار شما قرار می دهد. زیبایی JSX این است که فقط دو فناوری آشنا – جاوا اسکریپت و HTML – را گسترش داده و آنها را در یک کل طبیعی ترکیب می کند. این سه ابزار با هم هم افزایی زیادی دارند.

    وقتی JSX را فهمیدید، می‌توانید به راحتی آن را به سایر چارچوب‌های Reactive و زبان‌های قالب آن‌ها مانند Vue، Angular و Svelte منتقل کنید. همیشه موارد خاص کمی وجود دارد، و JSX یک پایه مفید برای بازگشت در مقایسه یادگیری و کاوش است.