摘要:來自于中文編碼規范編碼規范算是最合理的編碼規范之一了基本規范每個文件只寫一個模塊但是多個無狀態模塊可以放在單個文件中推薦使用語法不要使用,除非從一個非的文件中初始化你的創建模塊如果你的模塊有內部狀態或者是推薦使用而不是除非你有充足的理由
Airbnb React/JSX 編碼規范來自于Airbnb React/JSX 中文編碼規范
算是最合理的React/JSX編碼規范之一了
Basic Rules 基本規范
每個文件只寫一個模塊.
但是多個無狀態模塊可以放在單個文件中. eslint: react/no-multi-comp.
推薦使用JSX語法.
不要使用 React.createElement,除非從一個非JSX的文件中初始化你的app.
創建模塊Class vs React.createClass vs stateless
如果你的模塊有內部狀態或者是refs, 推薦使用 class extends React.Component 而不是 React.createClass ,除非你有充足的理由來使用這些方法.
eslint: react/prefer-es6-class react/prefer-stateless-function
// bad const Listing = React.createClass({ // ... render() { return{this.state.hello}; } }); // good class Listing extends React.Component { // ... render() { return{this.state.hello}; } }
如果你的模塊沒有狀態或是沒有引用`refs`, 推薦使用普通函數(非箭頭函數)而不是類:
// bad class Listing extends React.Component { render() { returnNaming 命名{this.props.hello}; } } // bad (relying on function name inference is discouraged) const Listing = ({ hello }) => ({hello}); // good function Listing({ hello }) { return{hello}; }
擴展名: React模塊使用 .jsx 擴展名.
?- 文件名: 文件名使用帕斯卡命名. 如, ReservationCard.jsx.
?- 引用命名: React模塊名使用帕斯卡命名,實例使用駱駝式命名. eslint: react/jsx-pascal-case
// bad import reservationCard from "./ReservationCard"; // good import ReservationCard from "./ReservationCard"; // bad const ReservationItem =; // good const reservationItem = ;
模塊命名: 模塊使用當前文件名一樣的名稱. 比如 ReservationCard.jsx 應該包含名為 ReservationCard的模塊. 但是,如果整個文件夾是一個模塊,使用 index.js作為入口文件,然后直接使用 index.js 或者文件夾名作為模塊的名稱:
// bad import Footer from "./Footer/Footer"; // bad import Footer from "./Footer/index"; // good import Footer from "./Footer";
高階模塊命名: 對于生成一個新的模塊,其中的模塊名 displayName 應該為高階模塊名和傳入模塊名的組合. 例如, 高階模塊 withFoo(), 當傳入一個 Bar 模塊的時候, 生成的模塊名 displayName 應該為 withFoo(Bar).
為什么?一個模塊的 displayName 可能會在開發者工具或者錯誤信息中使用到,因此有一個能清楚的表達這層關系的值能幫助我們更好的理解模塊發生了什么,更好的Debug.
// bad export default function withFoo(WrappedComponent) { return function WithFoo(props) { return; } } // good export default function withFoo(WrappedComponent) { function WithFoo(props) { return ; } const wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || "Component"; WithFoo.displayName = `withFoo(${wrappedComponentName})`; return WithFoo; }
屬性命名: 避免使用DOM相關的屬性來用作其他的用途。
為什么?對于style 和 className這樣的屬性名,我們都會默認它們代表一些特殊的含義,如元素的樣式,CSS class的名稱。在你的應用中使用這些屬性來表示其他的含義會使你的代碼更難閱讀,更難維護,并且可能會引起bug。
// badDeclaration 聲明模塊// good
不要使用 displayName 來命名React模塊,而是使用引用來命名模塊, 如 class 名稱.
// bad export default React.createClass({ displayName: "ReservationCard", // stuff goes here }); // good export default class ReservationCard extends React.Component { }Alignment 代碼對齊
遵循以下的JSX語法縮進/格式. eslint: react/jsx-closing-bracket-location
// badQuotes 單引號還是雙引號// good, 有多行屬性的話, 新建一行關閉標簽 // 若能在一行中顯示, 直接寫成一行 // 子元素按照常規方式縮進
對于JSX屬性值總是使用雙引號("), 其他均使用單引號("). eslint: jsx-quotes
為什么? HTML屬性也是用雙引號, 因此JSX的屬性也遵循此約定.
// badSpacing 空格// good // bad // good
總是在自動關閉的標簽前加一個空格,正常情況下也不需要換行. eslint: no-multi-spaces, react/jsx-space-before-closing
// bad// very bad // bad // good
不要在JSX {} 引用括號里兩邊加空格. eslint: react/jsx-curly-spacing
// badProps 屬性// good
JSX屬性名使用駱駝式風格camelCase.
// bad// good
如果屬性值為 true, 可以直接省略. eslint: react/jsx-boolean-value
// bad// good
// good // good // good
不要在 alt 值里使用如 "image", "photo", or "picture"包括圖片含義這樣的詞, 中文也一樣. eslint: jsx-a11y/img-redundant-alt
為什么? 屏幕助讀器已經把 img 標簽標注為圖片了, 所以沒有必要再在 alt 里說明了.
// bad // good
使用有效正確的 aria role屬性值 ARIA roles. eslint: jsx-a11y/aria-role
// bad - not an ARIA role // bad - abstract ARIA role // good
不要在標簽上使用 accessKey 屬性. eslint: jsx-a11y/no-access-key
為什么? 屏幕助讀器在鍵盤快捷鍵與鍵盤命令時造成的不統一性會導致閱讀性更加復雜.
// bad // good
避免使用數組的index來作為屬性key的值,推薦使用唯一ID. (為什么?)
// bad {todos.map((todo, index) =>)} // good {todos.map(todo => ( ))}
對于所有非必須的屬性,總是手動去定義defaultProps屬性.
為什么? propTypes 可以作為模塊的文檔說明, 并且聲明 defaultProps 的話意味著閱讀代碼的人不需要去假設一些默認值。更重要的是, 顯示的聲明默認屬性可以讓你的模塊跳過屬性類型的檢查.
// bad function SFC({ foo, bar, children }) { returnRefs{foo}{bar}{children}; } SFC.propTypes = { foo: PropTypes.number.isRequired, bar: PropTypes.string, children: PropTypes.node, }; // good function SFC({ foo, bar }) { return{foo}{bar}; } SFC.propTypes = { foo: PropTypes.number.isRequired, bar: PropTypes.string, }; SFC.defaultProps = { bar: "", children: null, };
總是在Refs里使用回調函數. eslint: react/no-string-refs
// badParentheses 括號// good { this.myRef = ref; }} />
將多行的JSX標簽寫在 ()里. eslint: react/wrap-multilines
// bad render() { returnTags 標簽; } // good render() { return ( ); } // good, 單行可以不需要 render() { const body = hello; return{body} ; }
對于沒有子元素的標簽來說總是自己關閉標簽. eslint: react/self-closing-comp
// bad// good
如果模塊有多行的屬性, 關閉標簽時新建一行. eslint: react/jsx-closing-bracket-location
// badMethods 函數// good
使用箭頭函數來獲取本地變量.
function ItemList(props) { return (
當在 render() 里使用事件處理方法時,提前在構造函數里把 this 綁定上去. eslint: react/jsx-no-bind
為什么? 在每次 render 過程中, 再調用 bind 都會新建一個新的函數,浪費資源.
// bad class extends React.Component { onClickDiv() { // do stuff } render() { return } } // good class extends React.Component { constructor(props) { super(props); this.onClickDiv = this.onClickDiv.bind(this); } onClickDiv() { // do stuff } render() { return } }
在React模塊中,不要給所謂的私有函數添加 _ 前綴,本質上它并不是私有的.
為什么?_ 下劃線前綴在某些語言中通常被用來表示私有變量或者函數。但是不像其他的一些語言,在JS中沒有原生支持所謂的私有變量,所有的變量函數都是共有的。盡管你的意圖是使它私有化,在之前加上下劃線并不會使這些變量私有化,并且所有的屬性(包括有下劃線前綴及沒有前綴的)都應該被視為是共有的。了解更多詳情請查看Issue #1024, 和 #490 。
// bad React.createClass({ _onClickSubmit() { // do stuff }, // other stuff }); // good class extends React.Component { onClickSubmit() { // do stuff } // other stuff }
在 render 方法中總是確保 return 返回值. eslint: react/require-render-return
// bad render() { (); } // good render() { return (); }Ordering React 模塊生命周期
class extends React.Component 的生命周期函數:
可選的 static 方法
constructor 構造函數
getChildContext 獲取子元素內容
componentWillMount 模塊渲染前
componentDidMount 模塊渲染后
componentWillReceiveProps 模塊將接受新的數據
shouldComponentUpdate 判斷模塊需不需要重新渲染
componentWillUpdate 上面的方法返回 true, 模塊將重新渲染
componentDidUpdate 模塊渲染結束
componentWillUnmount 模塊將從DOM中清除, 做一些清理任務
點擊回調或者事件處理器 如 onClickSubmit() 或 onChangeDescription()
render 里的 getter 方法 如 getSelectReason() 或 getFooterContent()
可選的 render 方法 如 renderNavigation() 或 renderProfilePicture()
render render() 方法
如何定義 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 {this.props.text} } } Link.propTypes = propTypes; Link.defaultProps = defaultProps; export default Link;
React.createClass 的生命周期函數,與使用class稍有不同: eslint: react/sort-comp
displayName 設定模塊名稱
propTypes 設置屬性的類型
contextTypes 設置上下文類型
childContextTypes 設置子元素上下文類型
mixins 添加一些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
isMounted不要再使用 isMounted. eslint: react/no-is-mounted
為什么? isMounted 反人類設計模式:(), 在 ES6 classes 中無法使用, 官方將在未來的版本里刪除此方法.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86864.html
摘要:編碼規范是獨角獸公司內部的編碼規范,該項目是上很受歡迎的一個開源項目,在前端開發中使用廣泛,本文的配置規則就是以編碼規范和編碼規范作為基礎的。 更新時間:2019-01-22React.js create-react-app 項目 + VSCode 編輯器 + ESLint 代碼檢查工具 + Airbnb 編碼規范 前言 為什么要使用 ESLint 在項目開發過程中,編寫符合團隊編碼規...
摘要:前言人是很懶惰的,你剛開始建立的一個規規整整的項目,可能一段時間過后,就回被你無數次的提交代碼弄得凌亂不堪。 前言 人是很懶惰的,你剛開始建立的一個規規整整的項目,可能一段時間過后,就回被你無數次的提交代碼弄得凌亂不堪。就算你能保證你的編碼風格嚴謹統一,別人又該如何,每個人都有不一樣的編碼風格,要保持統一,就要對項目進行適當的管理 正文 接下來介紹個React項目簡單管理的一個實踐: ...
摘要:是一個代碼靜態檢查工具,可以檢查的語法錯誤,提示潛在的,可以有效提高代碼質量。維持前端團隊高度一致的編碼風格。 ESLint是一個JavaScript代碼靜態檢查工具,可以檢查JavaScript的語法錯誤,提示潛在的bug,可以有效提高代碼質量。維持前端團隊高度一致的編碼風格。ESLint不但提供一些默認的規則,也提供用戶自定義規則來約束所寫的JavaScript代碼。 詳細的可以參...
摘要:有很強的自定義功能,插件庫很龐大,針對新語言插件更新很快,配合使用可以快速搭建適配語言的開發環境。該命令依賴于包。源目錄路徑輸出路徑把所有東西放入緩存中,每次只編譯修改過的文件發生錯誤時不會中斷的流程,同時觸發消息提示在命令行中輸入運行。 Sublime有很強的自定義功能,插件庫很龐大,針對新語言插件更新很快,配合使用可以快速搭建適配語言的開發環境。 1. babel-sublime ...
閱讀 914·2019-08-30 15:54
閱讀 1474·2019-08-30 15:54
閱讀 2405·2019-08-29 16:25
閱讀 1298·2019-08-29 15:24
閱讀 755·2019-08-29 12:11
閱讀 2513·2019-08-26 10:43
閱讀 1233·2019-08-26 10:40
閱讀 473·2019-08-23 16:24