你必须知道的 7 个清洁 React TypeScript 代码的技巧🧹✨ 感谢阅读

2025-05-26

你必须知道的 7 个清洁 React TypeScript 代码的技巧🧹✨

感谢阅读

干净的代码并非只是能正常工作的代码。它指的是组织有序、易于阅读易于理解易于维护的代码

让我们来看看React中一些简洁代码的最佳实践,它们可以让你的代码维护变得无比轻松!🚀🌕

1. 为所有值提供明确的类型

在使用TypeScript时,很多人常常忽略为值提供显式类型,从而错过了TypeScript提供的真正好处。通常可以在代码库中看到这些:

错误示例 01:

const Component = ({ children }: any) => {
  // ...
};
Enter fullscreen mode Exit fullscreen mode

错误示例 02:

const Component = ({ children }: object) => {
  // ...
};
Enter fullscreen mode Exit fullscreen mode

相反,使用正确定义interface会让您的生活变得更加轻松,编辑器会为您提供准确的建议

好的例子:

import { ReactNode } from "react";

interface ComponentProps {
  children: ReactNode;
}

const Component = ({ children }: ComponentProps) => {
  // ...
};
Enter fullscreen mode Exit fullscreen mode

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

如果新状态依赖于先前状态,则始终建议将状态设置为先前状态的函数。React状态更新可以进行批处理,如果不以这种方式编写更新,可能会导致意外的结果。

不好的例子:

import React, { useState } from "react";

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

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

  // here toggling twice will yeild the same result
  // as toggling once
  const toggleButtonTwice = () => {
    toggleButton();
    toggleButton();
  };

  return (
    <div>
      <button disabled={isDisabled}>
        I'm {isDisabled ? "disabled" : "enabled"}
      </button>
      <button onClick={toggleButton}>
        Toggle button state
      </button>
      <button onClick={toggleButtonTwice}>
        Toggle button state 2 times
      </button>
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

好的例子:

import React, { useState } from "react";

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

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

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

  return (
    <div>
      <button disabled={isDisabled}>
        I'm {isDisabled ? "disabled" : "enabled"}
      </button>
      <button onClick={toggleButton}>
        Toggle button state
      </button>
      <button onClick={toggleButtonTwice}>
        Toggle button state 2 times
      </button>
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

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 (
    <main>
      <nav>
        <h1>App</h1>
      </nav>
      <ul>
        {posts.map((post) => (
          <li key={post.id}>
            {post.title}
          </li>
        ))}
      </ul>
    </main>
  );
}
Enter fullscreen mode Exit fullscreen mode

好的例子:

// src/App.tsx
export default function App() {
  return (
    <main>
      <Navigation title="App" />
      <Posts />
    </main>
  );
}

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

export default function Navigation({ title }: NavigationProps) {
  return (
    <nav>
      <h1>{title}</h1>
    </nav>
  );
}

// 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 (
    <ul>
      {posts.map((post) => (
        <Post key={post.id} title={post.title} />
      ))}
    </ul>
  );
}

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

export default function Post({ title }: PostProps) {
  return <li>{title}</li>;
}
Enter fullscreen mode Exit fullscreen mode

4. 使用枚举或常量对象来表示具有多种状态的值

通过使用或可以大大简化管理具有多种状态的变量的过程EnumsConstant Objects

不好的例子:

import React, { useState } from "react";

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

  return (
    <div>
      <p>{status}</p>
      <button onClick={() => setStatus("Pending")}>
        Pending
      </button>
      <button onClick={() => setStatus("Success")}>
        Success
      </button>
      <button onClick={() => setStatus("Error")}>
        Error
      </button>
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

好的例子:

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 (
    <div>
      <p>{status}</p>
      <button onClick={() => setStatus(Status.Pending)}>
        Pending
      </button>
      <button onClick={() => setStatus(Status.Success)}>
        Success
      </button>
      <button onClick={() => setStatus(Status.Error)}>
        Error
      </button>
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

5. 尽可能使用无 TS 的 TSX

TSX怎么能摆脱TS 的影响?🤔

别担心,我们讨论的只是标记部分,而不是整个组件。保持组件的功能独立性,可以让组件更容易理解。

不好的例子:

const App = () => {
  return (
    <div>
      <button
        onClick={() => {
          // ...
        }}
      >
        Toggle Dark Mode
      </button>
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

好的例子:

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

  return (
    <div>
      <button onClick={handleDarkModeToggle}>
        Toggle Dark Mode
      </button>
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

注意:如果逻辑是单行的,那么在TSX中使用它是完全可以接受的。

6. 优雅的条件渲染元素

有条件地渲染元素是React中最常见的任务之一,因此使用干净的条件是必要的。

不好的例子:

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

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

  return (
    <div>
      {isTextShown ? <p>Now You See Me</p> : null}

      {isTextShown && <p>`isTextShown` is true</p>}
      {!isTextShown && <p>`isTextShown` is false</p>}

      <button onClick={handleToggleText}>Toggle</button>
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

好的例子:

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

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

  return (
    <div>
      {isTextShown && <p>Now You See Me</p>}

      {isTextShown ? (
        <p>`isTextShown` is true</p>
      ) : (
        <p>`isTextShown` is false</p>
      )}

      <button onClick={handleToggleText}>Toggle</button>
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

7. 使用 JSX 简写

布尔属性

可以将一个真值 prop提供给一个组件,只需要prop名称,不需要值,像这样:truthyProp。像这样写truthyProp={true}是不必要的。

不好的例子:

interface TextFieldProps {
  fullWidth: boolean;
}

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

const App = () => {
  return <TextField fullWidth={true} />;
};
Enter fullscreen mode Exit fullscreen mode

好的例子:

interface TextFieldProps {
  fullWidth: boolean;
}

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

const App = () => {
  return <TextField fullWidth />;
};
Enter fullscreen mode Exit fullscreen mode

字符串属性

字符串Prop值可以用双引号引起来,无需使用花括号反引号

不好的例子:

interface AvatarProps {
  username: string;
}

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

const Profile = () => {
  return <Avatar username={"John Wick"} />;
};
Enter fullscreen mode Exit fullscreen mode

好的例子:

interface AvatarProps {
  username: string;
}

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

const Profile = () => {
  return <Avatar username="John Wick" />;
};
Enter fullscreen mode Exit fullscreen mode

未定义的属性

就像基本的TypeScript / JavaScript一样,如果没有为prop提供值,它将是undefined

不好的例子:

interface AvatarProps {
  username?: string;
}

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

const Profile = () => {
  return <Avatar username={undefined} />;
};
Enter fullscreen mode Exit fullscreen mode

好的例子:

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

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

const Profile = () => {
  return <Avatar />;
};
Enter fullscreen mode Exit fullscreen mode

现在您也知道如何编写干净的TSX了!

胜利之舞

感谢阅读

需要一位顶级软件开发自由职业者来解决你的开发难题吗?在Upwork上联系我

想看看我正在做什么吗?查看我的个人网站GitHub

想联系我吗?请在LinkedIn上联系我

关注我的博客,每两周Medium上获取最新资讯

常问问题

这些是我经常收到的一些问题。希望这个常见问题解答部分能解决您的问题。

  1. 我是初学者,该如何学习前端 Web 开发?
    可以参考以下文章:

    1. 前端流行语
    2. 前端开发路线图
    3. 前端项目构想
    4. 从初学者过渡到中级前端开发人员
  2. 你能指导我吗?

    抱歉,我工作已经很忙了,没时间指导任何人。

文章来源:https://dev.to/ruppysuppy/7-tips-for-clean-react-typescript-code-you-must-know-2da2
PREV
7 个技巧让你的网站性能飞速提升🚀🌙 感谢阅读
NEXT
JavaScript 中的 7 个杀手级单行代码 JavaScript 中的 7 个杀手级单行代码 感谢您的阅读