为什么你的React开发效率还这么低:Prompt工程改变了什么

不是鸡汤,不是危言耸听。这是我最近半年在几个项目中真实遇到的情况。

开门见山:一个真实对比

去年年底,我带了一个实习生做一个电商后台的商品管理系统。

我用的传统方式: 产品说:做一个商品列表页面,能过滤、能排序、无限滚动、记录用户行为。

我打开VSCode:

  • 梳理UI层级结构

  • 设计Redux状态(或Zustand store)

  • 写组件(大概200-300行)

  • 写Hook处理数据获取和加载状态

  • 加虚拟滚动优化

  • 处理各种边界情况(网络错误、空状态等)

  • 反复调试...

前后花了3-4天。

这个实习生用Prompt工程的方式: 直接问ChatGPT一个完整的需求描述(把产品文档复制进去,稍微整理一下),GPT给出了一个完整的React组件,包括所有逻辑。

他在我的代码基础上改了一些样式、调整了API接口,花了半天

结果,他的代码反而没有我那些手工优化的小bug。

差别就在这里——不是谁的代码功底深,而是谁懂得怎么和AI对话。

真实场景1:表单验证的地狱

我们做过一个报价表单,需要验证的字段有:

  • 商品名称(3-100字)

  • 单价(0.01-999999元,2位小数)

  • 数量(1-1000000)

  • 备注(可选,最多500字)

  • 交货期(必须是未来的日期)

传统方式(我最初的写法)

const [errors, setErrors] = useState({})

const validateForm = (data) => {
const newErrors = {}

if (!data.name || data.name.trim().length < 3) {
    newErrors.name = "商品名称至少3个字"
  }
if (data.name && data.name.trim().length > 100) {
    newErrors.name = "商品名称最多100个字"
  }

// 价格验证...
if (!data.price || isNaN(data.price)) {
    newErrors.price = "请输入正确的价格"
  } elseif (data.price < 0.01 || data.price > 999999) {
    newErrors.price = "价格范围0.01-999999元"
  } elseif (!/^\d+(\.\d{1,2})?$/.test(data.price)) {
    newErrors.price = "价格最多2位小数"
  }

// ... 20多行类似的重复代码

return Object.keys(newErrors).length === 0
}

// 在表单里用:
const handleSubmit = () => {
if (validateForm(formData)) {
    // 提交
  } else {
    setErrors(newErrors)
  }
}

这样写的问题:

  • 如果要改一个验证规则,要找半天

  • 另一个表单需要类似的验证?复制粘贴,改变量名,容易出bug

  • 看着就很冗余

用Prompt的方式

我直接问Claude:

我在用react-hook-form和Zod做一个报价表单。需要以下字段验证:
- 商品名称:3-100字
- 单价:0.01-999999元,最多2位小数
- 数量:1-1000000
- 备注:可选,最多500字
- 交货期:不能是过去的日期

给出完整代码,包括schema和form组件。代码要能直接用。

Claude给出的:

import { useForm } from"react-hook-form"
import { zodResolver } from"@hookform/resolvers/zod"
import { z } from"zod"

const quoteSchema = z.object({
name: z.string()
    .trim()
    .min(3, "商品名称至少3个字")
    .max(100, "商品名称最多100个字"),

price: z.number()
    .positive("价格必须大于0")
    .min(0.01)
    .max(999999)
    .multipleOf(0.01, "最多2位小数"),

quantity: z.number()
    .int()
    .min(1)
    .max(1000000),

remark: z.string().max(500).optional(),

deliveryDate: z.date()
    .min(newDate(), "交货期不能早于今天")
})

export default function QuoteForm() {
const { register, handleSubmit, formState: { errors } } = useForm({
    resolver: zodResolver(quoteSchema)
  })

return (
    <form onSubmit={handleSubmit(onSubmit)}>
      {/* 所有验证逻辑自动生效 */}
    </form>
  )
}

差异

  • 传统:50行验证代码,容易出bug

  • Prompt:15行schema,自动完成验证

而且改需求时,只需要改schema,重新问AI一遍,不用手动debug。

真实场景2:列表数据管理的混乱

我们做过一个内容列表(比如订单列表、文章列表),需要管理:

  • 列表数据

  • 分页状态(当前页、总数)

  • 筛选条件(多个filter)

  • 排序方式

  • 加载状态

  • 错误状态

传统方式:Redux/Context混乱

文件结构:
- actions.js (100行)
- types.js (30行)
- reducer.js (200行)
- selectors.js (80行)
- middleware.js (100行)

总计:500+行,而且逻辑分散在各处

改一个筛选逻辑?要改3-4个文件。 新人接手?需要理解整个Redux flow。

用Prompt的方式:Zustand很轻量

我问Claude:

用Zustand管理一个内容列表页面的状态。

需要的状态:
- 列表数据
- 当前页码
- 每页条数
- 总记录数
- 排序字段和方向
- 多个筛选条件(比如状态、日期范围、搜索关键词)
- 加载状态

需要的操作:
- fetchList(filters, sort, page)
- setFilter
- setSortBy
- setPage
- reset

用TypeScript,数据要自动保存到localStorage。给出完整代码。

得到的代码:

import { create } from'zustand'
import { persist } from'zustand/middleware'

interface ListState {
items: any[]
page: number
pageSize: number
total: number
sortBy: string
sortOrder: 'asc' | 'desc'
filters: Record<string, any>
  isLoading: boolean
error: string | null

setPage: (page: number) =>void
setFilter: (key: string, value: any) =>void
setSortBy: (field: string, order: 'asc' | 'desc') =>void
fetchList: () =>Promise<void>
  reset: () =>void
}

exportconst useListStore = create<ListState>()(
  persist(
    (set, get) => ({
      items: [],
      page: 1,
      pageSize: 20,
      total: 0,
      sortBy: 'createdAt',
      sortOrder: 'desc',
      filters: {},
      isLoading: false,
      error: null,
      
      setPage: (page) =>set({ page }),
      setFilter: (key, value) =>set(state => ({
        filters: { ...state.filters, [key]: value },
        page: 1// 改变筛选时重置到第一页
      })),
      setSortBy: (field, order) =>set({ sortBy: field, sortOrder: order }),
      
      fetchList: async () => {
        set({ isLoading: true })
        try {
          const { page, pageSize, filters, sortBy, sortOrder } = get()
          const res = await api.getList({
            page,
            pageSize,
            ...filters,
            sortBy,
            sortOrder
          })
          set({
            items: res.data,
            total: res.total,
            isLoading: false
          })
        } catch (error) {
          set({ error: error.message, isLoading: false })
        }
      },
      
      reset: () =>set({
        filters: {},
        page: 1,
        sortBy: 'createdAt',
        sortOrder: 'desc'
      })
    }),
    { name: 'list-store' }
  )
)

差异

  • Redux方式:500行 + 分散在多个文件

  • Zustand + Prompt:100行左右 + 集中在一个文件

而且用起来超简单:

const { items, page, filters, fetchList, setFilter } = useListStore()

真实场景3:虚拟滚动这个"高端"技能

做一个内容流(类似新闻、商品列表),用户往下滑可能有几千条。直接render所有内容?页面会卡死。

传统方式

需要学习:

  • Intersection Observer API

  • 虚拟滚动的原理

  • 自己实现虚拟滚动逻辑(容易出bug)

  • 处理动态高度、lazy load等细节

花时间:少说2-3天研究 + 调试

用Prompt的方式

我问Claude:

用React和react-window做一个虚拟滚动列表。

要求:
- 初始显示100条项目,用户滑到底部自动加载下一批
- 每条项目高度120px(固定)
- 列表容器高度600px
- 当用户滑过来时,异步加载该项的详细信息
- 用TypeScript

给出完整可用的代码。

Claude直接给出用FixedSizeList的完整代码,包括加载逻辑、边界处理等。

差异

  • 自己实现:花2-3天,还容易有bug

  • Prompt方式:20分钟,代码质量反而更好


本质上发生了什么?

1. 从"写代码"变成了"描述需求"

老方式:我需要知道虚拟滚动怎么实现,然后一步步写出来

新方式:我需要清楚地描述"我要什么",AI帮我实现

这是思维方式的转变。不是代码能力变弱了,而是沟通能力变成了主要竞争力

2. 时间成本直线下降

同样的需求:

  • 表单验证:从4小时 → 30分钟

  • 状态管理:从2天 → 2小时

  • 虚拟滚动:从2-3天 → 1小时

如果一年做50个这样的feature,传统方式需要200天,Prompt方式可能只需要30-40天。

3. 代码质量反而提升了

因为AI生成的代码通常遵循最佳实践:

  • 考虑边界情况(错误处理、空状态等)

  • 性能优化(不容易出现memory leak)

  • 类型完整(TypeScript类型定义齐全)

实际怎么用:三个具体建议

建议1:建立自己的Prompt模板库

不要每次都从零开始。用Obsidian或Notion记录有效的Prompt,按场景分类:

📝 Prompt模板
├─ React组件
│  ├─ 表单组件
│  ├─ 列表组件
│  ├─ 模态框
│  └─ 数据表格
├─ 状态管理
│  ├─ Zustand store
│  ├─ Context API
│  └─ SWR配置
├─ 业务逻辑
│  ├─ 表单验证
│  ├─ API请求封装
│  └─ 错误处理

每个模板记录:

  • 原始需求是什么

  • Prompt怎么写的

  • 生成结果怎么样(有没有改过)

  • 下次改进的地方

建议2:规范你的Prompt写法

一个好的Prompt应该包括:

我需要用[技术栈]做[功能描述]。

具体需求:
1. [功能点1]
2. [功能点2]
3. [功能点3]

技术要求:
- 用[相关库]
- TypeScript类型要完整
- 代码要考虑[某某场景]

给出完整可用的代码。

比起"帮我写个React组件"这种模糊的要求,上面的Prompt能让AI生成的代码质量提升50%以上。

建议3:学会迭代和反馈

第一次生成的代码通常80%满意就不错了。

常见的反馈:

代码里有问题:[具体描述]

请修改[某个部分],改成[具体需求]。

或者:

生成的代码太复杂了,可以简化一下吗?
特别是[某个函数]部分。

经过2-3轮迭代,通常能达到90%满意。


不要掉进的坑

坑1:盲目相信AI生成的代码

AI生成的代码可能有问题:

  • 逻辑bug(特别是复杂的业务逻辑)

  • 性能问题(没考虑大数据量)

  • 安全问题(比如密钥处理)

你需要理解代码,而不是直接用。

坑2:过度依赖Prompt

Prompt工程很强大,但不能替代:

  • 系统架构设计

  • 业务逻辑思考

  • 代码审查

如果你完全不懂React,Prompt也救不了你。

坑3:写出来的Prompt太模糊

很多人问AI:"帮我写个表单",结果生成的代码完全不是自己想要的,然后说"AI这东西没什么用"。

问题不在AI,在于你的需求描述不清楚。


数据说话

我最近看过一些统计:

同一个项目需求,传统方式 vs Prompt方式

任务

传统方式

Prompt方式

提升

表单验证

4小时

30分钟

8倍

列表管理

2天

2小时

12倍

虚拟滚动

2-3天

1小时

24-48倍

API封装

3小时

20分钟

9倍

错误处理

2小时

15分钟

8倍

当然,这些数据有个前提:你懂得怎么用Prompt

如果你写的Prompt又模糊又不规范,提升可能只有2-3倍。

最后的建议

短期(1个月内)

  1. 选一个小需求,试试用Prompt做

  2. 记录你的Prompt,看看生成的代码质量

  3. 改进你的Prompt描述

中期(3个月内)

  1. 建立自己的Prompt模板库

  2. 在项目中有意识地使用Prompt工程

  3. 观察效率的提升

长期(半年+)

  1. Prompt工程会变成你开发的常规工具

  2. 你会自然而然地想到"怎么用AI来做这个"

  3. 效率相比之前会有质的提升

结束

这不是说传统的代码能力不重要了。相反,理解代码、评估代码质量、能改进AI生成的代码,这些能力现在变得更重要了。

Prompt工程不是替代品,而是放大器

它放大了好工程师的能力(可以做更多的事),也放大了差工程师的问题(生成的代码更容易出bug)。

所以现在的问题不是"要不要用Prompt",而是"怎样用好Prompt"。

从今天开始,找一个小需求试试看。别想太多,就直接问AI一遍。

然后记录下来,下次改进。

反复几次,你就会明白这个东西的威力在哪里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值