A mostly reasonable approach to React and JSX
- Only include one React component per file.
- Always use JSX syntax.
- Do not use
React.createElementunless you're initializing the app from a file that is not JSX.
- Use class extends React.Component unless you have a very good reason to use mixins.
// badconstListing=React.createClass({render(){return<div/>;}});// goodclassListingextendsReact.Component{render(){return<div/>;}}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:
// badconstreservationCard=require('./ReservationCard');// goodconstReservationCard=require('./ReservationCard');// badconstReservationItem=<ReservationCard/>;// goodconstreservationItem=<ReservationCard/>;
Component Naming: Use the filename as the component name. For example,
ReservationCard.jsxshould have a reference name ofReservationCard. However, for root components of a directory, useindex.jsxas the filename and use the directory name as the component name:// badconstFooter=require('./Footer/Footer.jsx')// badconstFooter=require('./Footer/index.jsx')// goodconstFooter=require('./Footer')
Do not use displayName for naming components. Instead, name the component by reference.
// badexportdefaultReact.createClass({displayName: 'ReservationCard',// stuff goes here});// goodclassReservationCardextendsReact.Component{}exportdefaultReservationCard;
Follow these alignment styles for JSX syntax
// bad<FoosuperLongParam="bar"anotherSuperLongParam="baz"/>// good<FoosuperLongParam="bar"anotherSuperLongParam="baz"/>// if props fit in one line then keep it on the same line<Foobar="bar"/>// children get indented normally<FoosuperLongParam="bar"anotherSuperLongParam="baz"><Spazz/></Foo>
- Always use double quotes (
") for JSX attributes, but single quotes for all other JS.// bad<Foobar='bar'/>// good<Foobar="bar"/>// bad<Foostyle={{left: "20px"}}/>// good<Foostyle={{left: '20px'}}/>
- Always include a single space in your self-closing tag.
// bad<Foo/>// very bad<Foo/>// bad<Foo/>// good<Foo/>
- Always use camelCase for prop names.
// bad<FooUserName="hello"phone_number={12345678}/>// good<FoouserName="hello"phoneNumber={12345678}/>
- Wrap JSX tags in parentheses when they span more than one line:
/// badrender(){return<MyComponentclassName="long body"foo="bar"><MyChild/></MyComponent>;}// goodrender(){return(<MyComponentclassName="long body"foo="bar"><MyChild/></MyComponent>);}// good, when single linerender(){constbody=<div>hello</div>;return<MyComponent>{body}</MyComponent>;}
Always self-close tags that have no children.
// bad<FooclassName="stuff"></Foo>// good<FooclassName="stuff"/>
If your component has multi-line properties, close its tag on a new line.
// bad<Foobar="bar"baz="baz"/>// good<Foobar="bar"baz="baz"/>
- Do not use underscore prefix for internal methods of a React component.
// badReact.createClass({_onClickSubmit(){// do stuff}// other stuff});// goodclassextendsReact.Component{onClickSubmit(){// do stuff}// other stuff});
- Ordering for class extends React.Component:
- constructor
- optional static methods
- getChildContext
- componentWillMount
- componentDidMount
- componentWillReceiveProps
- shouldComponentUpdate
- componentWillUpdate
- componentDidUpdate
- componentWillUnmount
- clickHandlers or eventHandlers like onClickSubmit() or onChangeDescription()
- getter methods for render like getSelectReason() or getFooterContent()
- Optional render methods like renderNavigation() or renderProfilePicture()
- render
- How to define propTypes, defaultProps, contextTypes, etc...
importReact,{Component,PropTypes}from'react';constpropTypes={id: PropTypes.number.isRequired,url: PropTypes.string.isRequired,text: PropTypes.string,};constdefaultProps={text: 'Hello World',};classLinkextendsComponent{staticmethodsAreOk(){returntrue;}render(){return<ahref={this.props.url}data-id={this.props.id}>{this.props.text}</a>}}Link.propTypes=propTypes;Link.defaultProps=defaultProps;exportdefaultLink;- Ordering for React.createClass:
- displayName
- propTypes
- contextTypes
- childContextTypes
- mixins
- statics
- defaultProps
- getDefaultProps
- getInitialState
- getChildContext
- componentWillMount
- componentDidMount
- componentWillReceiveProps
- shouldComponentUpdate
- componentWillUpdate
- componentDidUpdate
- componentWillUnmount
- clickHandlers or eventHandlers like onClickSubmit() or onChangeDescription()
- getter methods for render like getSelectReason() or getFooterContent()
- Optional render methods like renderNavigation() or renderProfilePicture()
- render