ESC را فشار دهید تا بسته شود

تغییر کدها در React 19

چند وقتی هست که react 19 توی نسخه بتای خودش هست و صبحت از بهینه شدن کدها و ویژگی هایی هست که قراره بهش اضافه بشه.

اگر مایلین که با نسخه بتا کار کنین کافیه از دستور زیر برای نصب react 19 استفاده کنین:

npm install react@beta react-dom@beta

اگر هم میخواین تمام تغییراتی که توی نسخه ۱۹ قراره ایجاد بشه رو کاملتر بخونین کافیه از داکیومنت اصلی React استفاده کنین. کافیه اینجا کلیک کنین.

اما همونطوری هم که شنیدین قراره خیلی از هوک های پرکاربرد تغییر کنن (مثل useEffect, useMemo, useCallback, useContext) و خب از اون دسته هوک هایی هستن که تو پروژه هامون خیلی استفاده شدن و خب اگر بخوایم به نسخه ۱۹ سوییچ کنیم خیلی تغییرات باید بدیم.

اما این تغییرات قراره به چه شکل باشه؟ بررسی میکنیم

استفاده از useMemo در نسخه ۱۸ ❌

const [number, setNumber] = useState(0);

const square = useMemo(() => {
  return number * number;
}, [number]);

return (
  <div>
    <p>Number: {number}</p>
    <p>Square: {square}</p>
    <button onClick={() => setNumber(number + 1)}>Increment</button>
  </div>
);

توی نسخه ۱۸ برای اینکه یک مقداری رو بتونیم برگردونیم و این مقداری که داره محاسبه میشه هر بار محاسبه نشه از useMemo استفاده می کردیم که اصطلاحا یکی از روش های Memoization توی ری اکت بود.

حالا با بدون useMemo در نسخه ۱۹ چطور باید بنویسی؟

بدون useMemo در نسخه ۱۹ ✅

const [number, setNumber] = useState(0);

const square = number * number;

return (
  <div>
    <p>Number: {number}</p>
    <p>Square: {square}</p>
    <button onClick={() => setNumber(number + 1)}>Increment</button>
  </div>
);

فقط کافیه useMemo و وابستگی هایی که بهش پاس می دادیم رو پاک کنیم و خود React برامون هندل میکنه

استفاده از useCallback در نسخه ۱۸ ❌

const [count, setCount] = useState(0);

const increment = useCallback(() => {
  setCount(count + 1);
}, [count]);

return (
  <div>
    <p>Count: {count}</p>
    <button onClick={increment}>Increment</button>
  </div>
);

دقیقا مثل useMemo یکی از روش های Memoization در react بود که بدون اون باید کاملا مشابه useMemo باهاش رفتار کنیم (البته تفاوتش با useMemo توی اینکه که ما توی useCallback یک عملیات رو هر بار برمی گردونیم و نه یک مقدار ثابت رو)

بدون useCallback در نسخه ۱۹ ✅

const [count, setCount] = useState(0);

const increment = ()=> setCount(count + 1);

return (
  <div>
    <p>Count: {count}</p>
    <button onClick={increment}>Increment</button>
  </div>
);

باز هم کار خاصی لازم نیست و فقط کافیه useCallback و وابستگی هاش رو حذف کنیم.

استفاده از forwardRef در نسخه ۱۸ ❌

const ChildComponent = forwardRef((props, ref) => {
  return <div ref={ref}>Hello from Child Component!</div>;
});

const ParentComponent = () => {
  const childRef = React.useRef(null);

  const focusChild = () => {
    childRef.current.focus();
  };

  return (
    <div>
      <ChildComponent ref={childRef} />
      <button onClick={focusChild}>Focus Child</button>
    </div>
  );
};

از هوک forwardRef وقتی استفاده می کردیم که میخواستیم ref رو بعنوان props استفاده کنیم (نمیدونم چقدر درست میگم یا باهام موافقین اما کثیف کاری بود) و حالا توی نسخه ۱۹ باز هم قراره تغییر کنه.

بدون forwardRef در نسخه ۱۹ ✅

const ChildComponent = ({props, ref}) => {
  return <div ref={ref} {...props}>Hello from Child Component!</div>;
};

const ParentComponent = () => {
  const childRef = React.useRef(null);

  const focusChild = () => {
    childRef.current.focus();
  };

  return (
    <div>
      <ChildComponent ref={childRef} />
      <button onClick={focusChild}>Focus Child</button>
    </div>
  );
};

توی نسخه ۱۹ این کار خیلی ساده‌تر شده و فقط کافیه forwardRef حذف بشه و ref رو مثل باقی props ها به کامپوننت اضافه کنیم

استفاده از useEffect در نسخه ۱۸ ❌

function Book(){
    const [book, setBook] = useState(null)

    async function fetchBook(){
        const res = await fetch('https://book.example/apli/list/1')
        return res.json()
    }

    useEffect(()=>{
        fetchBook().then(data=>setBook(data))
    },[])

    if(!book){
        return <p>Loading ...</p>
    }

    return <p>{book.name}</p>
}

استفاده از use به‌جای useEffect در نسخه ۱۹ ✅

function Book(){

    async function fetchBook(){
        const res = await fetch('https://book.example/apli/list/1')
        return res.json()
    }

    const book = use(fetchBook());
    
    return <p>{book.name}</p>
}

به‌جای استفاده از useEffect کافیه از use استفاده کنیم بدون هیچ وابستگی و همینطور حذف کردن useState برای ذخیره داده.

البته می‌تونین برای loading داده ها از <Suspense> استفاده کنین که توی نسخه‌های قبلی react هم بوده و استفاده می‌شده.

استفاده از useContext در نسخه ۱۸ ❌

const ThemeContext = createContext('light');

const useTheme = () => useContext(ThemeContext);

const ThemeProvider = ({ children }) => {
  const [theme, setTheme] = useState('light');

  const toggleTheme = () => setTheme((prevTheme) => (prevTheme === 'light'? 'dark' : 'light'));

  return (
    <ThemeContext.Provider value={{ theme, toggleTheme }}>
      {children}
    </ThemeContext.Provider>
  );
};

توی استفاده از useContext ما تغییرات ساختاری خاصی نداریم و کد ها به همون صورت سابق باقی می‌مونن و فقط useContext به use تبدیل می‌شه و باقی کدها ثابت و بدون تغییر می‌مونن

استفاده از use به‌جای useContext در نسخه ۱۹ ✅

const ThemeContext = createContext('light');

const useTheme = () => use(ThemeContext);

const ThemeProvider = ({ children }) => {
  const [theme, setTheme] = useState('light');

  const toggleTheme = () => setTheme((prevTheme) => (prevTheme === 'light'? 'dark' : 'light'));

  return (
    <ThemeContext.Provider value={{ theme, toggleTheme }}>
      {children}
    </ThemeContext.Provider>
  );
};

توی نسخه ۱۹ ما تغییرات خاصی رو برای useContext نخواهیم داشت و فقط اسم هوک رو باید تغییر بدین

امیدوارم کافی و مفید بوده باشه.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *