How to write clean props in reactjs
A better props contract is highly scalable and modular to build better application
In reactjs passing ( writing ) props seems very simple. Until it comes to scalablity.
Hello, I'm Vikash.
Source ( Unorganized )
interface UserCardProps {
user: UserDomainModel;
isSmall?: boolean;
isLarge?: boolean;
isDarkMode?: boolean;
hasBorder?: boolean;
hasShadow?: boolean;
setIsEditing: React.Dispatch<React.SetStateAction<boolean>>;
setUserData: React.Dispatch<React.SetStateAction<UserDomainModel>>;
showEditButton?: boolean;
showFollowButton?: boolean;
showDeleteButton?: boolean;
onAction?: (type: string, data: any) => void;
}
export const UserProfileCard = ({
user,
isSmall,
isLarge,
setIsEditing,
showEditButton,
onAction,
}: UserCardProps) => {
return (
<div className={`card ${isSmall ? 'sm' : isLarge ? 'lg' : 'md'}`}>
<img src={user.profile.meta.avatar.cdnUrl} alt={user.personalInfo.firstName} />
<h3>{user.personalInfo.firstName} {user.personalInfo.lastName}</h3>
{showEditButton && (
<button onClick={() => setIsEditing(true)}>Edit</button>
)}
<button onClick={() => onAction?.('DELETE', user.id)}>Delete</button>
</div>
);
};
Source ( Clean )
interface UserCardProps {
userId: string;
name: string;
avatarUrl?: string;
size?: 'sm' | 'md' | 'lg';
variant?: 'flat' | 'outlined' | 'elevated';
onSelect?: (userId: string) => void;
actionSlot?: React.ReactNode;
}
export const UserProfileCard = ({
userId,
name,
avatarUrl,
size = 'md',
variant = 'flat',
onSelect,
actionSlot,
}: UserCardProps) => {
return (
<div
className={`card card--${size} card--${variant}`}
onClick={() => onSelect?.(userId)}
>
{avatarUrl && <img src={avatarUrl} alt={name} />}
<h3>{name}</h3>
{/* Slot rendering keeps child clean of button logic */}
{actionSlot && <div className="card__actions">{actionSlot}</div>}
</div>
);
};
Writing better props solves so many hurdles in future debugging and keeps the development flow smooth and predictable.
Thanks for Reading
