你必须知道的 7 个清洁 React TypeScript 代码的技巧🧹✨
感谢阅读
干净的代码并非只是能正常工作的代码。它指的是组织有序、易于阅读、易于理解且易于维护的代码。
让我们来看看React中一些简洁代码的最佳实践,它们可以让你的代码维护变得无比轻松!🚀🌕
1. 为所有值提供明确的类型
在使用TypeScript时,很多人常常忽略为值提供显式类型,从而错过了TypeScript提供的真正好处。通常可以在代码库中看到这些:
错误示例 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);
};
// 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>
);
};
好的例子:
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>
);
};
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>
);
}
好的例子:
// 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>;
}
4. 使用枚举或常量对象来表示具有多种状态的值
通过使用或可以大大简化管理具有多种状态的变量的过程。Enums
Constant 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>
);
};
好的例子:
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>
);
};
5. 尽可能使用无 TS 的 TSX
TSX怎么能摆脱TS 的影响?🤔
别担心,我们讨论的只是标记部分,而不是整个组件。保持组件的功能独立性,可以让组件更容易理解。
不好的例子:
const App = () => {
return (
<div>
<button
onClick={() => {
// ...
}}
>
Toggle Dark Mode
</button>
</div>
);
};
好的例子:
const App = () => {
const handleDarkModeToggle = () => {
// ...
};
return (
<div>
<button onClick={handleDarkModeToggle}>
Toggle Dark Mode
</button>
</div>
);
};
注意:如果逻辑是单行的,那么在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>
);
};
好的例子:
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>
);
};
7. 使用 JSX 简写
布尔属性
可以将一个真值 prop提供给一个组件,只需要prop名称,不需要值,像这样:truthyProp
。像这样写truthyProp={true}
是不必要的。
不好的例子:
interface TextFieldProps {
fullWidth: boolean;
}
const TextField = ({ fullWidth }: TextFieldProps) => {
// ...
};
const App = () => {
return <TextField fullWidth={true} />;
};
好的例子:
interface TextFieldProps {
fullWidth: boolean;
}
const TextField = ({ fullWidth }: TextFieldProps) => {
// ...
};
const App = () => {
return <TextField fullWidth />;
};
字符串属性
字符串Prop值可以用双引号引起来,无需使用花括号或反引号。
不好的例子:
interface AvatarProps {
username: string;
}
const Avatar = ({ username }: AvatarProps) => {
// ...
};
const Profile = () => {
return <Avatar username={"John Wick"} />;
};
好的例子:
interface AvatarProps {
username: string;
}
const Avatar = ({ username }: AvatarProps) => {
// ...
};
const Profile = () => {
return <Avatar username="John Wick" />;
};
未定义的属性
就像基本的TypeScript / JavaScript一样,如果没有为prop提供值,它将是undefined
。
不好的例子:
interface AvatarProps {
username?: string;
}
const Avatar = ({ username }: AvatarProps) => {
// ...
};
const Profile = () => {
return <Avatar username={undefined} />;
};
好的例子:
interface AvatarProps {
username?: string;
// OR `username: string | undefined`
}
const Avatar = ({ username }: AvatarProps) => {
// ...
};
const Profile = () => {
return <Avatar />;
};
现在您也知道如何编写干净的TSX了!
感谢阅读
需要一位顶级软件开发自由职业者来解决你的开发难题吗?在Upwork上联系我
想联系我吗?请在LinkedIn上联系我
关注我的博客,每两周在Medium上获取最新资讯
常问问题
这些是我经常收到的一些问题。希望这个常见问题解答部分能解决您的问题。
-
我是初学者,该如何学习前端 Web 开发?
可以参考以下文章: -
你能指导我吗?
抱歉,我工作已经很忙了,没时间指导任何人。