Loading...
Loading...
Compare original and translation side by side
interface ButtonProps {
variant?: 'primary' | 'secondary' | 'ghost';
size?: 'sm' | 'md' | 'lg';
disabled?: boolean;
loading?: boolean;
onClick?: () => void;
children: React.ReactNode;
}
export const Button: React.FC<ButtonProps> = ({
variant = 'primary',
size = 'md',
disabled = false,
loading = false,
onClick,
children,
}) => {
return (
<button
className={`button button--${variant} button--${size}`}
disabled={disabled || loading}
onClick={onClick}
>
{loading && <Spinner size="sm" />}
{children}
</button>
);
};interface FormInputProps {
label: string;
placeholder?: string;
error?: string;
value: string;
onChange: (value: string) => void;
disabled?: boolean;
}
export const FormInput: React.FC<FormInputProps> = ({
label,
placeholder,
error,
value,
onChange,
disabled,
}) => {
return (
<div className="form-input">
<Label>{label}</Label>
<Input
placeholder={placeholder}
value={value}
onChange={(e) => onChange(e.target.value)}
disabled={disabled}
aria-invalid={!!error}
/>
{error && <ErrorMessage>{error}</ErrorMessage>}
</div>
);
};interface CardProps {
title: string;
description?: string;
image?: string;
action?: {
label: string;
onClick: () => void;
};
children?: React.ReactNode;
}
export const Card: React.FC<CardProps> = ({
title,
description,
image,
action,
children,
}) => {
return (
<div className="card">
{image && <img src={image} alt={title} className="card-image" />}
<div className="card-content">
<h3 className="card-title">{title}</h3>
{description && <p className="card-description">{description}</p>}
{children}
{action && (
<Button onClick={action.onClick} variant="secondary">
{action.label}
</Button>
)}
</div>
</div>
);
};export const BlogPostTemplate: React.FC<BlogPostTemplateProps> = ({
title,
author,
date,
image,
content,
relatedPosts,
}) => {
return (
<div className="blog-post-template">
<Header />
<article className="blog-post">
<div className="blog-post-hero">
<img src={image} alt={title} />
</div>
<div className="blog-post-content">
<h1>{title}</h1>
<div className="blog-post-meta">
<Avatar src={author.avatar} alt={author.name} />
<span>{author.name}</span>
<span>{formatDate(date)}</span>
</div>
<div className="blog-post-body">{content}</div>
</div>
</article>
<section className="related-posts">
<h2>Related Posts</h2>
<div className="related-posts-grid">
{relatedPosts.map((post) => (
<Card key={post.id} {...post} />
))}
</div>
</section>
<Footer />
</div>
);
};interface ButtonProps {
variant?: 'primary' | 'secondary' | 'ghost';
size?: 'sm' | 'md' | 'lg';
disabled?: boolean;
loading?: boolean;
onClick?: () => void;
children: React.ReactNode;
}
export const Button: React.FC<ButtonProps> = ({
variant = 'primary',
size = 'md',
disabled = false,
loading = false,
onClick,
children,
}) => {
return (
<button
className={`button button--${variant} button--${size}`}
disabled={disabled || loading}
onClick={onClick}
>
{loading && <Spinner size="sm" />}
{children}
</button>
);
};interface FormInputProps {
label: string;
placeholder?: string;
error?: string;
value: string;
onChange: (value: string) => void;
disabled?: boolean;
}
export const FormInput: React.FC<FormInputProps> = ({
label,
placeholder,
error,
value,
onChange,
disabled,
}) => {
return (
<div className="form-input">
<Label>{label}</Label>
<Input
placeholder={placeholder}
value={value}
onChange={(e) => onChange(e.target.value)}
disabled={disabled}
aria-invalid={!!error}
/>
{error && <ErrorMessage>{error}</ErrorMessage>}
</div>
);
};interface CardProps {
title: string;
description?: string;
image?: string;
action?: {
label: string;
onClick: () => void;
};
children?: React.ReactNode;
}
export const Card: React.FC<CardProps> = ({
title,
description,
image,
action,
children,
}) => {
return (
<div className="card">
{image && <img src={image} alt={title} className="card-image" />}
<div className="card-content">
<h3 className="card-title">{title}</h3>
{description && <p className="card-description">{description}</p>}
{children}
{action && (
<Button onClick={action.onClick} variant="secondary">
{action.label}
</Button>
)}
</div>
</div>
);
};export const BlogPostTemplate: React.FC<BlogPostTemplateProps> = ({
title,
author,
date,
image,
content,
relatedPosts,
}) => {
return (
<div className="blog-post-template">
<Header />
<article className="blog-post">
<div className="blog-post-hero">
<img src={image} alt={title} />
</div>
<div className="blog-post-content">
<h1>{title}</h1>
<div className="blog-post-meta">
<Avatar src={author.avatar} alt={author.name} />
<span>{author.name}</span>
<span>{formatDate(date)}</span>
</div>
<div className="blog-post-body">{content}</div>
</div>
</article>
<section className="related-posts">
<h2>Related Posts</h2>
<div className="related-posts-grid">
{relatedPosts.map((post) => (
<Card key={post.id} {...post} />
))}
</div>
</section>
<Footer />
</div>
);
};// Does too much: rendering, data fetching, form handling, validation
const UserProfile = () => {
const [user, setUser] = useState(null);
const [formData, setFormData] = useState({});
const [errors, setErrors] = useState({});
useEffect(() => {
fetchUser().then(setUser);
}, []);
const handleSubmit = () => {
// validation logic
// submission logic
};
return (
// complex JSX
);
};// UserProfile: Orchestrates the page
const UserProfile = () => {
const { user } = useUser();
return (
<>
<UserHeader user={user} />
<UserEditForm user={user} />
<UserActivity user={user} />
</>
);
};
// UserHeader: Displays user info
const UserHeader = ({ user }) => (
<div className="user-header">
<Avatar src={user.avatar} />
<h1>{user.name}</h1>
</div>
);
// UserEditForm: Handles form state and submission
const UserEditForm = ({ user }) => {
// form logic
};
// UserActivity: Displays user activity
const UserActivity = ({ user }) => {
// activity logic
};// 职责过多:渲染、数据获取、表单处理、验证
const UserProfile = () => {
const [user, setUser] = useState(null);
const [formData, setFormData] = useState({});
const [errors, setErrors] = useState({});
useEffect(() => {
fetchUser().then(setUser);
}, []);
const handleSubmit = () => {
// 验证逻辑
// 提交逻辑
};
return (
// 复杂JSX
);
};// UserProfile:负责页面编排
const UserProfile = () => {
const { user } = useUser();
return (
<>
<UserHeader user={user} />
<UserEditForm user={user} />
<UserActivity user={user} />
</>
);
};
// UserHeader:展示用户信息
const UserHeader = ({ user }) => (
<div className="user-header">
<Avatar src={user.avatar} />
<h1>{user.name}</h1>
</div>
);
// UserEditForm:处理表单状态和提交
const UserEditForm = ({ user }) => {
// 表单逻辑
};
// UserActivity:展示用户活动
const UserActivity = ({ user }) => {
// 活动逻辑
};// Inheritance approach (avoid)
class Button extends React.Component {}
class PrimaryButton extends Button {}
class LargeButton extends Button {}
class LargePrimaryButton extends Button {}// Composition approach (prefer)
const Button = ({ variant = 'primary', size = 'md', ...props }) => (
<button className={`button button--${variant} button--${size}`} {...props} />
);
// Use composition to create variants
const PrimaryButton = (props) => <Button variant="primary" {...props} />;
const LargeButton = (props) => <Button size="lg" {...props} />;
const LargePrimaryButton = (props) => <Button variant="primary" size="lg" {...props} />;// 继承方式(应避免)
class Button extends React.Component {}
class PrimaryButton extends Button {}
class LargeButton extends Button {}
class LargePrimaryButton extends Button {}// 组合方式(推荐)
const Button = ({ variant = 'primary', size = 'md', ...props }) => (
<button className={`button button--${variant} button--${size}`} {...props} />
);
// 通过组合创建变体
const PrimaryButton = (props) => <Button variant="primary" {...props} />;
const LargeButton = (props) => <Button size="lg" {...props} />;
const LargePrimaryButton = (props) => <Button variant="primary" size="lg" {...props} />;interface ButtonProps {
// Variant and size are constrained to valid options
variant?: 'primary' | 'secondary' | 'ghost' | 'danger';
size?: 'sm' | 'md' | 'lg';
// Boolean props are explicit
disabled?: boolean;
loading?: boolean;
fullWidth?: boolean;
// Callbacks are clearly named
onClick?: () => void;
onHover?: () => void;
// Content is flexible
children: React.ReactNode;
icon?: React.ReactNode;
// HTML attributes can be passed through
className?: string;
'aria-label'?: string;
}interface ButtonProps {
// 变体和大小被约束为有效选项
variant?: 'primary' | 'secondary' | 'ghost' | 'danger';
size?: 'sm' | 'md' | 'lg';
// 布尔属性明确清晰
disabled?: boolean;
loading?: boolean;
fullWidth?: boolean;
// 回调函数命名清晰
onClick?: () => void;
onHover?: () => void;
// 内容具备灵活性
children: React.ReactNode;
icon?: React.ReactNode;
// 可传递HTML属性
className?: string;
'aria-label'?: string;
}const ControlledInput = ({ value, onChange }) => (
<input value={value} onChange={(e) => onChange(e.target.value)} />
);
// Parent manages state
const Parent = () => {
const [value, setValue] = useState('');
return <ControlledInput value={value} onChange={setValue} />;
};const UncontrolledInput = ({ defaultValue, onSubmit }) => {
const inputRef = useRef(null);
return (
<>
<input ref={inputRef} defaultValue={defaultValue} />
<button onClick={() => onSubmit(inputRef.current.value)}>Submit</button>
</>
);
};
// Parent doesn't manage state
const Parent = () => {
return <UncontrolledInput onSubmit={(value) => console.log(value)} />;
};const ControlledInput = ({ value, onChange }) => (
<input value={value} onChange={(e) => onChange(e.target.value)} />
);
// 父组件管理状态
const Parent = () => {
const [value, setValue] = useState('');
return <ControlledInput value={value} onChange={setValue} />;
};const UncontrolledInput = ({ defaultValue, onSubmit }) => {
const inputRef = useRef(null);
return (
<>
<input ref={inputRef} defaultValue={defaultValue} />
<button onClick={() => onSubmit(inputRef.current.value)}>Submit</button>
</>
);
};
// 父组件不管理状态
const Parent = () => {
return <UncontrolledInput onSubmit={(value) => console.log(value)} />;
};interface ButtonProps {
variant?: 'primary' | 'secondary' | 'ghost' | 'danger';
size?: 'sm' | 'md' | 'lg';
state?: 'default' | 'hover' | 'active' | 'disabled' | 'loading';
}
// Variants matrix
const Button = ({ variant = 'primary', size = 'md', state = 'default', ...props }) => {
const variantClass = `button--${variant}`;
const sizeClass = `button--${size}`;
const stateClass = `button--${state}`;
return (
<button className={`button ${variantClass} ${sizeClass} ${stateClass}`} {...props} />
);
};
// Usage
<Button variant="primary" size="md" state="default">Primary</Button>
<Button variant="secondary" size="lg" state="hover">Secondary Large</Button>
<Button variant="danger" size="sm" state="disabled">Delete</Button>interface ButtonProps {
variant?: 'primary' | 'secondary' | 'ghost' | 'danger';
size?: 'sm' | 'md' | 'lg';
state?: 'default' | 'hover' | 'active' | 'disabled' | 'loading';
}
// 变体矩阵
const Button = ({ variant = 'primary', size = 'md', state = 'default', ...props }) => {
const variantClass = `button--${variant}`;
const sizeClass = `button--${size}`;
const stateClass = `button--${state}`;
return (
<button className={`button ${variantClass} ${sizeClass} ${stateClass}`} {...props} />
);
};
// 使用示例
<Button variant="primary" size="md" state="default">Primary</Button>
<Button variant="secondary" size="lg" state="hover">Secondary Large</Button>
<Button variant="danger" size="sm" state="disabled">Delete</Button>undefinedundefinedundefinedundefinedundefinedundefined| Prop | Type | Default | Description |
|---|---|---|---|
| 'primary' | 'secondary' | 'primary' | Visual variant |
| 'sm' | 'md' | 'lg' | 'md' | Component size |
| boolean | false | Disable the component |
| ReactNode | - | Component content |
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| 'primary' | 'secondary' | 'primary' | 视觉变体 |
| 'sm' | 'md' | 'lg' | 'md' | 组件尺寸 |
| boolean | false | 禁用组件 |
| ReactNode | - | 组件内容 |
<Button variant="primary">Primary Action</Button><Button variant="primary">Primary Action</Button><Button variant="secondary">Secondary Action</Button><Button variant="secondary">Secondary Action</Button><Button disabled>Disabled</Button><Button disabled>Disabled</Button><Button loading>Loading...</Button><Button loading>Loading...</Button><Button onClick={() => alert('Clicked!')}>Click Me</Button><Button onClick={() => alert('Clicked!')}>Click Me</Button><Button icon={<SaveIcon />}>Save</Button><Button icon={<SaveIcon />}>Save</Button><Button fullWidth>Full Width Button</Button><Button fullWidth>Full Width Button</Button>undefinedundefined"I'm using the component-architecture skill. Can you audit my components?
- Identify components that violate single responsibility
- Suggest component composition improvements
- Check component documentation completeness
- Identify reusable patterns I'm missing
- Suggest component library structure""我正在使用组件架构技能。能否帮我审计我的组件?
- 识别违反单一职责原则的组件
- 提出组件组合的改进建议
- 检查组件文档的完整性
- 识别我遗漏的可复用模式
- 提出组件库结构建议""Can you help me design a component system?
- Define atomic components (atoms, molecules, organisms)
- Create component architecture
- Design component props interfaces
- Define variants for each component
- Create component documentation""能否帮我设计一个组件系统?
- 定义原子组件(atoms、molecules、organisms)
- 创建组件架构
- 设计组件属性接口
- 为每个组件定义变体
- 创建组件文档""Can you help me refactor my components?
- Break down complex components
- Improve component composition
- Simplify prop interfaces
- Add missing variants
- Improve documentation""能否帮我重构我的组件?
- 拆分复杂组件
- 改进组件组合
- 简化属性接口
- 添加缺失的变体
- 完善文档""Can you generate a component library?
- Create all atomic components (Button, Input, Label, etc.)
- Create molecules (FormInput, SearchBar, etc.)
- Create organisms (Card, Modal, etc.)
- Include TypeScript types
- Include Tailwind CSS styling
- Include comprehensive documentation""能否帮我生成一个组件库?
- 创建所有原子组件(Button、Input、Label等)
- 创建分子组件(FormInput、SearchBar等)
- 创建有机体组件(Card、Modal等)
- 包含TypeScript类型定义
- 包含Tailwind CSS样式
- 包含全面的文档""Can you evaluate my component architecture?
- Are my components following single responsibility?
- Is my component composition good?
- Are my prop interfaces well-designed?
- Is my documentation comprehensive?
- What's one thing I could improve immediately?""能否评估我的组件架构?
- 我的组件是否遵循单一职责原则?
- 我的组件组合是否合理?
- 我的属性接口设计是否精良?
- 我的文档是否全面?
- 我可以立即改进的一点是什么?"