Dark mode
act
ฟังก์ชันสำหรับ unit testing เพื่อจำลองการอัปเดต UI และรอให้ React อัปเดต DOM เสร็จสิ้น ใช้กับ React Testing Library เพื่อทดสอบคอมโพเนนต์ให้เหมือนการทำงานจริง
jsx
import { act } from 'react-dom/test-utils';
import { render, screen } from '@testing-library/react';
test('renders component', () => {
act(() => {
render(<MyComponent />);
});
expect(screen.getByText('Hello')).toBeInTheDocument();
});
cache
(React 18 experimental) ใช้แคชข้อมูลใน Server Components เพื่อลดการเรียกข้อมูลซ้ำ ป้องกันการ fetch ข้อมูลที่ไม่จำเป็นในระหว่างการ render
jsx
import { cache } from 'react';
const getData = cache(async (id) => {
const res = await fetch(`https://api.example.com/data/${id}`);
return res.json();
});
export async function MyComponent({ id }) {
const data = await getData(id);
return <div>{data.name}</div>;
}
captureOwnerStack
(API ภายใน, ไม่ใช่ public API) เก็บ stack trace ของคอมโพเนนต์ที่เป็นเจ้าของเพื่อ debug ข้อผิดพลาด ไม่แนะนำให้ใช้ในแอปทั่วไป
createContext
สร้าง Context object เพื่อแชร์ข้อมูลระหว่างคอมโพเนนต์โดยไม่ต้องส่ง props ผ่านทุกชั้น ใช้กับ Provider และ Consumer หรือ Hook useContext
jsx
import React, { createContext, useContext } from 'react';
const ThemeContext = createContext('light');
function App() {
return (
<ThemeContext.Provider value="dark">
<MyComponent />
</ThemeContext.Provider>
);
}
function MyComponent() {
const theme = useContext(ThemeContext);
return <div>Theme: {theme}</div>;
}
lazy
ใช้สำหรับ lazy loading คอมโพเนนต์เพื่อโหลดโค้ดเฉพาะเมื่อจำเป็น ช่วยลดเวลาโหลดเริ่มต้น ใช้คู่กับ Suspense
jsx
import React, { lazy, Suspense } from 'react';
const LazyComponent = lazy(() => import('./LazyComponent'));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<LazyComponent />
</Suspense>
);
}
memo
ป้องกันการ re-render คอมโพเนนต์ถ้า props ไม่เปลี่ยนแปลง ใช้เพื่อเพิ่มประสิทธิภาพในคอมโพเนนต์ที่ render บ่อย
jsx
import React, { memo } from 'react';
const MyComponent = memo(({ name }) => {
console.log('Rendered');
return <div>Hello, {name}</div>;
});
startTransition
(React 18) กำหนดการอัปเดตที่ไม่เร่งด่วนเพื่อให้ UI ตอบสนองได้ดีในระหว่างการอัปเดตหนัก เช่น การกรองข้อมูลขนาดใหญ่
jsx
import React, { useState, useTransition } from 'react';
function App() {
const [query, setQuery] = useState('');
const [isPending, startTransition] = useTransition();
const handleChange = (e) => {
startTransition(() => {
setQuery(e.target.value);
});
};
return (
<div>
<input onChange={handleChange} />
{isPending ? 'Loading...' : <Results query={query} />}
</div>
);
}
use
(React 19 experimental) Hook สำหรับจัดการทรัพยากร เช่น Promises หรือ Context ใน Server Components ช่วยให้โค้ดสะอาดขึ้นเมื่อทำงานกับ asynchronous data
jsx
import { use } from 'react';
async function fetchData(id) {
const res = await fetch(`https://api.example.com/data/${id}`);
return res.json();
}
function MyComponent({ id }) {
const data = use(fetchData(id));
return <div>{data.name}</div>;
}