通常在團隊開發中每一個人的代碼習慣都不太同樣,這樣就會致使代碼風格不一致,以至於維護和修改bug的時候看別人的代碼成爲一種痛苦...
這種狀況尤爲在前端開發中尤其明顯。由於關於前端的開發規範貌似也沒有行業權威標準。這幾天在網上看了下,基本上在開發中經過eslint進行約束,airbnb的標準貌似頗爲推崇,今天稍微整理下,準備在往後開發中造成習慣。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>; } }
若是組件沒有擁有內部的state或者refs,那麼普通函數(不要使用箭頭函數)比類的寫法更好:前端
// bad class Listing extends React.Component { render() { return <div>{this.props.hello}</div>; } } // bad (由於箭頭函數沒有「name」屬性) const Listing = ({ hello }) => ( <div>{hello}</div> ); // good function Listing({ hello }) { return <div>{hello}</div>; }
// bad import reservationCard from './ReservationCard'; // good import ReservationCard from './ReservationCard'; // bad const ReservationItem = <ReservationCard />; // good const reservationItem = <ReservationCard />;
不要使用displayName
屬性來命名組件,應該使用類的引用名稱。java
// bad export default React.createClass({ displayName: 'ReservationCard', // stuff goes here }); // good export default class ReservationCard extends React.Component { }
爲JSX語法使用下列的對齊方式:eslint: react/jsx-closing-bracket-locationreact
// bad <Foo superLongParam="bar" anotherSuperLongParam="baz" /> // good <Foo superLongParam="bar" anotherSuperLongParam="baz" /> // 若是組件的屬性能夠放在一行就保持在當前一行中,(我的以爲若是隻有一個屬性就放在一行) <Foo bar="bar" /> // 多行屬性採用縮進 <Foo superLongParam="bar" anotherSuperLongParam="baz" > <Quux /> </Foo>
JSX的屬性都採用雙引號,其餘的JS都使用單引號:jsx-quotes。
爲何這樣作?JSX 屬性 不能包含轉義的引號, 因此當輸入"don't"這類的縮寫的時候用雙引號會更方便。es6
// bad <Foo bar='bar' /> // good <Foo bar="bar" /> // bad <Foo style={{ left: "20px" }} /> // good <Foo style={{ left: '20px' }} />
始終在自閉和標籤前添加一個空格。app
// bad <Foo/> // very bad <Foo /> // bad <Foo /> // good <Foo />
// bad <Foo UserName="hello" phone_number={12345678} /> // good <Foo userName="hello" phoneNumber={12345678} />
// bad <Foo hidden={true} /> // good <Foo hidden />
使用括號包裹多行JSX標籤,react/wrap-multilinesless
// 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>; }
// bad <Foo className="stuff"></Foo> // good <Foo className="stuff" />
// bad <Foo bar="bar" baz="baz" /> // good <Foo bar="bar" baz="baz" />
在 render 方法中事件的回調函數,應該在構造函數中進行bind綁定。 eslint: react/jsx-no-bind。
爲何這樣作? 在 render 方法中的 bind 調用每次調用 render 的時候都會建立一個全新的函數。函數
// 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} /> } }
// bad React.createClass({ _onClickSubmit() { // do stuff }, // other stuff }); // good class extends React.Component { onClickSubmit() { // do stuff } // other stuff }
class extends React.Component的順序:ui
可選的 render 方法 好比 renderNavigation() 或者 renderProfilePicture()this
怎麼定義propTypes, defaultProps, contextTypes等
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;
關於這個開發規範差很少就這樣吧,eslint的配置我的在研究下,下次再放出來