react组件如何封装
封装 React 组件的核心方法
明确组件的职责与边界
组件的功能应当单一且清晰,避免承担过多职责。例如,一个按钮组件只负责渲染和触发点击事件,数据获取或状态管理应由父组件处理。
合理设计 Props 接口
通过 PropTypes 或 TypeScript 定义组件接收的 props 类型和默认值。例如:
Button.propTypes = {
onClick: PropTypes.func.isRequired,
disabled: PropTypes.bool,
size: PropTypes.oneOf(['small', 'medium', 'large'])
};
使用组合而非继承
优先通过 children 或 render props 实现组件扩展。例如:
<Card>
<Card.Header title="标题" />
<Card.Body>{children}</Card.Body>
</Card>
状态与逻辑分离
状态提升
若多个组件需要共享状态,将状态提升至最近的共同父组件。封装后的组件通过 props 接收数据和回调。
自定义 Hook 复用逻辑
将通用逻辑抽离为自定义 Hook。例如表单验证逻辑:
function useFormValidation(initialState) {
const [values, setValues] = useState(initialState);
const validate = () => { /* 验证逻辑 */ };
return { values, validate, handleChange };
}
样式封装方案
CSS Modules 局部作用域
使用 [name].module.css 文件导入样式,避免全局污染:
import styles from './Button.module.css';
<button className={styles.primary} />
Styled-components 动态样式
通过模板字符串定义带 props 的样式:
const StyledButton = styled.button`
background: ${props => props.primary ? 'blue' : 'gray'};
`;
性能优化策略
React.memo 避免重复渲染
对纯函数组件使用 memo 进行浅比较:
const MemoizedComponent = React.memo(({ data }) => {
return <div>{data}</div>;
});
useCallback/useMemo 缓存引用
对回调函数和计算结果进行记忆化:
const memoizedCallback = useCallback(() => {
doSomething(a, b);
}, [a, b]);
组件文档与测试
PropTypes 类型检查
为组件添加详细的 prop 类型定义,便于开发者理解使用方式。
Storybook 可视化文档
通过 Storybook 创建交互式组件文档,展示不同 props 的组合效果。
单元测试覆盖
使用 Jest + React Testing Library 编写测试用例:
test('按钮点击触发回调', () => {
const mockFn = jest.fn();
render(<Button onClick={mockFn} />);
fireEvent.click(screen.getByRole('button'));
expect(mockFn).toHaveBeenCalled();
});






