use() 훅은 현재 experimental 버전에서만 지원합니다.
interface ThenableImpl<T> {
then(onFulfill: (value: T) => unknown, onReject: (error: unknown) => unknown): void | PromiseLike<unknown>;
}
interface UntrackedThenable<T> extends ThenableImpl<T> {
status?: void;
}
export interface PendingThenable<T> extends ThenableImpl<T> {
status: 'pending';
}
export interface FulfilledThenable<T> extends ThenableImpl<T> {
status: 'fulfilled';
value: T;
}
export interface RejectedThenable<T> extends ThenableImpl<T> {
status: 'rejected';
reason: unknown;
}
export type Thenable<T> = UntrackedThenable<T> | PendingThenable<T> | FulfilledThenable<T> | RejectedThenable<T>;
/* Context<T>는 React.Context<T> */
export type Usable<T> = Thenable<T> | Context<T>;
export function use<T>(usable: Usable<T>): T;
import React from 'react';
/*
* before
*/
function Component({ url }) {
const [data, setData] = React.useState();
React.useEffect(() => {
fetch(url)
.then(res => res.json)
.then(setData)
}, [])
return <div>{data}</div>
}
/*
* after
*/
function Component({ url }) {
const data = React.use(fetch(url).then(res => res.json()))
return <div>{data}</div>
}
function Component({ url, shouldFetch }) {
let data = {};
if(shouldFetch) {
data = React.use(fetch(url).then(res => res.json()))
}
return <div>{data}</div>
}
loading, error는 Suspense와 Errorboundary로 컨트롤
다음과 같은 경우 데이터를 한꺼번에 업데이트한다.
프로미스를 반환하는 경우 뿐만이 아니라 useContext의 대용으로도 사용 가능하다.