React Components and JSX Syntax
1. Functional Components and Arrow Function Syntax
Pattern
Syntax
Description
Use Case
Function Declaration
function Comp() {}
Traditional function syntax for components
Named exports, hoisting needed
Arrow Function
const Comp = () => {}
Modern ES6 arrow function syntax
Preferred for most components
Implicit Return
const Comp = () => (<div/>)
Single expression return without braces
Simple, presentational components
Named Export
export function Comp() {}
Export component directly
Multiple exports per file
Default Export
export default Comp
Single default export per file
One main component per file
Example: Component declaration patterns
// Function declaration
function Welcome () {
return < h1 >Hello</ h1 >;
}
// Arrow function with explicit return
const Greeting = () => {
return < h1 >Hi there</ h1 >;
};
// Arrow function with implicit return
const SimpleComp = () => (< div >Simple</ div >);
// With props destructuring
const User = ({ name , age }) => (
< div >{name}, {age}</ div >
);
2. JSX Elements and Expression Embedding
Feature
Syntax
Description
Example
JSX Element
<div>content</div>
HTML-like syntax in JavaScript
<h1>Title</h1>
Self-closing Tag
<Component />
Elements without children must self-close
<img src="..." />
Expression Embedding
{expression}
Execute JavaScript inside JSX
{2 + 2}
Attribute Expression
attr={value}
Dynamic attribute values
className={style}
String Literal
attr="value"
Static string attributes
type="text"
CamelCase Props
className, onClick
HTML attributes use camelCase in JSX
tabIndex, htmlFor
Comments in JSX
{/* comment */}
JavaScript-style comments in curly braces
{/* Note */}
Example: JSX expressions and embedding
const UserCard = ({ user , isOnline }) => {
const greeting = 'Welcome' ;
return (
< div className = "card" >
{ /* Dynamic content */ }
< h2 >{greeting}, {user.name}!</ h2 >
{ /* Expressions */ }
< p >Age: {user.age * 2 }</ p >
{ /* Method calls */ }
< p >{user.email. toLowerCase ()}</ p >
{ /* Dynamic attributes */ }
< img src = {user.avatar} alt = {user.name} />
< span className = {isOnline ? 'active' : 'inactive' }>
{isOnline ? 'Online' : 'Offline' }
</ span >
</ div >
);
};
Note: JSX is syntactic sugar for React.createElement(). All JSX is transformed to
JavaScript function calls during compilation.
3. Component Props and Destructuring Patterns
Pattern
Syntax
Description
Use Case
Props Object
function Comp(props) {}
Access props via object
When passing all props down
Destructuring
({ name, age }) => {}
Extract props directly in parameters
Most common pattern
Default Values
({ name = 'Guest' }) => {}
Provide fallback values
Optional props with defaults
Rest Props
({ name, ...rest }) => {}
Collect remaining props
Forwarding props to children
Nested Destructuring
({ user: { name } }) => {}
Extract nested object properties
Complex prop structures
Prop Spreading
<Comp {...props} />
Pass all props to child
Wrapper components
Example: Props destructuring patterns
// Basic destructuring with defaults
const Button = ({
text = 'Click' ,
onClick,
disabled = false
}) => (
< button onClick = {onClick} disabled = {disabled}>
{text}
</ button >
);
// Rest props and spreading
const Input = ({ label , ... inputProps }) => (
< div >
< label >{label}</ label >
< input { ... inputProps} />
</ div >
);
// Nested destructuring
const UserProfile = ({
user: { name, email, address: { city } }
}) => (
< div >
< h2 >{name}</ h2 >
< p >{email}</ p >
< p >City: {city}</ p >
</ div >
);
// Usage with explicit props
< Input label = "Email" type = "email" placeholder = "Enter email" />
4. Children Prop and Component Composition
Concept
Syntax
Description
Use Case
Children Prop
props.children
Content passed between component tags
Wrapper/container components
Children Destructuring
({ children }) => {}
Extract children directly
Cleaner component code
Multiple Children
<Comp>{child1}{child2}</Comp>
Pass multiple elements as children
Complex layouts
Render Props
children(data)
Children as function pattern
Share logic/data with children
Named Slots
header, footer props
Multiple named content areas
Flexible layouts
Composition
<A><B><C /></B></A>
Nest components for hierarchy
Building complex UIs
Example: Children and composition patterns
// Simple children wrapper
const Card = ({ children , title }) => (
< div className = "card" >
< h3 >{title}</ h3 >
< div className = "card-body" >{children}</ div >
</ div >
);
// Render props pattern
const DataProvider = ({ children , data }) => (
< div >{ children (data)}</ div >
);
// Usage
< DataProvider data = {users}>
{( users ) => (
< ul >
{users. map ( u => < li key = {u.id}>{u.name}</ li >)}
</ ul >
)}
</ DataProvider >
// Named slots pattern
const Layout = ({ header , children , footer }) => (
< div >
< header >{header}</ header >
< main >{children}</ main >
< footer >{footer}</ footer >
</ div >
);
// Composition
< Layout
header = {< Nav />}
footer = {< Footer />}
>
< Card title = "Welcome" >
< p >Content here</ p >
</ Card >
</ Layout >
5. JSX Conditional Rendering Patterns
Pattern
Syntax
Description
Use Case
Ternary Operator
{condition ? <A/> : <B/>}
Inline if-else rendering
Two-way conditional rendering
Logical AND (&&)
{condition && <Component/>}
Render if condition is truthy
Optional content display
Logical OR (||)
{value || 'default'}
Fallback value if falsy
Default content
Nullish Coalescing
{value ?? 'default'}
Fallback only for null/undefined
Preserve falsy values (0, '')
Early Return
if (!data) return null
Guard clause before JSX
Loading/error states
IIFE Pattern
{(() => {})()}
Complex logic in JSX
Multi-statement conditionals
Element Variables
let el; if (...) el = ...
Store JSX in variables
Complex conditional logic
Example: Conditional rendering techniques
const UserStatus = ({ user , isLoading , error }) => {
// Early return for loading
if (isLoading) return < Spinner />;
// Early return for error
if (error) return < Error message = {error} />;
// Early return for no data
if ( ! user) return null ;
return (
< div >
{ /* Ternary operator */ }
{user.isPremium ? (
< PremiumBadge />
) : (
< FreeBadge />
)}
{ /* Logical AND */ }
{user.notifications && (
< NotificationBadge count = {user.notifications} />
)}
{ /* Nullish coalescing */ }
< p >Score: {user.score ?? 0 }</ p >
{ /* Multiple conditions with element variable */ }
{(() => {
if (user.role === 'admin' ) return < AdminPanel />;
if (user.role === 'moderator' ) return < ModPanel />;
return < UserPanel />;
})()}
</ div >
);
};
// Element variable pattern
const StatusDisplay = ({ status }) => {
let statusElement;
switch (status) {
case 'success' :
statusElement = < SuccessIcon />;
break ;
case 'error' :
statusElement = < ErrorIcon />;
break ;
default :
statusElement = < InfoIcon />;
}
return < div >{statusElement}</ div >;
};
Warning: Avoid using && with numbers like
{count && <Text/>} - if count is 0, it renders "0". Use
{count > 0 && <Text/>} or {!!count && <Text/>} instead.
6. JSX Fragment Syntax and React.Fragment
Syntax
Usage
Description
Use Case
Short Syntax
<>...</>
Empty tag fragment shorthand
Group elements without wrapper
Explicit Fragment
<React.Fragment>
Full fragment component
When key prop is needed
Fragment with Key
<Fragment key={id}>
Fragment in lists with key
Mapping multiple elements
Import Fragment
import { Fragment }
Named import from React
Cleaner than React.Fragment
Example: Fragment usage patterns
import { Fragment } from 'react' ;
// Short syntax - most common
const UserInfo = () => (
<>
< h1 >User Profile</ h1 >
< p >Details</ p >
</>
);
// With key prop (required in lists)
const GlossaryList = ({ items }) => (
< dl >
{items. map ( item => (
< Fragment key = {item.id}>
< dt >{item.term}</ dt >
< dd >{item.description}</ dd >
</ Fragment >
))}
</ dl >
);
// Avoiding unnecessary divs
const Table = () => (
< table >
< tbody >
{data. map ( row => (
<>
< tr key = {row.id}>
< td >{row.name}</ td >
</ tr >
{row.details && (
< tr >
< td colSpan = "2" >{row.details}</ td >
</ tr >
)}
</>
))}
</ tbody >
</ table >
);
// Conditional multiple elements
const Form = ({ showHelp }) => (
< form >
< input type = "text" />
{showHelp && (
<>
< p >Help text</ p >
< button >Learn More</ button >
</>
)}
</ form >
);
Note: Fragments don't create extra DOM nodes, improving performance and maintaining semantic
HTML. Use <></> when no props needed, <Fragment key={...}> when mapping with keys.