Airbnb React/JSX Style Guide
A mostly reasonable approach to React and JSX
Table of Contents
Basic Rules
- Only include one React component per file.
- Always use JSX syntax.
- Do not use
React.createElementunless you're initializing the app from a.jsfile.
Naming
-
Extensions: Use
.jsxextension for React components. -
Filename: Use PascalCase for filenames. E.g.,
ReservationCard.jsx. -
Reference Naming: Use PascalCase for React components and camelCase for their instances:
// bad const reservationCard = require('./ReservationCard'); // good const ReservationCard = require('./ReservationCard'); // bad const ReservationItem = <ReservationCard />; // good const reservationItem = <ReservationCard />;Component Naming: Use the filename as the component name. So
ReservationCard.jsxshould have a reference name of ReservationCard. However, for root components of a directory, use index.jsx as the filename and use the directory name as the component name:// bad const Footer = require('./Footer/Footer.jsx') // bad const Footer = require('./Footer/index.jsx') // good const Footer = require('./Footer')
Declaration
-
Do not use displayName for naming components, instead name the component by reference.
// bad export default React.createClass({ displayName: 'ReservationCard', // stuff goes here }); // good const ReservationCard = React.createClass({ // stuff goes here }); export default ReservationCard;
Alignment
-
Follow these alignment styles for JSX syntax
// bad <Foo bar="bar" baz="baz" /> // good <Foo bar="bar" baz="baz" /> // if props fit in one line then keep it on the same line <Foo bar="bar" /> // children get indented normally <Foo bar="bar" baz="baz" > <Spazz /> </Foo>
Quotes
- Always use double quotes (
") for JSX attributes, but single quotes for all other JavaScript.// bad <Foo bar='bar' /> // good <Foo bar="bar" /> // bad <Foo style={{ left: "20px" }} /> // good <Foo style={{ left: '20px' }} />
Spacing
- Always include a single space in your self-closing tag.
// bad <Foo/> // very bad <Foo /> // bad <Foo /> // good <Foo />
Props
- Alphabetically order your props.
// bad <Foo className="bar baz" bar="bar" /> // good <Foo bar="bar" className="bar baz" />
Parentheses
- Wrap JSX tags in parentheses when they span more than one line:
/// bad render() { return <MyComponent className="long body" foo="bar" > <MyChild /> </MyComponent>; } // good render() { return ( <MyComponent className="long body" foo="bar"> <MyChild /> </MyComponent> ); } // good, when single line render() { const body = <div>hello</div>; return <MyComponent>{body}</MyComponent>; }
Tags
-
Always self-close tags that have no children.
// bad <Foo className="stuff"></Foo> // good <Foo className="stuff" /> -
If your component has multi-line properties, close its tag on a new line.
// bad <Foo bar="bar" baz="baz" /> // good <Foo bar="bar" baz="baz" />
Ordering
- Always follow the following order for methods in a react component:
- displayName
- mixins (as of React v0.13 mixins are deprecated)
- statics
- propTypes
- getDefaultProps
- getInitialState
- componentWillMount
- componentDidMount
- componentWillReceiveProps
- shouldComponentUpdate
- componentWillUpdate
- componentWillUnmount
- clickHandlers or eventHandlers like onClickSubmit() or onChangeDescription()
- gettter methods for render like getSelectReason() or getFooterContent()
- Optional render methods like renderNavigation() or renderProfilePicture()
- render