AI Skill Report Card
Applying React JSX Style Guide
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. ---
Quick Start14 / 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
Workflow15 / 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}notbar={ 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, nevercreateReactClass - Prefer function components when no internal state/refs needed
- Never use
thisinside function components render()must alwaysreturnJSX — never omitreturn- Never use return value of
ReactDOM.render()
Step 3: Lifecycle & method safety
- Never use deprecated/UNSAFE lifecycle methods:
componentWillMount,componentWillReceiveProps,componentWillUpdate- Replace
componentWillMount→constructororcomponentDidMount - Replace
componentWillReceiveProps→componentDidUpdateorgetDerivedStateFromProps - Replace
componentWillUpdate→componentDidUpdateorgetSnapshotBeforeUpdate
- Replace
- Never call
setStateinsidecomponentWillUpdate(or any will-update-like flow) - Never use
findDOMNode— userefcallbacks instead - Never use
shouldComponentUpdateon a class extendingReact.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, notUserNameoruser_name) - Declare
propTypesfor every prop actually used; remove unused ones - Avoid vague types (
PropTypes.any,.array,.object) — preferarrayOf,shape, specific primitives - Set
defaultPropsfor 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
childrenexplicitly — use JSX nesting instead - Never duplicate a prop name on the same element
styleprop 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
keyif the list can reorder, insert, or delete
Step 6: Misc safety checks
- No
dangerouslySetInnerHTMLon 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
Examples18 / 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:
JavaScriptclass Btn extends React.Component { onClick() { console.log('clicked'); } render() { return <div onClick={this.onClick.bind(this)} />; } }
Output:
JavaScriptclass 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:
JavaScriptcomponentWillReceiveProps(nextProps) { this.setState({ name: nextProps.name }); }
Output:
JavaScriptstatic getDerivedStateFromProps(props, state) { if (props.name !== state.name) { return { name: props.name }; } return null; }
Example 4: Adding propTypes/defaultProps
Input:
JavaScriptfunction Greeting({ name }) { return <h1>Hello, {name}</h1>; }
Output:
JavaScriptfunction 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
Best Practices
- Configure ESLint with
eslint-plugin-reactrules 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-lifecycleson legacy codebases before manually converting lifecycle methods.
Common Pitfalls
- 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/arrayPropTypes "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/componentWillReceivePropsinto new code, even to match old files — flag them for migration instead. - Don't use
dangerouslySetInnerHTMLtogether with children on the same element — React will throw/warn. - Don't forget
defaultPropsfor optional props — undefined props cause silent bugs downstream.