React Utils
@teamsparta/react에서 제공하는 유틸리티 함수 모음입니다.
createContext
React Context와 Provider, useContext를 간편하게 생성하는 팩토리 함수입니다.
API
typescript
function createContext<ContextValue extends object | null>(
rootComponentName: string,
defaultContext?: ContextValue
): readonly [
Provider: (props: ContextValue & { children: ReactNode }) => ReactElement,
useContext: (consumerName: string) => ContextValue
];rootComponentName: Provider의 displayName과 에러 메시지에 사용됩니다.defaultContext: 기본값이 제공되지 않고 Provider 바깥에서 useContext를 호출하면 에러를 throw합니다.- Provider는
children을 제외한 모든 props를 context value로 사용합니다. - Provider의 value는
useMemo로 최적화됩니다.
사용 예시
tsx
// Context 생성
const [FormProvider, useFormContext] = createContext<{
values: Record<string, string>;
onChange: (name: string, value: string) => void;
}>('FormContext');
// Provider 사용
function Form({ children }) {
const [values, setValues] = useState({});
const onChange = (name: string, value: string) =>
setValues(prev => ({ ...prev, [name]: value }));
return (
<FormProvider values={values} onChange={onChange}>
{children}
</FormProvider>
);
}
// Consumer 사용
function FormField({ name }) {
const { values, onChange } = useFormContext('FormField');
return (
<input
value={values[name] ?? ''}
onChange={(e) => onChange(name, e.target.value)}
/>
);
}mergeRefs
여러 개의 Ref를 하나로 병합하여 반환합니다. 하나의 element에 여러 ref를 연결할 때 사용합니다.
API
typescript
function mergeRefs<T>(
...refs: Array<RefObject<T> | RefCallback<T> | null | undefined>
): RefCallback<T>;사용 예시
tsx
// forwardRef와 내부 ref를 동시에 사용
const MyInput = forwardRef((props, parentRef) => {
const internalRef = useRef(null);
return <input ref={mergeRefs(internalRef, parentRef)} />;
});
// DOM 측정 callback ref와 일반 ref 함께 사용
function Component() {
const elementRef = useRef(null);
const measureRef = useCallback((node) => {
if (node) console.log(node.offsetHeight);
}, []);
return <div ref={mergeRefs(elementRef, measureRef)} />;
}