react-tanstack-senior by modra40/claude-codex-skills-directory
npx skills add https://github.com/modra40/claude-codex-skills-directory --skill react-tanstack-seniorKISS > Clever Code
Readability > Brevity
Explicit > Implicit
Composition > Inheritance
Colocation > Separation
Type Safety > Any
状态管理:
路由:
确定项目类型:
初始化项目 → 参见 folder-structure.md
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
设置核心依赖项 → 参见 recommended-libraries.md
| 库 | 何时阅读 |
|---|---|
| tanstack-query.md | 数据获取、缓存、变更 |
| tanstack-router.md | 类型安全路由、加载器、搜索参数 |
| tanstack-table.md | 复杂表格、排序、筛选、分页 |
| tanstack-form.md | 表单验证、字段数组、异步验证 |
| tanstack-start.md | 全栈 SSR 框架 |
// 组件: PascalCase 并带有描述性后缀
UserProfileCard.tsx // ✓
UserCard.tsx // ✗ 过于通用
user-profile.tsx // ✗ 错误的大小写
// 钩子: camelCase 并带有 'use' 前缀
useUserProfile() // ✓
useGetUserProfile() // ✗ 冗余的 'Get'
getUserProfile() // ✗ 缺少 'use'
// 查询键: 具有层次结构的数组
['users', 'list', { status }] // ✓
['usersList'] // ✗ 不够细粒度
`users-${status}` // ✗ 字符串插值
// 文件: 非组件文件使用 kebab-case
api-client.ts // ✓
apiClient.ts // ✗
// 1. 导入 (分组: 外部 → 内部 → 类型)
import { useSuspenseQuery } from '@tanstack/react-query'
import { userQueries } from '@/features/users/api'
import type { User } from '@/features/users/types'
// 2. 类型 (就近放置,除非是共享类型否则不放在单独文件)
interface UserCardProps {
userId: string
onSelect?: (user: User) => void
}
// 3. 组件 (单一职责)
export function UserCard({ userId, onSelect }: UserCardProps) {
// 3a. 查询/变更优先
const { data: user } = useSuspenseQuery(userQueries.detail(userId))
// 3b. 派生状态 (仅在计算昂贵时使用 useMemo)
const fullName = `${user.firstName} ${user.lastName}`
// 3c. 处理函数 (仅在传递给记忆化子组件时使用 useCallback)
const handleClick = () => onSelect?.(user)
// 3d. 针对边界情况提前返回
if (!user.isActive) return null
// 3e. JSX (简洁,嵌套最少)
return (
<article onClick={handleClick} className="user-card">
<h3>{fullName}</h3>
<p>{user.email}</p>
</article>
)
}
// ❌ 绝对不要: 使用 useEffect 进行数据获取
useEffect(() => {
fetch('/api/users').then(setUsers)
}, [])
// ✅ 始终: 使用 TanStack Query
const { data: users } = useQuery(userQueries.list())
// ❌ 绝对不要: 属性透传超过 2 层
<Parent userData={user}>
<Child userData={user}>
<GrandChild userData={user} />
// ✅ 始终: 在需要的层级使用上下文或查询
function GrandChild() {
const { data: user } = useQuery(userQueries.current())
}
// ❌ 绝对不要: 过早优化
const value = useMemo(() => a + b, [a, b]) // 简单的数学运算
// ✅ 始终: 仅在测量后优化
const value = a + b // 直接计算
// ❌ 绝对不要: 在动态列表中使用索引作为 key
{items.map((item, i) => <Item key={i} />)}
// ✅ 始终: 使用稳定的唯一标识符
{items.map(item => <Item key={item.id} />)}
参见 debugging-guide.md 了解:
参见 common-pitfalls.md 了解:
□ 打包大小 < 200KB gzipped (初始)
□ 最大内容绘制 < 2.5 秒
□ 没有不必要的重新渲染 (React DevTools)
□ 图片懒加载
□ 按路由进行代码分割
□ 查询去重正常工作
□ 没有内存泄漏 (堆快照稳定)
□ 没有 `any` 类型 (如果需要,使用 `unknown`)
□ 没有不加解释的 `// @ts-ignore`
□ 路由级别有错误边界
□ 处理了加载状态
□ 处理了空状态
□ 处理了错误状态
□ 可访问性 (aria 标签、键盘导航)
□ 没有硬编码字符串 (支持 i18n)
□ 生产代码中没有 console.log
□ 业务逻辑有测试
每周安装次数
98
仓库
GitHub 星标数
4
首次出现
2026年1月21日
安全审计
安装于
gemini-cli74
opencode71
codex70
github-copilot68
cursor59
claude-code58
KISS > Clever Code
Readability > Brevity
Explicit > Implicit
Composition > Inheritance
Colocation > Separation
Type Safety > Any
State Management:
Routing:
Determine project type:
Initialize project → See folder-structure.md
Setup core dependencies → See recommended-libraries.md
| Library | When to Read |
|---|---|
| tanstack-query.md | Data fetching, caching, mutations |
| tanstack-router.md | Type-safe routing, loaders, search params |
| tanstack-table.md | Complex tables, sorting, filtering, pagination |
| tanstack-form.md | Form validation, field arrays, async validation |
| tanstack-start.md | Full-stack SSR framework |
// Components: PascalCase dengan suffix deskriptif
UserProfileCard.tsx // ✓
UserCard.tsx // ✗ terlalu generic
user-profile.tsx // ✗ wrong case
// Hooks: camelCase dengan prefix 'use'
useUserProfile() // ✓
useGetUserProfile() // ✗ redundant 'Get'
getUserProfile() // ✗ missing 'use'
// Query keys: array dengan hierarchy
['users', 'list', { status }] // ✓
['usersList'] // ✗ tidak granular
`users-${status}` // ✗ string interpolation
// Files: kebab-case untuk non-components
api-client.ts // ✓
apiClient.ts // ✗
// 1. Imports (grouped: external → internal → types)
import { useSuspenseQuery } from '@tanstack/react-query'
import { userQueries } from '@/features/users/api'
import type { User } from '@/features/users/types'
// 2. Types (colocated, tidak di file terpisah kecuali shared)
interface UserCardProps {
userId: string
onSelect?: (user: User) => void
}
// 3. Component (single responsibility)
export function UserCard({ userId, onSelect }: UserCardProps) {
// 3a. Queries/mutations first
const { data: user } = useSuspenseQuery(userQueries.detail(userId))
// 3b. Derived state (useMemo hanya jika expensive)
const fullName = `${user.firstName} ${user.lastName}`
// 3c. Handlers (useCallback hanya jika passed to memoized children)
const handleClick = () => onSelect?.(user)
// 3d. Early returns untuk edge cases
if (!user.isActive) return null
// 3e. JSX (clean, minimal nesting)
return (
<article onClick={handleClick} className="user-card">
<h3>{fullName}</h3>
<p>{user.email}</p>
</article>
)
}
// ❌ NEVER: useEffect untuk data fetching
useEffect(() => {
fetch('/api/users').then(setUsers)
}, [])
// ✅ ALWAYS: TanStack Query
const { data: users } = useQuery(userQueries.list())
// ❌ NEVER: Prop drilling lebih dari 2 level
<Parent userData={user}>
<Child userData={user}>
<GrandChild userData={user} />
// ✅ ALWAYS: Context atau query di level yang butuh
function GrandChild() {
const { data: user } = useQuery(userQueries.current())
}
// ❌ NEVER: Premature optimization
const value = useMemo(() => a + b, [a, b]) // simple math
// ✅ ALWAYS: Optimize only when measured
const value = a + b // just calculate
// ❌ NEVER: Index as key untuk dynamic lists
{items.map((item, i) => <Item key={i} />)}
// ✅ ALWAYS: Stable unique identifier
{items.map(item => <Item key={item.id} />)}
See debugging-guide.md for:
See common-pitfalls.md for:
□ Bundle size < 200KB gzipped (initial)
□ Largest Contentful Paint < 2.5s
□ No unnecessary re-renders (React DevTools)
□ Images lazy loaded
□ Code splitting per route
□ Query deduplication working
□ No memory leaks (heap snapshot stable)
□ No `any` types (use `unknown` if needed)
□ No `// @ts-ignore` tanpa penjelasan
□ Error boundaries di route level
□ Loading states handled
□ Empty states handled
□ Error states handled
□ Accessibility (aria labels, keyboard nav)
□ No hardcoded strings (i18n ready)
□ No console.log in production code
□ Tests untuk business logic
Weekly Installs
98
Repository
GitHub Stars
4
First Seen
Jan 21, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
gemini-cli74
opencode71
codex70
github-copilot68
cursor59
claude-code58
TanStack Query v5 完全指南:React 数据管理、乐观更新、离线支持
2,500 周安装
c-notes:macOS命令行工具,高效管理Apple备忘录和提醒事项
1 周安装
c-network网络工具包:doggo DNS客户端与httpie HTTP客户端命令行工具使用指南
1 周安装
c-music:Claude 控制 Spotify 播放的 CLI 工具 | spogo 音乐搜索与播放
1 周安装
Claude Code Memory 持久化上下文工具:跨会话存储用户偏好与项目信息
1 周安装
c-files云文件管理:Rclone命令行工具使用指南与70+云存储配置教程
1 周安装
c-display:macOS 显示亮度控制与安全文件删除命令行工具
1 周安装