F_picacho
F_picacho
发布于 2026-02-21 / 76 阅读
3
0

React 使用笔记:边学边整理的最佳实践(持续更新)

在使用 React 的过程中,我遇到过不少问题。为了让代码更简洁、可维护,我整理了一些自己常用的做法(大概率不是“最佳实践”,仅作参考)。

父子组件传递事件的命名

  • 问题:父组件函数和子组件 prop 同名,容易混淆。

  • 习惯/做法

    • 父组件函数 → handleXxx 或描述动作,如 handleDeleteItem 顺便有利于在组件中快速找到方法(如果你也喜欢用箭头函数的话)。

    • 子组件 prop → onXxx 风格,如 onDeleteItem

  • 好处:一眼认清数据流向,调用关系。

  • 示例:

... 
<DelButton onDeleteItem={handleDeleteItem} id={item.id} />

Tailwind 类名优化

  • 问题:JSX 里类名太长,看着杂乱,对竖屏编码不是很友好。 Prettier;

  • 习惯/做法:

    • 使用 clsxclassnames 拼接类名。

    • 抽成 CSS Module + @apply

    • 对于非复杂、未来改动概率较低的样式,不必硬套 CSS Module / @apply。
      我更倾向于先弄清哪些是固定布局或基础样式,这部分可以用 CSS Module + @apply;
      而状态类、动态变化、hover 或 dark 模式等简短样式,则直接在 className 里用 clsx 拼接。

  • 好处:

    • 模板清晰,排除了干扰。

    • 满足了我代码样式洁癖。 现实中不是很利索罢了,感觉自己是高手。

  • 示例:

// App.jsx
import style from "@/App.module.css";
import { clsx } from "clsx";

function App() {
  return (
    {/*容器*/}
    <div className={style.container}>
      {/*标题*/}
      <h1 className={`text-center p-7 text-xl font-bold text-gray-900`}>
        深海少女 feat. 初音ミク
      </h1>
      {/*歌词*/}
      <p className={clsx(style.lyrics, false && "bg-black/50")}>
        悲しみの海に沈んだ私
      </p>
      <p className={clsx(style.lyrics, true && "bg-black/50")}>
        目を開けるのも億劫
      </p>
    </div>
  );
}

export default App;
/* App.module.css */
@reference "tailwindcss";
.container {
  @apply mx-auto
    mt-20
    w-[600px]
    min-h-[400px]
    rounded
    shadow-xl
    bg-gradient-to-b
    from-[#39C5BB]
    to-[#CEEEAE];
}

.lyrics {
  @apply text-center
   text-lg
   leading-relaxed
   text-white
   p-4
   rounded-md
   select-none
   font-sans
   break-words
   max-w-xl
   mx-auto
}

不要滥用三元表达式

  • 问题:当状态只有两个时,三元表达式是最直接、最低成本的写法。但随着状态数量增加,分支结构会迅速变得复杂,阅读和维护成本也随之上升。

    你还上课上了? (来自于跟前同事的聊天记录)

    随便找了个刚出道的时候写的项目(vue2时代的遗物)

  • 习惯/做法:

    • 当一个状态存在多种可能时,优先使用映射结构表达状态与视图的对应关系。

    • 在逻辑较为复杂或存在明确状态流转时,可使用 switch 拆分逻辑,或进一步引入状态机进行建模。

    • 如果明确只存在两个状态那最优先还是使用三元表达式。

  • 好处:降低理解成本,提升阅读性可维护性。

  • 示例:

const viewMap = {
  idle: <Idle />,
  loading: <Loading />,
  success: <Success />,
  error: <Error />
}

return viewMap[status] ?? null


评论