React 代码编写规范

组件命名

组件名称采用大驼峰式命名(PascalCase),与文件名保持一致。例如:UserProfile.jsx 应包含一个名为 UserProfile 的组件。避免使用缩写或模糊的命名。

文件结构

将相关文件组织在同一个目录下,例如组件、样式和测试文件。推荐按功能或模块划分目录结构,而非按文件类型划分。

components/
  UserProfile/
    UserProfile.jsx
    UserProfile.css
    UserProfile.test.js

函数组件与Hooks

优先使用函数组件和Hooks而非类组件。Hooks的调用顺序必须保持一致,且不能在条件或循环中使用。自定义Hook应以use前缀命名,例如useFetchData

状态管理

避免过度使用useState,复杂状态逻辑应使用useReducer或状态管理库(如Redux、Zustand)。将状态提升到最近的共同父组件,避免不必要的全局状态。

Props传递

使用TypeScript或PropTypes定义组件Props的类型。避免直接传递整个对象,而是解构出需要的属性。布尔类型的Prop默认值应为false

interface ButtonProps {
  label: string;
  disabled?: boolean;
}

const Button = ({ label, disabled = false }: ButtonProps) => (
  <button disabled={disabled}>{label}</button>
);

样式管理

推荐使用CSS-in-JS方案(如Styled-components或Emotion),或CSS Modules避免全局样式污染。避免在组件中写内联样式,除非是动态样式。

事件处理

事件处理函数应以handle前缀命名,例如handleClick。使用箭头函数或在构造函数中绑定以避免不必要的重新渲染。

const handleSubmit = (e) => {
  e.preventDefault();
  // 处理逻辑
};

return <form onSubmit={handleSubmit}>...</form>;

代码格式化

使用Prettier和ESLint确保代码风格一致。配置规则包括:2个空格缩进、单引号、结尾分号等。提交前自动格式化代码。

性能优化

使用React.memo记忆化组件,避免不必要的渲染。对于大型列表,使用react-windowreact-virtualized实现虚拟滚动。复杂计算使用useMemo,函数引用使用useCallback

测试规范

为每个组件编写单元测试(Jest + React Testing Library)。测试覆盖率至少达到80%。避免测试实现细节,聚焦于用户交互和行为。

注释与文档

为复杂逻辑添加清晰注释,但避免过度注释显而易见的代码。使用JSDoc为公共组件和函数生成文档。重大变更需更新CHANGELOG.md。

代码拆分

使用React.lazy和Suspense实现路由级或组件级懒加载。动态导入第三方库或非关键组件以减小初始包体积。

const LazyComponent = React.lazy(() => import('./LazyComponent'));

function MyComponent() {
  return (
    <Suspense fallback={<Spinner />}>
      <LazyComponent />
    </Suspense>
  );
}

错误边界

为应用添加错误边界(Error Boundaries)捕获组件树中的JavaScript错误,避免整个应用崩溃。记录错误信息并显示降级UI。

class ErrorBoundary extends React.Component {
  state = { hasError: false };

  static getDerivedStateFromError() {
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    logErrorToService(error, info);
  }

  render() {
    if (this.state.hasError) {
      return <FallbackUI />;
    }
    return this.props.children;
  }
}

可访问性

遵循WAI-ARIA标准,为交互元素添加适当的rolearia-*属性。确保键盘导航可用,颜色对比度符合WCAG 2.1标准。使用语义化HTML标签。

更多推荐