React Components and JSX Syntax

1. Functional Components and Arrow Functions

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 (curly braces)

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

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. Conditional Rendering Patterns (&&, ternary, if-else)

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 (<>, 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.