程序员早点知道的 10 件事
如果您是一名初级开发人员,并且对 React 感到不知所措,那么您并不孤单。
在我刚开始的时候,我犯了很多错误——如果我从一开始就知道这十件事,我就可以避免这些错误。
让我来帮助您避免这些失误。
📚 下载我的免费 101 个 React 技巧和窍门书,抢占先机。

1. 使用 children Prop 大幅提升应用性能
`children` 属性不仅仅用于传递嵌套元素。
它是一个强大的工具,具有以下优点:
❌ **缺点**:每当 `Dashboard` 渲染时,`MyVerySlowComponent` 也会渲染,而每次当前时间更新时都会发生这种情况。
function App() {
// Some other logic…
return ;
}
function Dashboard() {
const [currentTime, setCurrentTime] = useState(new Date());
useEffect(() => {
const intervalId = setInterval(() => {
setCurrentTime(new Date());
}, 1_000);
return () => clearInterval(intervalId);
}, []);
return (
<>
{currentTime.toTimeString()}
>
);
}💡 你可以在图片👉这里看到操作的缓慢程度,我在这里使用了 React Developer Tool 的分析器。
✅ **优点**:`MyVerySlowComponent` 不会不必要地重新渲染。
function App() {
return (
);
}
function Dashboard({ children }) {
const [currentTime, setCurrentTime] = useState(new Date());
useEffect(() => {
const intervalId = setInterval(() => {
setCurrentTime(new Date());
}, 1_000);
return () => clearInterval(intervalId);
}, []);
return (
<>
{currentTime.toTimeString()}
{children}
>
);
}💡您可以在此图片👉这里看到优化的结果。

2. 何时使用 Refs 和 State
Refs 非常适合那些不应触发重新渲染的值。
不要默认说明,而是问问自己:如果答案是否定的,请使用参考。
它们非常适合跟踪可变值,例如计时器、DOM 元素或在渲染过程中持续存在但不影响 UI 的值。
❌ **缺点**:我们在状态中存储了 `intervalId`。当 `intervalId` 状态改变时,即使 UI 保持不变,组件也会重新渲染。
function Timer() {
const [time, setTime] = useState(new Date());
const [intervalId, setIntervalId]= useState();
useEffect(() => {
const id = setInterval(() => {
setTime(new Date());
}, 1_000);
setIntervalId(id);
return () => clearInterval(id);
}, []);
const stopTimer = () => {
intervalId && clearInterval(intervalId);
};
return (
<>
<>Current time: {time.toLocaleTimeString()} >
>
);
}✅ **好**:我们将 `intervalId` 存储为引用。这意味着我们没有触发重新渲染的额外状态。
function Timer() {
const [time, setTime] = useState(new Date());
const intervalIdRef = useRef();
const intervalId = intervalIdRef.current;
useEffect(() => {
const id = setInterval(() => {
setTime(new Date());
}, 1_000);
intervalIdRef.current = id;
return () => clearInterval(id);
}, []);
const stopTimer = () => {
intervalId && clearInterval(intervalId);
};
return (
<>
<>Current time: {time.toLocaleTimeString()} >
>
);
}
3. 优先使用命名导出而不是默认导出
命名导出使重构和调试更容易。
❌ **缺点**:重命名需要手动更新。
export default function Button() {}
// Later...
import Button from './Button';✅ **优点**:重命名会自动进行。
export function Button() {}
// Later...
import { Button } from './Button';你可以在这篇文章👉101 个 React 技巧和窍门中找到更多有关命名导入的参数。

4. 尽量避免使用 useEffect
我处理过的每个应用程序崩溃都有“useEffect”隐藏在代码中😅。
认真地讲,避免使用 `useEffect`:
相反,考虑一下如果没有它是否可以实现同样的结果。
❌ **不好**:在 `useEffect` 中调用 `onToggled`。
function Toggle({ onToggled }) {
const [on, setOn] = React.useState(false);
const toggle = () => setOn(!on);
useEffect(() => {
onToggled(on);
}, [on]);
return (
);
}✅ **好**:相关时调用 `onToggled`。
function Toggle({ onToggled }) {
const [on, setOn] = React.useState(false);
const handleToggle = () => {
const next = !on;
setOn(next);
onToggled(next);
};
return (
);
}您可以在这里找到更多避免使用“useEffect”的技巧👉您可能不需要效果。

5.了解 React 的生命周期
了解生命周期阶段以避免错误和性能问题:

6. 使用 ESLint 跟踪愚蠢的错误
ESLint 可以帮你避免细微的错误,尤其是在钩子中。
❌ **糟糕**:`useEffect` 中缺少依赖项。
useEffect(() => {
console.log(data);
}, []); // Missing dependencies!✅ **好**:使用 ESLint 和类似 eslint-plugin-react-hooks 的插件。

7. 使用 React DevTools 进行更智能的调试
React DevTools 是调试性能问题的黄金工具。使用“Profiler”选项卡查找运行缓慢的组件。
❌ **缺点**:仅仅依靠 `console.log` 和计时器来猜测应用程序运行缓慢的原因。
✅ **好**:使用 Profiler 可以:
💡 通过本精彩指南学习如何使用它。

8. 使用错误边界来避免彻底崩溃
默认情况下,如果您的应用程序在渲染过程中遇到错误,整个 UI 就会崩溃💥。
为了防止这种情况,请使用错误边界来:
💡 提示:你可以使用 react-error-boundary 包

9. 像专业人士一样组织你的代码
干净的代码是可维护的代码。
您可以遵循以下简单的提示:
❌ **缺点**:当你删除“Button.js”时,很容易忘记“Button.css”。
src/
components/
Button.js
Modal.js
styles/
Button.css✅ **优点**:我们将相关文件保存在一起。
src/
components/
Button/
Button.js
Button.css
Button.test.js
10. React 网站有你需要的一切
不要忽视官方的 React 文档。它们充满了示例、解释和最佳实践。
❌ **缺点**:无休止地在 Google 上搜索 React 的基本概念,结果却发现都是过时的博客文章。
✅ **优点**:将官方文档加入书签,并在您遇到困难时将其作为您的第一站。

概括
掌握 React 需要时间。
但这些教训可以让你避免我早期所犯的错误。
继续编码,保持好奇心,记住——你已经做到了!

🐞 发现漏洞

就这样结束了🎉。