7个技巧让你写出干净的 TSX 代码

原文链接:https://dev.to/ruppysuppy/7-tips-for-clean-react-typescript-code-you-must-know-2da2

“干净的代码”不仅是可以正常运行的代码。它指的是 组织整齐易于阅读易于理解且易于 维护的代码。

让我们来看看 React 中”干净代码”的一些最佳实践,它们可以让你更加轻松地维护代码!🚀🌕

1. 为所有值提供显式类型

使用 TypeScript 时,很多人经常不为值提供 显式类型,从而错失 TS 在开发中的真正用处

坏栗子 01:

const Component = ({ children }: any) => {
  // ...

};

坏栗子 02:

const Component = ({ children }: object) => {
  // ...

};

恰当地使用 interface 能够让编辑器给你提供准确的提示,从而让敲代码变得更容易

好栗子:

import { ReactNode } from "react";

interface ComponentProps {
  children: ReactNode;
}

const Component = ({ children }: ComponentProps) => {
  // ...

};

2. 更新状态时考虑先前的状态

如果更新状态时新状态依赖于旧状态,在调用更新状态函数时传入函数来更新状态,React 状态更新会进行批处理,如果不使用这种方式更新状态很可能导致意想不到的结果

坏栗子:

import React, { useState } from "react";

export const App = () => {
  const [isDisabled, setIsDisabled] = useState(false);

  const toggleButton = () => {
    setIsDisabled(!isDisabled);
  };

  // 此处调用两次toggleButton的结果和调用一次相同
  const toggleButtonTwice = () => {
    toggleButton();
    toggleButton();
  };

  return (

        I'm {isDisabled ? "disabled" : "enabled"}

        Toggle button state

        Toggle button state 2 times

  );
};

好栗子:

import React, { useState } from "react";

export const App = () => {
  const [isDisabled, setIsDisabled] = useState(false);

  const toggleButton = () => {
    setIsDisabled((isDisabled) => !isDisabled);
  };

  const toggleButtonTwice = () => {
    toggleButton();
    toggleButton();
  };

  return (

        I'm {isDisabled ? "disabled" : "enabled"}

        Toggle button state

        Toggle button state 2 times

  );
};

3. 保持文件原子性和精简性

保持稳健的原子性和精简性可以让调试、维护甚至查找文件更加容易

坏栗子:

// src/App.tsx
export default function App() {
  const posts = [
    {
      id: 1,
      title: "How to write clean react code",
    },
    {
      id: 2,
      title: "Eat, sleep, code, repeat",
    },
  ];

  return (

        App

        {posts.map((post) => (

            {post.title}

        ))}

  );
}

好栗子:

// src/App.tsx
export default function App() {
  return (

  );
}

// src/components/Navigation.tsx
interface NavigationProps {
  title: string;
}

export default function Navigation({ title }: NavigationProps) {
  return (

      {title}

  );
}

// src/components/Posts.tsx
export default function Posts() {
  const posts = [
    {
      id: 1,
      title: "How to write clean react code",
    },
    {
      id: 2,
      title: "Eat, sleep, code, repeat",
    },
  ];

  return (

      {posts.map((post) => (

      ))}

  );
}

// src/components/Post.tsx
interface PostProps {
  title: string;
}

export default function Post({ title }: PostProps) {
  return {title};
}

4. 对具有多个状态的值使用枚举或常量对象

使用枚举或常量对象可以大大简化管理存在多种状态的变量的过程

坏栗子:

import React, { useState } from "react";

export const App = () => {
  const [status, setStatus] = useState("Pending");

  return (

      {status}
       setStatus("Pending")}>
        Pending

       setStatus("Success")}>
        Success

       setStatus("Error")}>
        Error

  );
}

好栗子:

import React, { useState } from "react";

enum Status {
  Pending = "Pending",
  Success = "Success",
  Error = "Error",
}
// OR
// const Status = {
//   Pending: "Pending",
//   Success: "Success",
//   Error: "Error",
// } as const;

export const App = () => {
  const [status, setStatus] = useState(Status.Pending);

  return (

      {status}
       setStatus(Status.Pending)}>
        Pending

       setStatus(Status.Success)}>
        Success

       setStatus(Status.Error)}>
        Error

  );
};

5. 尽量不在视图中编写逻辑

尽量不要把逻辑代码嵌入到标签中

坏栗子:

const App = () => {
  return (

       {
          // ...

        }}
      >
        Toggle Dark Mode

  );
};

好栗子:

const App = () => {
  const handleDarkModeToggle = () => {
    // ...

  };

  return (

        Toggle Dark Mode

  );
};

当然如果逻辑代码只有简单的一行,写在标签中也是可以的

6. 正确地选择条件渲染的方式

正确地选择条件渲染的方式可以让代码更优雅

坏栗子:

const App = () => {
  const [isTextShown, setIsTextShown] = useState(false);

  const handleToggleText = () => {
    setIsTextShown((isTextShown) => !isTextShown);
  };

  return (

      {isTextShown ? Now You See Me : null}

      {isTextShown && isTextShown is true}
      {!isTextShown && isTextShown is false}

      Toggle

  );
};

好栗子:

const App = () => {
  const [isTextShown, setIsTextShown] = useState(false);

  const handleToggleText = () => {
    setIsTextShown((isTextShown) => !isTextShown);
  };

  return (

      {isTextShown && Now You See Me}

      {isTextShown ? (
        isTextShown is true
      ) : (
        isTextShown is false
      )}

      Toggle

  );
};

7. 使用JSX简写

布尔属性

一个具有真值的属性可以只写属性名,比如 truthyProp,而不必写成 truthyProp={true}

坏栗子:

interface TextFieldProps {
  fullWidth: boolean;
}

const TextField = ({ fullWidth }: TextFieldProps) => {
  // ...

};

const App = () => {
  return ;
};

好栗子:

interface TextFieldProps {
  fullWidth: boolean;
}

const TextField = ({ fullWidth }: TextFieldProps) => {
  // ...

};

const App = () => {
  return ;
};

字符串属性

属性值为字符串字面量可以直接用双引号包裹

坏栗子:

interface AvatarProps {
  username: string;
}

const Avatar = ({ username }: AvatarProps) => {
  // ...

};

const Profile = () => {
  return ;
};

好栗子:

interface AvatarProps {
  username: string;
}

const Avatar = ({ username }: AvatarProps) => {
  // ...

};

const Profile = () => {
  return ;
};

Undefined 属性

和普通的TS/JS一样,如果属性未提供值,则为 undefined

坏栗子:

interface AvatarProps {
  username?: string;
}

const Avatar = ({ username }: AvatarProps) => {
  // ...

};

const Profile = () => {
  return ;
};

好栗子:

interface AvatarProps {
  username?: string;
  // OR username: string | undefined
}

const Avatar = ({ username }: AvatarProps) => {
  // ...

};

const Profile = () => {
  return ;
};

现在你应该知道怎么编写干净的 TSX 了

完结!撒花!

7个技巧让你写出干净的 TSX 代码

公众号【今天也要写bug】(op-bot)提问答疑

Original: https://www.cnblogs.com/bidong/p/16639096.html
Author: 程序员既明
Title: 7个技巧让你写出干净的 TSX 代码

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/803824/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 强化学习-学习笔记1 | 基础概念

    1. 基本概念 1.1 概率论的基础知识 a. 随机变量 概念:是一个未知的量,值是由随机事件结果来决定的。 * 使用小写 x 来表示随机变量 X 的 观测值,只是表示一个数,没有…

    Python 2023年10月29日
    039
  • DateWhale数据分析课程组队学习打卡task01

    task01主要是对数据做一些基本的分析,观察一个整体,用到的python包也不多,只有一个Pandas,导入来用即可。 1.数据读入 首先就是读数据,python读取数据的方式有…

    Python 2023年8月6日
    027
  • Python用yield from 实现异步协程爬虫

    很古老的用法了,现在大多用的aiohttp库实现,这篇记录仅仅用做个人的协程底层实现的学习。争取用看得懂的字来描述问题。后续异步协程asyncio已完成博客链接:https://w…

    Python 2023年10月15日
    033
  • 模块的问题解决了代码过长不便维护的问题,但是如果不同的人编写的模块名相同怎么办?为了变量模块名冲突,python又引入了用目录来组织模块的方法,称为包。 例如: 为了避免 fibo…

    Python 2023年6月11日
    057
  • 【Python接口自动化笔记】-01基本配置

    一、pycharm 基本配置 1.创建项目location 是项目路径项目路径不要有中文下拉选择 框中interprter 解释器选择系统安装的Python环境(找到Python….

    Python 2023年9月13日
    049
  • pandas常用方法

    1、了解 1.1 DataFrame和Series关系 pandas读取数据会返回一个 DataFrame的数据结构,查看某一列或者某一行的数据类型,会返回一个 Series的数据…

    Python 2023年8月18日
    049
  • numpy学习——01数组创建

    本文是根据 DataWhale『巨硬的 numpy』文档进行学习, 辅之以天池平台, 之前学习过, 此时进行进一步的整理, 着重学习未完全熟悉的知识点. 详细的代码我也放入了天池学…

    Python 2023年8月26日
    052
  • python做excel多表按列合并_如何在Python中合并具有不同表列的Excel表?

    我有一些不同列的excel表格,如下所示:Table A: Col1 Col2 Col3 Table B: Col2 Col4 Col5 Table C: Col1 Col6 Co…

    Python 2023年8月8日
    045
  • ECCV2022论文汇总:检测/分割/跟踪/3D/深度估计/姿态解算等多个方向!

    作者 | 汽车人 编辑 | Autobox 目前,公众号正向大家广泛征稿中,欢迎童鞋们投稿,我们将有一定的稿费支持哦,详细信息请点击: 数据集 COO: Comic Onomato…

    Python 2023年10月27日
    024
  • Python打飞机小游戏

    《Python编程:从入门到实践》里的打飞机小游戏。 Python做游戏比预想中要简单。 不太完善,不过也算是不错的模板。 ; 主程序 def run_game(): pygame…

    Python 2023年9月22日
    041
  • conda安装Alphafold2

    之前打算按照官网的方法安装docker版本的AF2,但是过程实在太艰辛,于是改用conda版本的AF2,使用的是这个https://github.com/kuixu/alphafo…

    Python 2023年9月8日
    067
  • 一文弄懂Python中的 if __name__ == __main__

    引言 在Python相关代码中,我们经常会遇到如下代码段: stuff if __name__ == "__main__": # do stuff 本文将尽可能…

    Python 2023年8月1日
    036
  • 无助和愤怒都有

    要说曾经有多爱,现在就有多恨。 这几天很 焦躁,今天冷静下一想,不是因为别的,焦躁的主要原因是因为那种无助感。 我记得之前,家里有事,我去当地法院,我是被迫和解的,和解的过程中,法…

    Python 2023年6月15日
    068
  • 听说某宝抢购脚本大家都会了?那就在来个某东茅台抢购脚本吧。

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年8月1日
    053
  • djangorestframework-simplejwt

    介绍 因为jwt官方已经停止维护,且对于django4.x不支持,所以选择simplejwt(django>=2.0)一定要配合权限一起使用,不然不生效 1.使用 1.1 安…

    Python 2023年8月1日
    067
  • Python爬取当当网书籍数据,并数据可视化展示

    开发环境 Python 3.8 Pycharm 2021.2 专业版 模块使用 csv 模块 把爬取下来的数据保存表格里面的 内置模块 requests >>> …

    Python 2023年5月24日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球