3.精通React-如何编写干净的React代码?-《前端知识进阶》

admin 2025-11-01 15:30:33 编程 来源:ZONE.CI 全球网 0 阅读模式
  • 1. 简化布尔 prop
  • 2. 使用三元运算符
  • 3. 使用对象字符串
  • 4. 使用 Fragments
  • 5. 不要在 Render 中定义函数
  • 6. 使用 Memo
  • 7. 使用对象解构
  • 8. 字符串类型的 props 不需要花括号
  • 9. 从JSX中删除JS代码
  • 10. 使用模板字符串
  • 11. 按顺序导入
  • 12. 箭头函数
  • 13. 组件命名
  • 14. 保留 Prop 命名
  • 15. 引号
  • 16. Prop 命名
  • 17. 将 JSX 放在括号中
  • 18. 自闭合标签
  • 19. 方法中的下划线
  • 20. Alt 属性

    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" />
    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  14