You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// badclassListingextendsReact.Component{render(){return<div>{this.props.hello}</div>;}}// bad (relying on function name inference is discouraged)constListing=({ hello })=>(<div>{hello}</div>);// goodfunctionListing({ hello }){return<div>{hello}</div>;}
```jsx
// bad
React.createClass({
_onClickSubmit() {
// do stuff
},
// other stuff
});
// good
class extends React.Component {
onClickSubmit() {
// do stuff
}
// other stuff
}
```
Airbnb React/JSX 编码规范
算是最合理的React/JSX编码规范之一了
内容目录
Basic Rules 基本规范
react/no-multi-comp
.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
如果你的模块没有状态或是没有引用
refs
, 推荐使用普通函数(非箭头函数)而不是类:Naming 命名
扩展名: React模块使用
.jsx
扩展名.文件名: 文件名使用驼峰式. 如,
ReservationCard.jsx
.引用命名: React模块名使用驼峰式命名,实例使用骆驼式命名. eslint:
react/jsx-pascal-case
模块命名: 模块使用当前文件名一样的名称. 比如
ReservationCard.jsx
应该包含名为ReservationCard
的模块. 但是,如果整个文件夹是一个模块,使用index.js
作为入口文件,然后直接使用index.js
或者文件夹名作为模块的名称:高阶模块命名: 对于生成一个新的模块,其中的模块名
displayName
应该为高阶模块名和传入模块名的组合. 例如, 高阶模块withFoo()
, 当传入一个Bar
模块的时候, 生成的模块名displayName
应该为withFoo(Bar)
.Declaration 声明模块
不要使用
displayName
来命名React模块,而是使用引用来命名模块, 如 class 名称.Alignment 代码对齐
遵循以下的JSX语法缩进/格式. eslint:
react/jsx-closing-bracket-location
Quotes 单引号还是双引号
"
), 其他均使用单引号. eslint:jsx-quotes
Spacing 空格
总是在自动关闭的标签前加一个空格,正常情况下也不需要换行. eslint:
no-multi-spaces
,react/jsx-space-before-closing
不要在JSX
{}
引用括号里两边加空格. eslint:react/jsx-curly-spacing
Props 属性
JSX属性名使用骆驼式风格
camelCase
.如果属性值为
true
, 可以直接省略. eslint:react/jsx-boolean-value
<img>
标签总是添加alt
属性. 如果图片以presentation(感觉是以类似PPT方式显示?)方式显示,alt
可为空, 或者<img>
要包含role="presentation"
. eslint:jsx-a11y/img-has-alt
不要在
alt
值里使用如 "image", "photo", or "picture"包括图片含义这样的词, 中文也一样. eslint:jsx-a11y/img-redundant-alt
使用有效正确的 aria
role
属性值 ARIA roles. eslint:jsx-a11y/aria-role
不要在标签上使用
accessKey
属性. eslint:jsx-a11y/no-access-key
key
的值,推荐使用唯一ID. (为什么?)Refs
总是在Refs里使用回调函数. eslint:
react/no-string-refs
Parentheses 括号
将多行的JSX标签写在
()
里. eslint:react/wrap-multilines
Tags 标签
对于没有子元素的标签来说总是自己关闭标签. eslint:
react/self-closing-comp
如果模块有多行的属性, 关闭标签时新建一行. eslint:
react/jsx-closing-bracket-location
Methods 函数
使用箭头函数来获取本地变量.
当在
render()
里使用事件处理方法时,提前在构造函数里把this
绑定上去. eslint:react/jsx-no-bind
_
前缀,本质上它并不是私有的.在
render
方法中总是确保return
返回值. eslint:react/require-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()
renderNavigation()
或renderProfilePicture()
render
render() 方法如何定义
propTypes
,defaultProps
,contextTypes
, 等等其他属性...React.createClass
的生命周期函数,与使用class稍有不同: eslint:react/sort-comp
displayName
设定模块名称propTypes
设置属性的类型contextTypes
设置上下文类型childContextTypes
设置子元素上下文类型mixins
添加一些mixinsstatics
defaultProps
设置默认的属性值getDefaultProps
获取默认属性值getInitialState
或者初始状态getChildContext
componentWillMount
componentDidMount
componentWillReceiveProps
shouldComponentUpdate
componentWillUpdate
componentDidUpdate
componentWillUnmount
onClickSubmit()
oronChangeDescription()
render
likegetSelectReason()
orgetFooterContent()
renderNavigation()
orrenderProfilePicture()
render
isMounted
isMounted
. eslint:react/no-is-mounted
The text was updated successfully, but these errors were encountered: