plugins/react-coder/skills/react-best-practices/SKILL.md
React 开发最佳实践指南 - 组件设计、Hooks 使用、状态管理及性能优化。 当用户说"React组件"、"React Hooks"、"React状态管理"、"useEffect"、"useState"、"useCallback"、"React性能"、"React优化"、"React反模式"、"React重构"时使用此技能。 涵盖:组件设计原则(组合优于继承、单一职责)、Hooks 最佳实践(依赖数组、自定义 Hook)、状态管理(服务端状态用 React Query、客户端状态用 Zustand)、性能优化(memo、useMemo、代码分割)。 提供 TypeScript 代码示例、反模式警告和最佳实践检查清单。
npx skillsauth add protagonistss/ithinku-plugins react-best-practicesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
本技能旨在指导开发者编写清晰、高性能、可扩展的 React 应用。 核心原则:声明式编程、组件化思维、单一职责、不可变性。
// ✅ 推荐:小组件、单一职责、组合模式
interface UserCardProps {
user: User;
onEdit: (id: string) => void;
}
function UserCard({ user, onEdit }: UserCardProps) {
return (
<article className="user-card">
<Avatar src={user.avatarUrl} alt={user.name} />
<UserInfo name={user.name} email={user.email} />
<UserActions onEdit={() => onEdit(user.id)} />
</article>
);
}
// ✅ 使用 children 实现组合
function Card({ children }: { children: React.ReactNode }) {
return <div className="card">{children}</div>;
}
function CardHeader({ title }: { title: string }) {
return <h2 className="card-header">{title}</h2>;
}
// 使用
<Card>
<CardHeader title="用户信息" />
<UserCard user={currentUser} onEdit={handleEdit} />
</Card>
// ✅ 自定义 Hook 提取逻辑
function useWindowSize() {
const [size, setSize] = useState({ width: 0, height: 0 });
useEffect(() => {
const handleResize = () => {
setSize({ width: window.innerWidth, height: window.innerHeight });
};
handleResize();
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
return size;
}
// ✅ 正确的依赖数组
function UserProfile({ userId }: { userId: string }) {
const [user, setUser] = useState<User | null>(null);
useEffect(() => {
async function fetchUser() {
const data = await getUser(userId);
setUser(data);
}
fetchUser();
}, [userId]); // ✅ userId 变化时重新获取
return user ? <UserCard user={user} /> : <Loading />;
}
// ✅ 服务端状态:使用 React Query
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
function UserList() {
const queryClient = useQueryClient();
const { data: users, isLoading } = useQuery({
queryKey: ['users'],
queryFn: fetchUsers,
});
const mutation = useMutation({
mutationFn: updateUser,
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['users'] });
},
});
if (isLoading) return <Loading />;
return (
<ul>
{users?.map((user) => (
<li key={user.id}>{user.name}</li>
))}
</ul>
);
}
// ✅ 客户端状态:使用 Zustand
import { create } from 'zustand';
interface AuthState {
user: User | null;
login: (user: User) => void;
logout: () => void;
}
const useAuthStore = create<AuthState>((set) => ({
user: null,
login: (user) => set({ user }),
logout: () => set({ user: null }),
}));
// ✅ 使用 React.memo 避免不必要渲染
const ExpensiveItem = memo(function ExpensiveItem({
item,
onSelect,
}: {
item: Item;
onSelect: (id: string) => void;
}) {
return (
<div onClick={() => onSelect(item.id)}>
{/* 复杂渲染逻辑 */}
</div>
);
});
// ✅ 使用 useMemo 缓存计算
function FilteredList({ items, filter }: { items: Item[]; filter: string }) {
const filteredItems = useMemo(() => {
return items.filter((item) => item.name.includes(filter));
}, [items, filter]);
return (
<ul>
{filteredItems.map((item) => (
<li key={item.id}>{item.name}</li>
))}
</ul>
);
}
// ✅ 代码分割与懒加载
const HeavyModal = lazy(() => import('./HeavyModal'));
function App() {
const [showModal, setShowModal] = useState(false);
return (
<>
<button onClick={() => setShowModal(true)}>打开</button>
{showModal && (
<Suspense fallback={<Loading />}>
<HeavyModal onClose={() => setShowModal(false)} />
</Suspense>
)}
</>
);
}
children prop 或 render props 来复用逻辑。useWindowSize, useAuth),保持组件整洁。useEffect 和 useCallback 的依赖数组。如果依赖项导致无限循环,解决依赖问题而不是撒谎(例如使用 useRef 或重构逻辑)。useEffect 中根据 props 更新 state。解决方案:直接在渲染期间计算,或使用 useMemo。key(除非列表是静态且不重排的)。useEffect 处理多个不相关的逻辑。解决方案:拆分为多个单一职责的 useEffect。useEffect 或 useCallback 中引用了旧的 state/props,通常是因为依赖数组不完整。React.lazy and Suspense 对路由或大型组件进行懒加载。React.memo 避免不必要的子组件重渲染(仅当 props 引用变化时)。使用 useMemo 缓存昂贵的计算。react-window 或 react-virtuoso 进行虚拟滚动。# 优化组件性能
/react-coder 优化这个组件的渲染性能,检查是否有不必要的重渲染,并应用 useMemo 或 React.memo。
# 重构为自定义 Hook
/react-coder 将这个组件中的数据获取和表单逻辑提取为单独的自定义 Hooks。
# 审查代码质量
/react-coder 检查这段代码是否违反了 React 最佳实践,特别是 useEffect 的依赖和状态管理方面。
development
Vue 3 开发最佳实践指南 - Composition API、Script Setup、Pinia、TypeScript 集成及性能优化。 当用户说"Vue 3组件"、"Composition API"、"script setup"、"Pinia"、"Vue 3项目"、"ref reactive"、"defineProps defineEmits"、"Composable"、"Vue 3优化"时使用此技能。 涵盖:Script Setup 与 Composition API、响应式数据选择(ref vs reactive)、组件通信(Props/Emits/v-model/Slots)、Composables 设计模式、Pinia Setup Store、性能优化(v-memo、shallowRef、KeepAlive)。 提供 TypeScript 代码示例、反模式对照表、迁移指南和示例文件引用。
development
Vue 2 维护与开发最佳实践指南 - Options API、Vuex 及向 Vue 3 迁移准备。 当用户说"Vue 2组件"、"Options API"、"Vuex"、"Vue 2项目"、"Vue 2迁移"、"Vue mixin"、"Vue 2最佳实践"时使用此技能。 涵盖:Options API 规范(选项顺序、props 验证)、Vuex 模块化(namespaced modules)、逻辑复用(避免 mixin,使用工具函数)、迁移准备(停止使用 Filters、引入 Composition API 插件)。 提供 Vue 2 代码示例、反模式警告和迁移建议。
development
核心设计能力 - 提供配色、布局、组件样式生成及反模式检查。 当用户说"设计UI"、"生成样式"、"页面布局"、"CSS样式"、"组件设计"、"配色方案"、"设计系统"、"前端样式"、"响应式设计"、"动画效果"时使用此技能。 支持多种设计风格:Neo-Brutalism、Glassmorphism、Editorial、Cyberpunk。 提供配色方案、布局生成、组件样式、微交互动效、响应式网格。拒绝"AI廉价感",追求大胆、独特、细节丰富的设计。 重要特性:提供反模式检查,避免泛滥的渐变、无聊的阴影、默认圆角等平庸设计。
content-media
无障碍设计审查与修复能力。 当用户说"无障碍"、"a11y"、"WCAG"、"键盘导航"、"屏幕阅读器"、"颜色对比度"、"ARIA"、"可访问性"、"辅助功能"、"盲人友好"时使用此技能。 基于 WCAG 2.1 标准,检测图片 Alt 文本缺失、表单 Label 关联、键盘可访问性、颜色对比度不足、ARIA 属性误用等问题。 提供修复代码示例:语义化标签、焦点管理、焦点陷阱、屏幕阅读器支持。输出合规性检查报告和修复建议。