הכירו את react.dev

16 במרץ 2023 מאת דן אברמוב ורחל נאבורס


היום אנחנו נרגשים להשיק את react.dev, הבית החדש של React והתיעוד שלו. בפוסט זה, ברצוננו לערוך לכם סיור באתר החדש.


tl;dr

  • האתר React החדש (react.dev) מלמד React מודרני עם רכיבי פונקציות וHooks.
  • כללנו דיאגרמות, איורים, אתגרים ויותר מ-600 דוגמאות אינטראקטיביות חדשות.
  • אתר התיעוד הקודם React עבר עכשיו אל legacy.reactjs.org.

אתר חדש, דומיין חדש, דף בית חדש

ראשית, קצת שמירה על house.

כדי לחגוג את השקת המסמכים החדשים, ומשמעותיים, להפריד בבירור בין התוכן הישן והחדש, עברנו לדומיין הקצר יותר react.dev. הדומיין הישן reactjs.org יפנה לכאן כעת.

המסמכים הישנים של React מאוחסנים כעת בארכיון ב-legacy.reactjs.org. כל הקישורים הקיימים לתוכן הישן יופנו באופן אוטומטי כדי למנוע “שבירה באינטרנט”, אך האתר מדור קודם לא יקבל עדכונים רבים נוספים.

תאמינו או לא, React ימלאו בקרוב עשר שנים. בעוד JavaScript שנים, זה כמו מאה שלמה! רעננו את דף הבית של React כדי לשקף למה אנחנו חושבים שReact היא דרך מצוינת ליצור ממשקי user כיום, ועדכנו את מדריכי ההתחלה כדי להזכיר בצורה בולטת יותר מסגרות מודרניות מבוססות React.

אם עדיין לא ראית את דף הבית החדש, בדוק אותו!

הולך All-in על React מודרני עם Hooks

כאשר משחררנו את React Hooks בשנת 2018, המסמכים Hooks הניחו שהקורא מכיר את רכיבי המחלקה. זה עזר לקהילה לאמץ את Hooks במהירות רבה, אך לאחר זמן המסמכים הישנים לא הצליחו לשרת את הקוראים החדשים. קוראים חדשים היו צריכים ללמוד React פעמיים: פעם אחת עם רכיבי כיתה ואז שוב עם Hooks.

המסמכים החדשים מלמדים React עם Hooks מההתחלה. המסמכים מחולקים לשני חלקים עיקריים:

  • Learn React הוא קורס בקצב עצמי המלמד React מאפס.
  • API Reference מספק את הפרטים ודוגמאות השימוש עבור כל React API.

בואו נסתכל מקרוב על מה תוכלו למצוא בכל חלק.

Note

יש עדיין כמה מקרים נדירים של רכיבי מחלקה use שעדיין אין להם מקבילה מבוססת Hook. רכיבי הכיתה נשארים נתמכים ומתועדים בקטע Legacy API של האתר החדש.

התחלה מהירה

הקטע למד מתחיל בדף התחלה מהירה. זהו סיור היכרות קצר של React. הוא מציג את התחביר של מושגים כמו רכיבים, props, ו-state, אבל לא מפרט איך use אותם.

אם אתה אוהב ללמוד על ידי עשייה, אנו ממליצים לבדוק את ה-Tic-Tac-Toe Tutorial הבא. זה ילמד אותך בבניית משחק קטן עם React, תוך כדי ללמד את המיומנויות use בכל יום. הנה מה שתבנה:

import { useState } from 'react';

function Square({ value, onSquareClick }) {
  return (
    <button className="square" onClick={onSquareClick}>
      {value}
    </button>
  );
}

function Board({ xIsNext, squares, onPlay }) {
  function handleClick(i) {
    if (calculateWinner(squares) || squares[i]) {
      return;
    }
    const nextSquares = squares.slice();
    if (xIsNext) {
      nextSquares[i] = 'X';
    } else {
      nextSquares[i] = 'O';
    }
    onPlay(nextSquares);
  }

  const winner = calculateWinner(squares);
  let status;
  if (winner) {
    status = 'Winner: ' + winner;
  } else {
    status = 'Next player: ' + (xIsNext ? 'X' : 'O');
  }

  return (
    <>
      <div className="status">{status}</div>
      <div className="board-row">
        <Square value={squares[0]} onSquareClick={() => handleClick(0)} />
        <Square value={squares[1]} onSquareClick={() => handleClick(1)} />
        <Square value={squares[2]} onSquareClick={() => handleClick(2)} />
      </div>
      <div className="board-row">
        <Square value={squares[3]} onSquareClick={() => handleClick(3)} />
        <Square value={squares[4]} onSquareClick={() => handleClick(4)} />
        <Square value={squares[5]} onSquareClick={() => handleClick(5)} />
      </div>
      <div className="board-row">
        <Square value={squares[6]} onSquareClick={() => handleClick(6)} />
        <Square value={squares[7]} onSquareClick={() => handleClick(7)} />
        <Square value={squares[8]} onSquareClick={() => handleClick(8)} />
      </div>
    </>
  );
}

export default function Game() {
  const [history, setHistory] = useState([Array(9).fill(null)]);
  const [currentMove, setCurrentMove] = useState(0);
  const xIsNext = currentMove % 2 === 0;
  const currentSquares = history[currentMove];

  function handlePlay(nextSquares) {
    const nextHistory = [...history.slice(0, currentMove + 1), nextSquares];
    setHistory(nextHistory);
    setCurrentMove(nextHistory.length - 1);
  }

  function jumpTo(nextMove) {
    setCurrentMove(nextMove);
  }

  const moves = history.map((squares, move) => {
    let description;
    if (move > 0) {
      description = 'Go to move #' + move;
    } else {
      description = 'Go to game start';
    }
    return (
      <li key={move}>
        <button onClick={() => jumpTo(move)}>{description}</button>
      </li>
    );
  });

  return (
    <div className="game">
      <div className="game-board">
        <Board xIsNext={xIsNext} squares={currentSquares} onPlay={handlePlay} />
      </div>
      <div className="game-info">
        <ol>{moves}</ol>
      </div>
    </div>
  );
}

function calculateWinner(squares) {
  const lines = [
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8],
    [0, 3, 6],
    [1, 4, 7],
    [2, 5, 8],
    [0, 4, 8],
    [2, 4, 6],
  ];
  for (let i = 0; i < lines.length; i++) {
    const [a, b, c] = lines[i];
    if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {
      return squares[a];
    }
  }
  return null;
}

ברצוננו גם להדגיש את Thinking in React - זה המדריך שגרם ל-React ל”קליק” עבור רבים מאיתנו. עדכנו את שני המדריכים הקלאסיים הללו לרכיבי פונקציות use וHooks, כך שהם טובים כמו חדשים.

Note

הדוגמה היא למעלה ארגז חול. הוספנו הרבה ארגזי חול - מעל 600! - בכל מקום באתר. אתה יכול לערוך כל ארגז חול, או ללחוץ על “מזלג” בפינה הימנית העליונה כדי לפתוח אותו בלשונית נפרדת. ארגזי חולים יכול לשחק מהר עם React APIs, לחקור את הרעיונות שלך ולבדוק את ההבנה שלך.

למד React שלב אחר שלב

אנו רוצים שלכולם בעולם יש הזדמנות שווה ללמוד React בחינם בעצמם.

זה מה שהקטע למד מאורגן כמו קורס בקצב עצמי המפוצל לפרקים. שני הפרקים הראשונים מתארים את היסודות של React. אם אתה חדש ב-React, או רוצה לרענן אותו ב-memory שלך, התחל כאן:

שני הפרקים הבאים מתקדמים יותר, ויתנו לך תובנה עמוקה יותר לגבי החלקים המסובכים יותר:

  • Managing State מלמד איך לארגן את ההיגיון שלך ככל שהאפליקציה שלך גדלה במורכבות.
  • Escape Hatches מלמד איך אתה יכול “לצאת החוצה” React, ומתי הכי הגיוני לעשות זאת.

כל פרק מורכב מכמה דפים קשורים. רוב הדפים הללו מלמדים מיומנות או טכניקה ספציפית - לדוגמה, כותבת סימון עם JSX, עדכון אובייקטים במצב או Sharing State Between רכיבים. חלק מהדפים ממעשיים בהסבר רעיון - כמו Render and Commit, או State as a Snapshot. ויש כמה, כמו אולי אתה לא צריך אפקט, שחולקים את ההצעות שלנו על סמך מה שלמדנו במהלך השנים הללו.

אתה לא צריך לקרוא את הפרקים האלה כרצף. למי יש זמן לזה?! אבל אתה יכול. דפים במקטע למד מסתמכים רק על מושגים שהוצגו בדפים הקודמים. אם אתה רוצה לקרוא אותו כמו ספר, לך על זה!

בדוק את ההבנה שלך עם אתגרים

רוב הדפים בקטע למידה מסתיימים בכמה אתגרים כדי לבדוק את ההבנה שלך. לדוגמה, הנה כמה אתרים מהעמוד על עיבוד מותנה.

אתה לא צריך לפתור אותם עכשיו! אלא אם כן אתה באמת רוצה.

Challenge 1 of 2:
הצג סמל עבור פריטים לא שלמים עם ? :

השתמש באופרטור המותנה (cond ? a : b) כדי להציג ❌ אם isPacked אינו true.

function Item({ name, isPacked }) {
  return (
    <li className="item">
      {name} {isPacked && '✔'}
    </li>
  );
}

export default function PackingList() {
  return (
    <section>
      <h1>Sally Ride's Packing List</h1>
      <ul>
        <Item 
          isPacked={true} 
          name="Space suit" 
        />
        <Item 
          isPacked={true} 
          name="Helmet with a golden leaf" 
        />
        <Item 
          isPacked={false} 
          name="Photo of Tam" 
        />
      </ul>
    </section>
  );
}

שימו לב ללחצן “הצג פתרון” בפינה השמאלית התחתונה. זה שימושי אם אתה רוצה לבדוק את עצמך!

בנה אינטואיציה עם דיאגרמות ואיורים

כשלא הצלחנו להסביר משהו עם קוד ומילים בלבד, הוס דיאגרמות שעוזרות לספק קצת אינטואיציה. לדוגמה, הנה אחד מהדיאגרמות מ-שימור ואיפוס מצב:

Diagram with three sections, with an arrow transitioning each section in between. The first section contains a React component labeled 'div' with a single child labeled 'section', which has a single child labeled 'Counter' containing a state bubble labeled 'count' with value 3. The middle section has the same 'div' parent, but the child components have now been deleted, indicated by a yellow 'proof' image. The third section has the same 'div' parent again, now with a new child labeled 'div', highlighted in yellow, also with a new child labeled 'Counter' containing a state bubble labeled 'count' with value 0, all highlighted in yellow.
Diagram with three sections, with an arrow transitioning each section in between. The first section contains a React component labeled 'div' with a single child labeled 'section', which has a single child labeled 'Counter' containing a state bubble labeled 'count' with value 3. The middle section has the same 'div' parent, but the child components have now been deleted, indicated by a yellow 'proof' image. The third section has the same 'div' parent again, now with a new child labeled 'div', highlighted in yellow, also with a new child labeled 'Counter' containing a state bubble labeled 'count' with value 0, all highlighted in yellow.

כאשר section משתנה ל-div, ה-section נמחק וה-div החדש מתווסף

תראה גם כמה איורים לאורך המסמכים—הנה אחד מה-דפדפן מצייר את המסך:

A browser painting 'still life with card element'.

Illustrated by Rachel Lee Nabors

אישרנו עם ספקי הדפדפן שהתיאור הזה הוא 100% מדויק מבחינה מדעית.

API הפניה חדשה ומפורטת

ב-API Reference, לכל React API יש עכשיו עמוד ייעודי. זה כולל כל מיני APIs:

  • Hooks מובנה כמו useState.
  • רכיבים מובנים כמו useState.
  • רכיבי דפדפן מובנים כמו useState.
  • APIs מוכווני מסגרת כמו useState.
  • React APIs אחרים כמו useState.

תבחין שכל עמוד API מחולק לשני פלחים לפחות: הפניה ו-שימוש.

Reference מתאר את החתימה הרשמית API על ידי רישום הארגומנטים וערכי ההחזר. זה תמציתי, אבל זה יכול להרגיש קצת מופשט אם אתה לא מכיר את ה-API הזה. זה מתאר מה API עושה, אבל לא איך use אותו.

שימוש מראה מדוע וכיצד הייתם use זה API בפועל, כמו שעמית או חבר להסביר להסביר. זה מראה את התרחישים הקנוניים של האופן שבו כל API נועד להיות used על ידי צוות React. הוספנו קטעי קוד צבעוניים, דוגמאות לשימוש ב-API שונים ביחד ומתכונים שאפשרו להעתיק ולהדביק מהם:

Basic useState examples

Example 1 of 4:
מונה (מספר)

בדוגמה זו, המשתנה count state מכיל מספר. לחיצה על הכפתור מגדילה אותו.

import { useState } from 'react';

export default function Counter() {
  const [count, setCount] = useState(0);

  function handleClick() {
    setCount(count + 1);
  }

  return (
    <button onClick={handleClick}>
      You pressed me {count} times
    </button>
  );
}

חלק מהדפים API כוללים גם פתרון בעיות (לבעיות נפוצות) וAlternatives (עבור APIs שהוצאו משימוש).

אנו מקווים שגישה זו תהפוך את ההתייחסות API לuse לממלאת לא רק כדרך לחפש טיעון, אלא כדרך לראות את כל הדברים שאתה יכול לעשות עם כל API נתון - וכיצד הוא מתחבר לחבור.

מה הלאה?

זה כיסוי לסיור הקטן שלנו! עיין באתר החדש, ראה מה אתה אוהב או לא אוהב, והמשיכו לקבל את המשוב בסקר האנונימי או במעקב אחר בעיות.) שלנו

אנו מודים שהפרויקט הזה לקח הרבה זמן לשלוח אותו. רצינו לשמור על בר איכותי שמגיע לקהילת React. על כתיבת המסמכים הללו ויצירת כל הדוגמאות, מצאנו טעויות בכמה מההסברים שלנו, באגים ב-React, ואף פערים בעיצוב React אנו פועלים כעת בהם. אנו מקווים שהתיעוד החדש יעזור לנו לעשות את React ברף גבוה יותר.

שמענו רבות מהבקשות שלך להרחיב את התוכן והפונקציונליות של האתר, למשל:

  • מתן גרסת TypeScript לכל הדוגמאות;
  • יצירת מדריכי הביצועים, הבדיקות והנגישות המעודכנים;
  • תיעוד React רכיבי שרת ללא תלות במסגרות התומכות בהם;
  • עבודה עם הקהילה הבינלאומית שלנו כדי לתרגם את המסמכים החדשים;
  • הוספת תכונות חסרות לאתר החדש (לדוגמה, RSS עבור בלוג זה).

כעת, כאשר react.dev יצא, נוכל להעביר את המיקוד שלנו מ”להדביק” את המשאבים החינוכיים React של צד שלישי להוספת מידע חדש ושיפור נוסף של האתר החדש שלנו.

אנחנו חושבים שמעולם לא היה זמן טוב יותר ללמוד React.

מי עבד על זה?

בצוות React, רחל נבורס הובילה את הפרויקט (וסיפקה את האיורים) ודן אברמוב עיצבו את התכנית הלימודים. הם גם כתבו יחד את רוב התוכן.

כמובן, שום פרויקט כזה גדול לא קורה בנפרד. יש לנו הרבה אנשים להודות!

סילביה ורגאס שיפרה את הדוגמאות שלנו כדי לחרוג מ”foo/bar/baz” וחתלתולים, ולהציג מדענים, אמנים וערים מרחבי העולם. מגי אפלטון הפכה את השרבוטים שלנו למערכת דיאגרמות ברורה.

תודה לדיוויד מקייב, סופי אלפרט, ריק הנלון, אנדרו קלארק, ומאט קרול על כתיבה נוספת של תרומות. ברצוננו גם להודות ל[נטליה טפלוהינאבסטי]ו-[מרק עלבסתי]](אן-[ק-רעיונות) והמשוב שלנו.

תודה לדן לבוביץ על עיצוב האתר ו-רזבן גרדינר על עיצוב ארגז החול.

בחזית הפיתוח, תודה לג’ארד פאלמר על פיתוח אב טיפוס. תודה לדיין גרנט ודסטין גודמן מ-ThisDotLabs על תמיכתם בפיתוח ממשק משתמש. תודה ל[Ives van Hoorne](___K](___T](___T)(___T)(___T) ווזניקה](https://twitter.com/danilowoz) מ-CodeSandbox על עבודתם עם אינטגרציה של ארגז חול. תודה לריק הנלון על עבודת פיתוח נקודתית ועיצוב, עידוד הצבעים שלנו ופרטים חדשים עדינים יותר. תודה ל-Harish Kumar0_ בתות והוספת.

תודה ענקית לאנשים שהתנדבו מזמנם להשתתף בתוכנית בדיקות אלפא ובטא. ההתלהבות והמשוב שלא יסולא בפס יעזרו לנו לעצב את המסמכים האלה. צעקה מיוחדת לבוחן הביטא שלנו, דבי אובריאן, שנשאה הרצאה על החוויה שלה בשימוש במסמכים React ב-React Conf 2021.

לבסוף, תודה לקהילת React על היותה ההשראה מאחורי המאמץ הזה. אתה חושב שאנחנו עושים זאת, ואנו מקווים שהמסמכים החדשים יעזרו לך use React לבנות כל ממשק user שתרצו.