We are following https://github.com/airbnb/javascript style guide in general.
- Use meaningful names for one-line functions, like
map,filter,reduce`. - Use aliases for import path.
- Use named imports/exports.
- Try to avoid
any/unknown. - Define types for data retrieved from server.
- Use
@todoand@hackcomments for future improvements and fixes. - Always use
eslintandprettier.
🚧 Content is under development.
-
Keep components small and functional.
-
Use classname package for defining multiple css classes.
-
Always use named export, avoid
export default. -
Use
UpperCamelCasefor files containing components. -
Use
.tsxextension for components
// Defines props types
export interface IComponent {
}
export const Component: React.FC<IComponent> = (props: IComponent): JSX.Element => { ... };export const Component: React.FC<IComponent> = React.memo((props: IComponent): JSX.Element => { ... });/SomeComponent/ folder content:
index.ts- should re-export component and used for imports, e.g.import { SomeComponent } from '~/shared/SomeComponent'types.ts- should contain types and interfaces used for component and it's child components (which should be placed in the same folder).functions.ts- same thing, but for functions.styles.module.scss- component styles.SomeComponent.tsx- component itself.SomeComponent.test.ts- file for component specs (if necessary)/AnotherComponent- folder for child component, used only as part ofSomeComponent
index.ts file:
export * from './SomeComponent';
export { User } from './types';types.ts file:
export type ButtonType = 'primary' | 'outlined' | 'error';
export type User = {
id: number;
name: string;
};SomeComponent.tsx file:
import React, { useState } from 'react';
import cn from 'classnames';
import { AnotherComponent } from './AnotherComponent';
import { ButtonType, User } from './types';
import s from './SomeComponent.module.scss';
interface ISomeComponentProps {
users: User[];
onSelectUser: (userId: number) => void;
onDelete: () => void;
type?: ButtonType;
className?: string;
disabled?: boolean;
}
export const SomeComponent: React.FC<ISomeComponentProps> = (props: ISomeComponentProps): JSX.Element => {
const { children, users, onSelectUser, className, type = 'primary', onDelete, disabled } = props;
const [count, setCount] = useState<number>(0);
return (
<>
{users.map((user: User) => (
<AnotherComponent
key={user.id}
username={user.name}
onClick={() => onSelectUser(user.id)}
/>
))}
{/* Some code */}
<button onClick={onDelete} className={cn(s.button, { [s.disabled]: disabled }, className)}>
{children}
</button>
</>
);
};Describes only core files and folders assuming that project uses routing.
/src/ folder content:
index.tsxindex.css / index.scssApp.tsxApp.module.scss\_variables.scss- use for global variables\_general.scss- use for global classestypes.ts- use for global types and interfacesconst.ts- use for global constantsfunctions.ts- use for reusable functions. Always comment all functions. In case of unexpected growth we prefer to create folder instead and separate functions to multiple files.pages- use for components responsible for app pages.shared- use for shared components.redux- use for redux related files.services- use for services.assets/svg- use forsvgfiles.
🚧 Content is under development.