AI Skill Report Card

Applying React JSX Style Guide

A-88·Sep 20, 2026·Source: Extension-page
Markdown
--- name: applying-react-jsx-style-guide description: Applies Alibaba's React/JSX coding conventions (indentation, spacing, quotes, props, lifecycle methods, hooks-era best practices) when writing or reviewing React component code. Use when writing new React/JSX code, reviewing pull requests for React style violations, or configuring ESLint rules for a React codebase. ---
14 / 15

When writing or reviewing JSX, apply these defaults immediately:

JavaScript
// Correct baseline style class UserCard extends React.Component { render() { const { userName, phoneNumber } = this.props; return ( <div className="card"> <Avatar userName={userName} phoneNumber={phoneNumber} hidden /> </div> ); } } UserCard.propTypes = { userName: PropTypes.string.isRequired, phoneNumber: PropTypes.number, }; UserCard.defaultProps = { phoneNumber: 0, };

Key defaults: 2-space indent, double quotes in JSX, one space before />, destructure props/state, boolean props omit ={true}, wrap multiline JSX in parens, self-close empty elements.

Recommendation
Add an example showing a 'bad outcome' left unfixed to contrast with corrected ones more explicitly
15 / 15

When writing new React code or reviewing existing code, work through this checklist:

Progress:
- [ ] Formatting: indentation, spacing, quotes, self-closing tags
- [ ] Component structure: one component per file, ES6 class or function component
- [ ] Lifecycle: no deprecated/UNSAFE methods, no findDOMNode
- [ ] Props: camelCase, propTypes declared, defaultProps set, no unused props
- [ ] Keys: stable keys in lists, never array index if order can change
- [ ] Anti-patterns: no .bind() in JSX, no dangerouslySetInnerHTML misuse, no this in function components

Step 1: Formatting pass

  • Indent JSX with 2 spaces (never 4 or tabs)
  • One space before self-closing />, one space between attributes
  • No spaces inside { } for JSX expression containers: bar={baz} not bar={ baz }
  • No spaces around = in attributes: name={firstname}
  • Double quotes for JSX string attributes (bar="bar"); single quotes elsewhere in JS
  • Wrap multiline JSX return values in ( ... )
  • Self-close tags with no children: <Foo /> not <Foo></Foo>
  • Multiple attributes that wrap: each attribute on its own line, closing /> or > on new line aligned with opening tag

Step 2: Component structure

  • One React component per file (function components can be multiple)
  • Use class extends React.Component, never createReactClass
  • Prefer function components when no internal state/refs needed
  • Never use this inside function components
  • render() must always return JSX — never omit return
  • Never use return value of ReactDOM.render()

Step 3: Lifecycle & method safety

  • Never use deprecated/UNSAFE lifecycle methods: componentWillMount, componentWillReceiveProps, componentWillUpdate
    • Replace componentWillMountconstructor or componentDidMount
    • Replace componentWillReceivePropscomponentDidUpdate or getDerivedStateFromProps
    • Replace componentWillUpdatecomponentDidUpdate or getSnapshotBeforeUpdate
  • Never call setState inside componentWillUpdate (or any will-update-like flow)
  • Never use findDOMNode — use ref callbacks instead
  • Never use shouldComponentUpdate on a class extending React.PureComponent (redundant)
  • Never bind functions in JSX props (onClick={this.fn.bind(this)}) — bind in constructor or use class property arrow functions

Step 4: Props discipline

  • Prop names: camelCase (userName, not UserName or user_name)
  • Declare propTypes for every prop actually used; remove unused ones
  • Avoid vague types (PropTypes.any, .array, .object) — prefer arrayOf, shape, specific primitives
  • Set defaultProps for all non-required props; never set a default for a prop marked .isRequired
  • Destructure props/state instead of repeated this.props.x
  • Boolean prop set to true: omit the value — <Foo hidden /> not <Foo hidden={true} />
  • Never name a prop children explicitly — use JSX nesting instead
  • Never duplicate a prop name on the same element
  • style prop must be an object literal, never a string

Step 5: Lists and keys

  • Every list-rendered element needs a stable, unique key
  • Never use array index as key if the list can reorder, insert, or delete

Step 6: Misc safety checks

  • No dangerouslySetInnerHTML on an element that also has children
  • No children on void/self-closing HTML elements (img, br, hr)
  • No comment-like strings as JSX text nodes (//, /* */ as literal text)
  • Escape special characters in JSX text: >, ", ', } → use HTML entities or {'>'}
  • No unescaped/undeclared component references (import before use)
Recommendation
Include guidance on hooks-specific pitfalls (useEffect deps, stale closures) since description mentions hooks-era practices
18 / 20

Example 1: Fixing spacing and quotes

Input:

JavaScript
<Foo bar='baz' hidden={ true }/>

Output:

JavaScript
<Foo bar="baz" hidden />

Example 2: Refactoring bound event handler

Input:

JavaScript
class Btn extends React.Component { onClick() { console.log('clicked'); } render() { return <div onClick={this.onClick.bind(this)} />; } }

Output:

JavaScript
class Btn extends React.Component { constructor(props) { super(props); this.onClick = this.onClick.bind(this); } onClick() { console.log('clicked'); } render() { return <div onClick={this.onClick} />; } }

Example 3: Replacing deprecated lifecycle

Input:

JavaScript
componentWillReceiveProps(nextProps) { this.setState({ name: nextProps.name }); }

Output:

JavaScript
static getDerivedStateFromProps(props, state) { if (props.name !== state.name) { return { name: props.name }; } return null; }

Example 4: Adding propTypes/defaultProps

Input:

JavaScript
function Greeting({ name }) { return <h1>Hello, {name}</h1>; }

Output:

JavaScript
function Greeting({ name }) { return <h1>Hello, {name}</h1>; } Greeting.propTypes = { name: PropTypes.string, }; Greeting.defaultProps = { name: '', };
Recommendation
Consider trimming Best Practices/Pitfalls overlap with Workflow steps to tighten conciseness further
  • Configure ESLint with eslint-plugin-react rules referenced throughout (react/jsx-indent, react/no-deprecated, react/prop-types, etc.) rather than relying on manual review alone.
  • Prefer function components + hooks-friendly patterns for new code; use class-based rules above only for legacy/class components.
  • When a list's order is stable and items are never inserted/removed except at the end, index-as-key is acceptable — otherwise always use a domain ID.
  • Keep one component per file for discoverability; small helper function components in the same file are fine.
  • Run the codemod rename-unsafe-lifecycles on legacy codebases before manually converting lifecycle methods.
  • Don't use 4-space or tab indentation "because the rest of the file does" — JSX always follows 2-space convention here.
  • Don't leave any/object/array PropTypes "temporarily" — they erode type safety and rarely get fixed later.
  • Don't call .bind() or define arrow functions inline in JSX props for performance-sensitive lists — this creates a new function every render.
  • Don't mix componentWillUpdate/componentWillMount/componentWillReceiveProps into new code, even to match old files — flag them for migration instead.
  • Don't use dangerouslySetInnerHTML together with children on the same element — React will throw/warn.
  • Don't forget defaultProps for optional props — undefined props cause silent bugs downstream.
0
Grade A-AI Skill Framework
Scorecard
Criteria Breakdown
Quick Start
14/15
Workflow
15/15
Examples
18/20
Completeness
18/20
Format
15/15
Conciseness
14/15