Skip to main content

react-class-to-functional

Convert React class components to functional components with hooks

소스 정보

저장소
cockroachdb/cockroach
최근 소스 활동
2026년 2월 10일 18:22
감지된 SKILL.md 언어
영어
스타
32,570
포크
4,131

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
react-class-to-functional
description
Convert React class components to functional components with hooks
argument-hint
<file-path>
# React Class to Functional Component Converter Convert the React class component at `$ARGUMENTS` to a functional component using React hooks. ## Conversion Rules ### State - `this.state = { ... }` → individual `useState` hooks - `this.setState({ key: value })` → setter function - `this.setState(prev => ...)` → functional update form - Mutable objects (Set/Map) must be cloned on update: ```typescript setExpandedRows(prev => { const next = new Set(prev); next.add(key); return next; }); ``` ### Lifecycle → useEffect | Class | Functional | |-------|-----------| | `componentDidMount` | `useEffect(fn, [])` | | `componentDidUpdate` | `useEffect(fn)` or `useEffect(fn, [deps])` | | `componentWillUnmount` | `useEffect(() => cleanup, [])` | | mount + unmount | single `useEffect` with cleanup return | ### Other Mappings - `React.createRef()` → `useRef(null)` - `static contextType` → `useContext(MyContext)` - Bound methods / arrow class methods → local function inside functional component - Non-reactive instance variables (`this.timer`) → `useRef` - `createSelector` (reselect) → `useMemo` with explicit dependency array ### Props and Defaults - `this.props.x` → destructured props - `static defaultProps` → default parameter values - **Critical**: mark defaultProps as optional (`?`) in the interface: ```typescript interface Props { sortSetting?: SortSetting; } function Component({ sortSetting = defaultValue }: Props) { ... } ``` ### setState with Callback `this.setState(update, callback)` has no direct hook equivalent. Use ref + useEffect: ```typescript const pendingRef = useRef(false); const prevRef = useRef(value); const onUpdate = useCallback(() => { pendingRef.current = true; setValue(newValue); }, []); useEffect(() => { if (pendingRef.current && prevRef.current !== value) { pendingRef.current = false; doCallback(); } prevRef.current = value; }, [value, doCallback]); ``` ## Generic Components - `class MyTable extends SortedTable<Row> {}` → `const MyTable = SortedTable<Row>;` - Exported type aliases require the props interface to also be exported (else "cannot be named" build errors) - TypeScript may fail to infer generics with spread props — add explicit type params: `<SortedTable<Row> {...props} />` ## Workflow 1. Read the file and summarize: state vars, lifecycle methods, refs, methods, generics, files extending this class 2. Before converting each method, verify it's actually called — delete dead code, don't convert it 3. Write the converted component, preserving imports/comments/exports and adding hook imports 4. Search for and update dependent files that extend the class ## Verification Checklist - [ ] All `this.` references removed - [ ] Hooks follow Rules of Hooks (top level, consistent order) - [ ] TypeScript types preserved; exports unchanged - [ ] defaultProps marked optional in interface - [ ] Exported type aliases have their props interfaces exported - [ ] Files extending the class updated to type alias pattern - [ ] No dead code converted (every `useCallback` is actually called) - [ ] No orphaned helpers (if logic was inlined, delete the original) - [ ] No unused destructured props - [ ] No failed intermediate attempts left behind - [ ] Within the appropriate directory with `package.json`, run ESLint (fix) and Tests
GitHub에서 보기