React / 已完成

React 进阶篇:路由 状态管理 权限 工程化

把 React 用户管理页放进后台项目,补齐路由、权限、全局状态和工程化目录。

返回文章积累

一句话:React 进阶不是多背几个 Hook,而是把用户管理页放进真正的后台项目里,让路由、权限、状态、目录和检查都稳定起来。

第 4 篇 / 共 12 篇。

本篇学完你会:用 React Router、TypeScript、状态管理和工程化目录组织一个可维护的用户管理模块。

1. 什么叫 React 进阶

入门阶段关心:

组件怎么写
state 怎么改
列表怎么渲染
接口怎么请求

进阶阶段关心:

页面放在哪里
权限怎么拦
接口怎么统一
状态怎么共享
类型怎么沉淀
多人协作怎么不乱

React 后台工程化结构图

2. 路由怎么组织

用户管理页应该有稳定路由:

/admin/users
/admin/users/:id

React Router 思路:

import { createBrowserRouter } from 'react-router-dom';

export const router = createBrowserRouter([
  {
    path: '/admin',
    element: <AdminLayout />,
    children: [
      {
        path: 'users',
        element: <UserManagementPage />
      }
    ]
  }
]);

大白话:路由就是“网址到页面组件”的映射表。

3. 权限怎么控制

后台常见权限:

user:read
user:create
user:update
user:delete

按钮控制:

function PermissionButton({ permission, children }: { permission: string; children: React.ReactNode }) {
  const { permissions } = useCurrentUser();

  if (!permissions.includes(permission)) {
    return null;
  }

  return <>{children}</>;
}

使用:

<PermissionButton permission="user:create">
  <button>新增用户</button>
</PermissionButton>

路由控制也类似:进入页面前检查是否有 user:read

4. 全局状态放什么

不是所有状态都要全局。

状态放哪里
搜索框输入页面本地 state
编辑弹窗草稿表单本地 state
当前登录用户全局状态
权限列表全局状态
主题语言全局状态
用户列表数据看项目,可以本地,也可以缓存到请求库

大白话:只有多个页面都需要的数据,才值得放全局。

5. Context、Zustand、Redux 怎么选

方案适合场景
Context少量全局数据,比如当前用户
Zustand中小项目,写法轻,适合业务状态
Redux Toolkit大型项目,强规范、强调试、团队协作

Zustand 示例:

type AuthState = {
  user: CurrentUser | null;
  permissions: string[];
  setUser: (user: CurrentUser) => void;
};

export const useAuthStore = create<AuthState>((set) => ({
  user: null,
  permissions: [],
  setUser: (user) => set({ user, permissions: user.permissions })
}));

用户管理页面只读权限:

const canDelete = useAuthStore((state) => state.permissions.includes('user:delete'));

6. 用户管理模块目录

推荐目录:

src/
  features/
    users/
      api.ts
      types.ts
      hooks/
        use-users.ts
      components/
        user-filter.tsx
        user-form.tsx
        user-table.tsx
      pages/
        user-management-page.tsx

职责:

文件职责
types.ts用户相关类型
api.ts用户接口请求
use-users.ts用户列表业务逻辑
components/可复用 UI
pages/组装页面

7. TypeScript 怎么帮忙

接口返回值要有类型:

type PageResult<T> = {
  list: T[];
  total: number;
};

async function fetchUsers(query: UserQuery): Promise<PageResult<User>> {
  const response = await request.get('/users', { params: query });
  return response.data;
}

权限也可以收紧:

type PermissionCode = 'user:read' | 'user:create' | 'user:update' | 'user:delete';

这样写错权限名时,编辑器会提醒。

8. 性能优化看哪里

用户管理页面常见优化:

问题优化
搜索频繁请求debounce
大表格卡顿分页或虚拟滚动
子组件重复渲染memo、稳定 props
计算过滤结果贵useMemo
弹窗表单太重懒加载或拆分

不要一开始就优化。先让数据流清楚,再根据真实问题处理。

9. 常见错误

错误后果
把所有状态塞全局调试困难
页面直接散落 fetch接口难维护
权限只隐藏按钮可能绕过前端调用接口
类型全写 anyTypeScript 失效
目录按文件类型堆业务越来越难找

权限尤其要记住:前端控制体验,后端负责真正安全。

10. 下一步怎么学

React 线到这里已经形成完整闭环:

组件 -> Hooks -> 请求表单 -> 路由权限 -> 状态管理 -> 工程化

下一篇建议转到 Vue 线:大白话讲解——Vue 入门篇:模板 指令 组件 响应式.md