1. 简化布尔 prop

如果组件的 prop 是一个布尔值,可以直接简写。

Bad:

  1. return (
  2. <Navbar showTitle={true} />
  3. );

Good:

  1. return(
  2. <Navbar showTitle />
  3. )

2. 使用三元运算符

如果想要根据角色显示特定用户的详细信息,可以使用三元运算符来简化代码。

Bad:

  1. const { role } = user;
  2. if (role === ADMIN) {
  3. return <AdminUser />
  4. } else {
  5. return <NormalUser />
  6. }

Good:

  1. const { role } = user;
  2. return role === ADMIN ? <AdminUser /> : <NormalUser />

3. 使用对象字符串

如果想根据角色来显示三种类型的用户,可以使用对象字符串,其有助于提高代码的可读性。

Bad:

  1. const {role} = user
  2. switch(role){
  3. case ADMIN:
  4. return <AdminUser />
  5. case EMPLOYEE:
  6. return <EmployeeUser />
  7. case USER:
  8. return <NormalUser />
  9. }

Good:

  1. const {role} = user
  2. const components = {
  3. ADMIN: AdminUser,
  4. EMPLOYEE: EmployeeUser,
  5. USER: NormalUser
  6. };
  7. const Component = components[role];
  8. return <Componenent />;

4. 使用 Fragments

由于 React 只能有一个根节点,所以尽可能使用 Fragment 而不是 div。它可以保持代码的整洁,并且有利于提高性能,因为在虚拟DOM中少创建一个节点。

Bad:

  1. return (
  2. <div>
  3. <Component1 />
  4. <Component2 />
  5. <Component3 />
  6. </div>
  7. )

Good:

  1. return (
  2. <>
  3. <Component1 />
  4. <Component2 />
  5. <Component3 />
  6. </>
  7. )

5. 不要在 Render 中定义函数

尽量将 render 中的逻辑减少,不要在 render 中定义函数。

Bad:

  1. return (
  2. <button onClick={() => dispatch(ACTION_TO_SEND_DATA)}>
  3. bad
  4. </button>
  5. )

Good:

  1. const submitData = () => dispatch(ACTION_TO_SEND_DATA)
  2. return (
  3. <button onClick={submitData}>
  4. good
  5. </button>
  6. )

6. 使用 Memo

使用 Memo 可以避免不必要的渲染,显著提高应用程序的性能。

Bad:

  1. import React, { useState } from "react";
  2. export const TestMemo = () => {
  3. const [userName, setUserName] = useState("faisal");
  4. const [count, setCount] = useState(0);
  5. const increment = () => setCount((count) => count + 1);
  6. return (
  7. <>
  8. <ChildrenComponent userName={userName} />
  9. <button onClick={increment}> Increment </button>
  10. </>
  11. );
  12. };
  13. const ChildrenComponent =({ userName }) => {
  14. console.log("rendered", userName);
  15. return <div> {userName} </div>;
  16. };

理论上,子组件应该只渲染一次,因为count的值没有在ChildComponent组件使用。但是,它会在每次单击按钮时重新渲染。
image.png

Good:

  1. import React ,{useState} from "react";
  2. const ChildrenComponent = React.memo(({userName}) => {
  3. console.log('rendered')
  4. return <div> {userName}</div>
  5. })

现在,无论点击多少次按钮,它都只会在必要时渲染。

7. 使用对象解构

如果想显示用户的详细信息。可以使用对象的解构。

Bad:

  1. return (
  2. <>
  3. <div> {user.name} </div>
  4. <div> {user.age} </div>
  5. <div> {user.profession} </div>
  6. </>
  7. )

Good:

  1. const { name, age, profession } = user;
  2. return (
  3. <>
  4. <div> {name} </div>
  5. <div> {age} </div>
  6. <div> {profession} </div>
  7. </>
  8. )

8. 字符串类型的 props 不需要花括号

在将字符串类型的 props 传递给子组件时,不需要使用花括号包裹:

Bad:

  1. return(
  2. <Navbar title={"App"} />
  3. )

Good:

  1. return(
  2. <Navbar title="App" />
  3. )

9. 从JSX中删除JS代码

如果JSX不能提供任何渲染或者UI功能,可以将JS代码移出JSX。

Bad:

  1. return (
  2. <ul>
  3. {posts.map((post) => (
  4. <li onClick={event => {
  5. console.log(event.target, 'clicked!'); // <- THIS IS BAD
  6. }} key={post.id}>{post.title}
  7. </li>
  8. ))}
  9. </ul>
  10. );

Good:

  1. const onClickHandler = (event) => {
  2. console.log(event.target, 'clicked!');
  3. }
  4. return (
  5. <ul>
  6. {posts.map((post) => (
  7. <li onClick={onClickHandler} key={post.id}> {post.title} </li>
  8. ))}
  9. </ul>
  10. );

10. 使用模板字符串

避免使用字符串拼接,而使用模板字符串来构建长字符串。

Bad:

  1. const userDetails = user.name + "'s profession is" + user.proffession
  2. return (
  3. <div> {userDetails} </div>
  4. )

Good:

  1. const userDetails = `${user.name}'s profession is ${user.proffession}`
  2. return (
  3. <div> {userDetails} </div>
  4. )

11. 按顺序导入

按一定的顺序导入内容,这样可以提高代码的可读性。

Bad:

  1. import React from 'react';
  2. import ErrorImg from '../../assets/images/error.png';
  3. import styled from 'styled-components/native';
  4. import colors from '../../styles/colors';
  5. import { PropTypes } from 'prop-types';

Good:

  1. import React from 'react';
  2. import { PropTypes } from 'prop-types';
  3. import styled from 'styled-components/native';
  4. import ErrorImg from '../../assets/images/error.png';
  5. import colors from '../../styles/colors';

12. 箭头函数

假设函数做了一个简单的计算并返回结果,可以简化箭头函数。

Bad:

  1. const add = (a, b) => {
  2. return a + b;
  3. }

Good:

  1. const add = (a, b) => a + b;

13. 组件命名

使用 PascalCase 这种形式来给组件命名。

Bad:

  1. import reservationCard from './ReservationCard';
  2. const ReservationItem = <ReservationCard />;

Good:

  1. import ReservationCard from './ReservationCard';
  2. const reservationItem = <ReservationCard />;

14. 保留 Prop 命名

不要使用 DOM 组件的 prop 名称在组件之间传递参数

Bad:

  1. <MyComponent style="dark" />
  2. <MyComponent className="dark" />

Good:

  1. <MyComponent variant="fancy" />

15. 引号

对 JSX 属性使用双引号,对其他 JavaScript 代码使用单引号。

Bad:

  1. <Foo bar='bar' />
  2. <Foo style={{ left: "20px" }} />

Good:

  1. <Foo bar="bar" />
  2. <Foo style={{ left: '20px' }} />

16. Prop 命名

如果 prop 的值是一个 React 组件,则 prop 名称使用 camelCase 或 PascalCase 的形式。

Bad:

  1. <Component
  2. UserName="hello"
  3. phone_number={12345678}
  4. />

Good:

  1. <MyComponent
  2. userName="hello"
  3. phoneNumber={12345678}
  4. Component={SomeComponent}
  5. />

17. 将 JSX 放在括号中

如果组件超过一行,就将其用括号括起来。

Bad:

  1. return <MyComponent variant="long">
  2. <MyChild />
  3. </MyComponent>;

Good:

  1. return (
  2. <MyComponent variant="long">
  3. <MyChild />
  4. </MyComponent>
  5. );

18. 自闭合标签

如果组件没有任何子级,则使用自闭合标签,这样可以提高代码可读性。

Bad:

  1. <SomeComponent variant="stuff"></SomeComponent>

Good:

  1. <SomeComponent variant="stuff" />

19. 方法中的下划线

不要在 React 内部的方法中使用下划线。

Bad:

  1. const _onClickHandler = () => {
  2. // ...
  3. }

Good:

  1. const onClickHandler = () => {
  2. // ...
  3. }

20. Alt 属性

在 img 标签中始终使用 alt 属性。

Bad:

  1. <img src="hello.jpg" />

Good:

  1. <img src="hello.jpg" alt="description" />