| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
A mostly reasonable approach to React and JSX
eslint rules: react/prefer-es6-class.
```javascript
// bad
const Listing = React.createClass({
// ...
render() {
return <div>{this.state.hello}</div>;
}
});
// good
class Listing extends React.Component {
// ...
render() {
return <div>{this.state.hello}</div>;
}
}
```
And if you don't have state or refs, prefer functions over classes:
```javascript
// bad
class Listing extends React.Component {
render() {
return <div>{this.props.hello}</div>;
}
}
// good
function Listing({ hello }) {
return <div>{hello}</div>;
}
```
eslint rules: react/jsx-pascal-case.
```javascript // bad import reservationCard from './ReservationCard'; // good import ReservationCard from './ReservationCard'; // bad const ReservationItem = <ReservationCard />; // good const reservationItem = <ReservationCard />; ```
Component Naming: Use the filename as the component name. For example, ReservationCard.jsx should 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
import Footer from './Footer/Footer';
// bad
import Footer from './Footer/index';
// good
import Footer from './Footer';Do not use displayName for naming components. Instead, name the component by reference.
// bad
export default React.createClass({
displayName: 'ReservationCard',
// stuff goes here
});
// good
export default class ReservationCard extends React.Component {
}eslint rules: react/jsx-closing-bracket-location.
```javascript
// bad
<Foo superLongParam="bar"
anotherSuperLongParam="baz" />
// good
<Foo
superLongParam="bar"
anotherSuperLongParam="baz"
/>
// if props fit in one line then keep it on the same line
<Foo bar="bar" />
// children get indented normally
<Foo
superLongParam="bar"
anotherSuperLongParam="baz"
>
<Spazz />
</Foo>
```
Why? JSX attributes can't contain escaped quotes, so double quotes make conjunctions like "don't" easier to type. Regular HTML attributes also typically use double quotes instead of single, so JSX attributes mirror this convention.
eslint rules: jsx-quotes.
```javascript
// bad
<Foo bar='bar' />
// good
<Foo bar="bar" />
// bad
<Foo style={{ left: "20px" }} />
// good
<Foo style={{ 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
<Foo
UserName="hello"
phone_number={12345678}
/>
// good
<Foo
userName="hello"
phoneNumber={12345678}
/>Omit the value of the prop when it is explicitly true.
eslint rules: react/jsx-boolean-value.
```javascript
// bad
<Foo
hidden={true}
/>
// good
<Foo
hidden
/>
```
eslint rules: react/wrap-multilines.
```javascript
// 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>;
}
```
eslint rules: react/self-closing-comp.
```javascript // bad <Foo className="stuff"></Foo> // good <Foo className="stuff" /> ```
eslint rules: react/jsx-closing-bracket-location.
```javascript // bad <Foo bar="bar" baz="baz" /> // good <Foo bar="bar" baz="baz" /> ```
Why? A bind call in the render path creates a brand new function on every single render.
eslint rules: react/jsx-no-bind.
```javascript
// bad
class extends React.Component {
onClickDiv() {
// do stuff
}
render() {
return <div onClick={this.onClickDiv.bind(this)} />
}
}
// good
class extends React.Component {
constructor(props) {
super(props);
this.onClickDiv = this.onClickDiv.bind(this);
}
onClickDiv() {
// do stuff
}
render() {
return <div onClick={this.onClickDiv} />
}
}
```
Do not use underscore prefix for internal methods of a React component.
// bad
React.createClass({
_onClickSubmit() {
// do stuff
},
// other stuff
});
// good
class extends React.Component {
onClickSubmit() {
// do stuff
}
// other stuff
}How to define propTypes, defaultProps, contextTypes, etc...
import React, { PropTypes } from 'react';
const propTypes = {
id: PropTypes.number.isRequired,
url: PropTypes.string.isRequired,
text: PropTypes.string,
};
const defaultProps = {
text: 'Hello World',
};
class Link extends React.Component {
static methodsAreOk() {
return true;
}
render() {
return <a href={this.props.url} data-id={this.props.id}>{this.props.text}</a>
}
}
Link.propTypes = propTypes;
Link.defaultProps = defaultProps;
export default Link;Ordering for React.createClass:
eslint rules: react/sort-comp.
Why? isMounted is an anti-pattern, is not available when using ES6 classes, and is on its way to being officially deprecated.
eslint rules: react/no-is-mounted.
| Back | FazBrowse Home | New Git URL |