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.