use என்பது Promise அல்லது context போன்ற resource-ன் value-ஐ read செய்ய உதவும் React API ஆகும்.
const value = use(resource);குறிப்பு
use(resource)
உங்கள் component-இல் use-ஐ call செய்து, Promise அல்லது context போன்ற resource-ன் value-ஐ read செய்யுங்கள்.
import { use } from 'react';
function MessageComponent({ messagePromise }) {
const message = use(messagePromise);
const theme = use(ThemeContext);
// ...React Hooks-களுக்கு மாறாக, use-ஐ loops-க்குள் மற்றும் if போன்ற conditional statements-க்குள் call செய்யலாம். React Hooks போலவே, use-ஐ call செய்யும் function ஒரு Component அல்லது Hook ஆக இருக்க வேண்டும்.
Promise உடன் call செய்யப்படும் போது, use API Suspense மற்றும் Error Boundaries உடன் integrate ஆகிறது. use-க்கு pass செய்யப்பட்ட Promise pending-ஆக இருக்கும் வரை, use-ஐ call செய்யும் component suspend ஆகும். use-ஐ call செய்யும் component Suspense boundary-க்குள் wrap செய்யப்பட்டிருந்தால், fallback காண்பிக்கப்படும். Promise resolve ஆனதும், Suspense fallback-க்கு பதிலாக use API return செய்த data-வைப் பயன்படுத்தி rendered components காண்பிக்கப்படும். use-க்கு pass செய்யப்பட்ட Promise reject ஆனால், அருகிலுள்ள Error Boundary-ன் fallback காண்பிக்கப்படும்.
மேலும் உதாரணங்களை கீழே பார்க்கவும்.
அளவுருக்கள்
resource: நீங்கள் value-ஐ read செய்ய விரும்பும் data source இதுவாகும். Resource ஒரு Promise அல்லது context ஆக இருக்கலாம்.
திரும்பும் மதிப்பு
use API, Promise-ன் resolved value அல்லது context போன்ற resource-இலிருந்து read செய்யப்பட்ட value-ஐ return செய்கிறது.
கவனிக்க வேண்டியவை
useAPI ஒரு Component அல்லது Hook-க்குள் call செய்யப்பட வேண்டும்.- Server Component-இல் data fetch செய்யும்போது,
use-ஐ விடasyncமற்றும்await-ஐ விரும்புங்கள்.asyncமற்றும்await,awaitinvoke செய்யப்பட்ட இடத்திலிருந்து rendering-ஐ தொடர்கின்றன; ஆனால்use, data resolve ஆன பிறகு component-ஐ மீண்டும் render செய்கிறது. - Client Components-இல் Promises உருவாக்குவதற்கு பதிலாக, Server Components-இல் Promises உருவாக்கி அவற்றை Client Components-க்கு pass செய்வதை விரும்புங்கள். Client Components-இல் உருவாக்கப்படும் Promises ஒவ்வொரு render-லும் மீண்டும் உருவாக்கப்படும். Server Component-இலிருந்து Client Component-க்கு pass செய்யப்படும் Promises re-renders முழுவதும் stable ஆக இருக்கும். இந்த உதாரணத்தைப் பார்க்கவும்.
பயன்பாடு
use மூலம் context read செய்தல்
context use-க்கு pass செய்யப்படும் போது, அது useContext போலவே செயல்படும். useContext உங்கள் component-ன் top level-இல் call செய்யப்பட வேண்டியிருந்தாலும், use-ஐ if போன்ற conditionals-க்குள் மற்றும் for போன்ற loops-க்குள் call செய்யலாம். இது அதிக flexible என்பதால் useContext-ஐ விட use விரும்பப்படுகிறது.
import { use } from 'react';
function Button() {
const theme = use(ThemeContext);
// ...நீங்கள் pass செய்த context-க்கான context value-ஐ use return செய்கிறது. Context value-ஐ தீர்மானிக்க, React component tree-ஐ search செய்து, அந்த குறிப்பிட்ட context-க்கான மேலே உள்ள மிக அருகிலுள்ள context provider-ஐ கண்டுபிடிக்கிறது.
ஒரு Button-க்கு context pass செய்ய, அதை அல்லது அதன் parent components-இல் ஒன்றை பொருத்தமான context provider-க்குள் wrap செய்யுங்கள்.
function MyPage() {
return (
<ThemeContext value="dark">
<Form />
</ThemeContext>
);
}
function Form() {
// ... renders buttons inside ...
}Provider மற்றும் Button இடையில் எத்தனை component layers இருந்தாலும் அது முக்கியமில்லை. Form-க்குள் எங்கிருந்தாலும் ஒரு Button use(ThemeContext) call செய்தால், அது value ஆக "dark"-ஐ பெறும்.
useContext-க்கு மாறாக, use-ஐ if போன்ற conditionals மற்றும் loops-இல் call செய்யலாம்.
function HorizontalRule({ show }) {
if (show) {
const theme = use(ThemeContext);
return <hr className={theme} />;
}
return false;
}use ஒரு if statement-க்குள் இருந்து call செய்யப்படுகிறது; இதனால் Context-இலிருந்து values-ஐ conditionally read செய்ய முடியும்.
import { createContext, use } from 'react'; const ThemeContext = createContext(null); export default function MyApp() { return ( <ThemeContext value="dark"> <Form /> </ThemeContext> ) } function Form() { return ( <Panel title="Welcome"> <Button show={true}>Sign up</Button> <Button show={false}>Log in</Button> </Panel> ); } function Panel({ title, children }) { const theme = use(ThemeContext); const className = 'panel-' + theme; return ( <section className={className}> <h1>{title}</h1> {children} </section> ) } function Button({ show, children }) { if (show) { const theme = use(ThemeContext); const className = 'button-' + theme; return ( <button className={className}> {children} </button> ); } return false }
Server-இலிருந்து client-க்கு data stream செய்தல்
Server Component-இலிருந்து Client Component-க்கு Promise-ஐ prop ஆக pass செய்வதன் மூலம், server-இலிருந்து client-க்கு data stream செய்யலாம்.
import { fetchMessage } from './lib.js';
import { Message } from './message.js';
export default function App() {
const messagePromise = fetchMessage();
return (
<Suspense fallback={<p>waiting for message...</p>}>
<Message messagePromise={messagePromise} />
</Suspense>
);
}பிறகு Client Component, prop ஆக பெற்ற Promise-ஐ எடுத்து use API-க்கு pass செய்கிறது. இதனால் Server Component ஆரம்பத்தில் உருவாக்கிய Promise-இலிருந்து value-ஐ Client Component read செய்ய முடியும்.
// message.js
'use client';
import { use } from 'react';
export function Message({ messagePromise }) {
const messageContent = use(messagePromise);
return <p>Here is the message: {messageContent}</p>;
}Message Suspense-இல் wrap செய்யப்பட்டிருப்பதால், Promise resolve ஆகும் வரை fallback காண்பிக்கப்படும். Promise resolve ஆனதும், value use API மூலம் read செய்யப்படும்; பிறகு Message component Suspense fallback-ஐ replace செய்யும்.
"use client"; import { use, Suspense } from "react"; function Message({ messagePromise }) { const messageContent = use(messagePromise); return <p>Here is the message: {messageContent}</p>; } export function MessageContainer({ messagePromise }) { return ( <Suspense fallback={<p>⌛Downloading message...</p>}> <Message messagePromise={messagePromise} /> </Suspense> ); }
Deep Dive
Promise-ஐ Server Component-இலிருந்து Client Component-க்கு pass செய்து, Client Component-இல் use API மூலம் resolve செய்யலாம். அதே Promise-ஐ Server Component-இல் await மூலம் resolve செய்து, தேவையான data-வை Client Component-க்கு prop ஆக pass செய்யவும் முடியும்.
export default async function App() {
const messageContent = await fetchMessage();
return <Message messageContent={messageContent} />
}ஆனால் Server Component-இல் await பயன்படுத்துவது, await statement முடியும் வரை அதன் rendering-ஐ block செய்யும். Server Component-இலிருந்து Client Component-க்கு Promise pass செய்வது, அந்த Promise Server Component-ன் rendering-ஐ block செய்வதைத் தடுக்கிறது.
Rejected Promises-ஐ கையாளுதல்
சில நேரங்களில் use-க்கு pass செய்யப்பட்ட Promise reject ஆகலாம். Rejected Promises-ஐ நீங்கள் இரண்டு வழிகளில் கையாளலாம்:
Error Boundary மூலம் பயனர்களுக்கு error காண்பித்தல்
Promise reject ஆகும் போது உங்கள் பயனர்களுக்கு error காண்பிக்க விரும்பினால், Error Boundary பயன்படுத்தலாம். Error Boundary பயன்படுத்த, use API-ஐ call செய்யும் component-ஐ Error Boundary-இல் wrap செய்யுங்கள். use-க்கு pass செய்யப்பட்ட Promise reject ஆனால், Error Boundary-க்கான fallback காண்பிக்கப்படும்.
"use client"; import { use, Suspense } from "react"; import { ErrorBoundary } from "react-error-boundary"; export function MessageContainer({ messagePromise }) { return ( <ErrorBoundary fallback={<p>⚠️Something went wrong</p>}> <Suspense fallback={<p>⌛Downloading message...</p>}> <Message messagePromise={messagePromise} /> </Suspense> </ErrorBoundary> ); } function Message({ messagePromise }) { const content = use(messagePromise); return <p>Here is the message: {content}</p>; }
Promise.catch மூலம் மாற்று value வழங்குதல்
use-க்கு pass செய்யப்பட்ட Promise reject ஆகும் போது மாற்று value வழங்க விரும்பினால், Promise-ன் catch method-ஐ பயன்படுத்தலாம்.
import { Message } from './message.js';
export default function App() {
const messagePromise = new Promise((resolve, reject) => {
reject();
}).catch(() => {
return "no new message found.";
});
return (
<Suspense fallback={<p>waiting for message...</p>}>
<Message messagePromise={messagePromise} />
</Suspense>
);
}Promise-ன் catch method-ஐ பயன்படுத்த, Promise object-இல் catch-ஐ call செய்யுங்கள். catch ஒரு argument மட்டும் எடுக்கும்: error message-ஐ argument ஆகப் பெறும் function. catch-க்கு pass செய்யப்பட்ட function எதை return செய்கிறதோ, அது Promise-ன் resolved value ஆகப் பயன்படுத்தப்படும்.
பிரச்சினைத் தீர்வு
“Suspense Exception: This is not a real error!”
நீங்கள் use-ஐ React Component அல்லது Hook function-க்கு வெளியே call செய்கிறீர்கள், அல்லது try-catch block-இல் call செய்கிறீர்கள். Try-catch block-க்குள் use call செய்கிறீர்கள் என்றால், உங்கள் component-ஐ Error Boundary-இல் wrap செய்யுங்கள்; அல்லது Promise-ன் catch-ஐ call செய்து error-ஐ catch செய்து, Promise-ஐ வேறு value உடன் resolve செய்யுங்கள். இந்த உதாரணங்களைப் பார்க்கவும்.
use-ஐ React Component அல்லது Hook function-க்கு வெளியே call செய்கிறீர்கள் என்றால், use call-ஐ React Component அல்லது Hook function-க்கு நகர்த்துங்கள்.
function MessageComponent({messagePromise}) {
function download() {
// ❌ the function calling `use` is not a Component or Hook
const message = use(messagePromise);
// ...அதற்கு பதிலாக, component closures எதற்கும் வெளியே use-ஐ call செய்யுங்கள்; அங்கு use-ஐ call செய்யும் function ஒரு Component அல்லது Hook ஆக இருக்கும்.
function MessageComponent({messagePromise}) {
// ✅ `use` is being called from a component.
const message = use(messagePromise);
// ...