CẤU TRÚC THƯ MỤC VÀ CÁCH VIẾT COMPONENT CHUẨN TRONG REACT(P.3)
Refs Luôn sử dụng ref callbacks. eslint: react/no-string-refs // bad <Foo ref="myRef" /> // good <Foo ref={(ref) => { this.myRef = ref; }} /> Dấu ngoặc đơn Bao bọc các thẻ JSX trong dấu ngoặc đơn khi chúng dài hơn một dòng. eslint: react/jsx-wrap-multilines // ...
Refs
Luôn sử dụng ref callbacks. eslint: react/no-string-refs
// bad <Foo ref="myRef" /> // good <Foo ref={(ref) => { this.myRef = ref; }} />
Dấu ngoặc đơn
Bao bọc các thẻ JSX trong dấu ngoặc đơn khi chúng dài hơn một dòng. eslint: react/jsx-wrap-multilines
// bad render() { return <MyComponent variant="long body" foo="bar"> <MyChild /> </MyComponent>; } // good render() { return ( <MyComponent variant="long body" foo="bar"> <MyChild /> </MyComponent> ); } // good, when single line render() { const body = <div>hello</div>; return <MyComponent>{body}</MyComponent>; }
Tag
Luôn tự đóng các tag không có con. eslint: react/self-closing-comp
// bad <Foo variant="stuff"></Foo> // good <Foo variant="stuff" /> If your component has multi-line properties, close its tag on a new line. eslint: react/jsx-closing-bracket-location // bad <Foo bar="bar" baz="baz" /> // good <Foo bar="bar" baz="baz" />
Method
Sử dụng các chức năng mũi tên để đóng các biến cục bộ.
function ItemList(props) { return ( <ul> {props.items.map((item, index) => ( <Item key={item.key} onClick={() => doSomethingWith(item.name, index)} /> ))} </ul> ); }
Thêm xử lý sự kiện cho phương thức render trong constructor. eslint: react / jsx-no-bind
Tại sao? Một cuộc gọi bind trong đường dẫn render tạo ra một chức năng hoàn toàn mới trên mỗi render đơn.
// 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} />; } }
Không sử dụng tiền tố gạch dưới cho các method nội bộ của một thành phần React.
Tại sao? Tiền tố gạch dưới đôi khi được sử dụng như một quy ước trong các ngôn ngữ khác để biểu thị quyền riêng tư. Nhưng, không giống như các ngôn ngữ đó, không có sự hỗ trợ riêng cho tính riêng tư trong JavaScript, mọi thứ đều công khai. Bất kể ý định của bạn, thêm tiền tố gạch dưới vào thuộc tính của bạn không thực sự làm cho chúng là riêng tư, và bất kỳ thuộc tính nào (gạch dưới có tiền tố hay không) phải được coi là công khai.
// bad React.createClass({ _onClickSubmit() { // do stuff }, // other stuff }); // good class extends React.Component { onClickSubmit() { // do stuff } // other stuff }
Hãy chắc chắn trả về một giá trị trong các phương thức render của bạn. eslint: react / require-render-return
// bad render() { (<div />); } // good render() { return (<div />); }
Ordering
Thứ tự lớp mở rộng React.Component:
- optional static methods
- constructor
- 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
- Cách xác định propTypes, defaultProps, contextTypes, v.v ...
import React from 'react'; import PropTypes from 'prop-types'; 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;
Sắp xếp cho React.createClass: eslint: react / sort-comp
- 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
Mounted
Không sử dụng isMounted. eslint: react/no-is-mounted Tại sao? isMounted là một anti-pattern, không có sẵn khi sử dụng các lớp ES6, và không được chính thức chấp nhận.