react中如何封装一个通用组件
封装通用组件的核心原则
封装通用组件需要遵循高内聚、低耦合的原则,确保组件功能独立且易于复用。组件的设计应具备清晰的接口和良好的扩展性。
定义明确的Props接口
使用TypeScript或PropTypes定义组件的输入参数,明确数据类型和默认值。例如按钮组件可包含size、variant、onClick等props:
interface ButtonProps {
size?: 'small' | 'medium' | 'large';
variant?: 'primary' | 'secondary';
onClick?: () => void;
children: React.ReactNode;
}
提供默认值和可扩展性
通过解构赋值设置props默认值,同时保留扩展能力。使用...rest传递额外属性到DOM元素:
function Button({
size = 'medium',
variant = 'primary',
children,
...rest
}: ButtonProps) {
return (
<button className={`btn-${size} btn-${variant}`} {...rest}>
{children}
</button>
);
}
样式隔离方案
采用CSS Modules或Styled-components实现样式封装。避免全局样式污染:
import styles from './Button.module.css';
function Button({ children }) {
return <button className={styles.root}>{children}</button>;
}
组件复合与插槽设计
通过children或render props支持内容定制。例如模态框组件:
function Modal({ header, children, footer }) {
return (
<div className="modal">
{header && <div className="modal-header">{header}</div>}
<div className="modal-body">{children}</div>
{footer && <div className="modal-footer">{footer}</div>}
</div>
);
}
状态管理策略
将状态逻辑通过自定义Hook分离,便于复用:
function useToggle(initialState = false) {
const [state, setState] = useState(initialState);
const toggle = () => setState(!state);
return [state, toggle];
}
function ToggleButton() {
const [on, toggle] = useToggle();
return <button onClick={toggle}>{on ? 'ON' : 'OFF'}</button>;
}
文档与示例配套
使用Storybook或文档注释生成组件文档,提供多种使用场景示例:
/
* 通用按钮组件
* @example
* <Button variant="primary">提交</Button>
*/
function Button() {
// ...
}
性能优化措施
对高频更新组件使用React.memo,避免不必要的渲染:
const MemoButton = React.memo(Button);
测试覆盖策略
编写单元测试验证组件行为,包括props传递和交互测试:
test('should trigger onClick', () => {
const onClick = jest.fn();
render(<Button onClick={onClick} />);
fireEvent.click(screen.getByRole('button'));
expect(onClick).toHaveBeenCalled();
});






