react router 的action之前的传统表单提交方式

在action之前的传统表单提交方式():

  1. 用 useState 创建 loading,error,data等状态。 2.给表单的 onSubmit 实践绑定一个函数
  2. 在函数中用event.perventDefault()阻止浏览器默认行为
  3. 手动调用 fetch 去请求后端 api
  4. 在 .then() 和 .catch() 里手动更新 loading,error,data状态。
  5. 最麻烦的一步 :数据提交成功后,你需要手动重新获取页面上的其他数据来更新 UI(比如列表在新增一个条目后需要刷新)。
javascript 复制代码
improt React,{ useState,useEffect} from 'react';

// 模拟后端api
const api = {
 getTodos:async () =>[{id:1,title:'学习 react'}],
 addTodo:async(title) =>({id:Date.now(),title}),
};

function TodesManual(){
 //1. 用 useState 创建 loading,error,data 等状态
 const [todos,setTodos] = useState([]);
 const [isLoading,setRIsLoading] = useState(true);
 const [reeor,setError] = useState(null);
 const [isSubmitting,setIsSubmitting] = useState(false);
 // 表单提交的加载状态 
 
 //首次加载数据
 const fetchTodos = async() =>{
   try{
     //接受数据,放入到todos中
     const initialTodos = await api.getTodos();
     setTodos(initialTodos);
   } catch(err){
     setError('加载失败');
   } finally{
     //无论成功失败,数据加载状态结束
     setIsLoading(false);
   }
 };
 
 useEffect(()=>{
   fetchTodos();
 },[]); //空依赖数组,仅在组件挂载时运行一次
 
 //2. 给表单的 onSubmit 事件绑定一个函数
 const handleSubmit = async(event) => {
   //3.阻止浏览器默认行为
   event.preventDefault();
   //提交状态开始
   setIsSubmitting(true);
   
   //表单数据更新,标题更新
   const formData = new FormData(event.target);
   const title = formData.get('title');
   
   //如果标题是空,直接返回
   if(!title){
     setIsSubmitting(false);
     return;
   }
   
   try{
     //手动调用 fetch去请求后端 api
     await api.addTodo(title);
     
     //手动重新获取数据来更新 ui
     //每次提交成功后,必须再次调用获取列表的函数
     await fetchTodos();
     
     event.target.reset(); //情况输入框
   }catch(err){
     alert('添加失败!');
   }finally{
     //手动更新 loading 状态
     setIsSubmitting(false);
   }
 };
 
 if(isLoading) return <p>加载中...</p>
 if (error) return <p> {error} <p>
 
   return (
   <div>
     <h1>待办事项 (手动方式)</h1>
     <ul>
       {todos.map(todo => <li key={todo.id}>{todo.title}</li>)}
     </ul>
     <hr />
     <form onSubmit={handleSubmit}>
       <input type="text" name="title" placeholder="添加新事项..." />
       <button type="submit" disabled={isSubmitting}>
         {isSubmitting ? '添加中...' : '添加'}
       </button>
     </form>
   </div>
 );
}

   ```
这一串代码的逻辑是,每次打开网页时候,先用 useEffect 调用一次 fetchTodos() 函数,获取api中的数据,并放入Todos 中,在屏幕上打印出来。当表单提交的时候,将数据接受提交到后端,然后再调用 fetchTodos函数,从后端获取数据并打印。
相关推荐
leobertlan4 小时前
2025年终总结
前端·后端·程序员
子兮曰5 小时前
OpenClaw架构揭秘:178k stars的个人AI助手如何用Gateway模式统一控制12+通讯频道
前端·javascript·github
百锦再5 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
莲华君5 小时前
React快速上手:从零到项目实战
前端·reactjs教程
百锦再5 小时前
React编程高级主题:测试代码
android·前端·javascript·react.js·前端框架·reactjs
易安说AI5 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
失忆爆表症7 小时前
05_UI 组件库集成指南:Shadcn/ui + Tailwind CSS v4
前端·css·ui
小迷糊的学习记录7 小时前
Vuex 与 pinia
前端·javascript·vue.js
发现一只大呆瓜7 小时前
前端性能优化:图片懒加载的三种手写方案
前端·javascript·面试
不爱吃糖的程序媛8 小时前
Flutter 与 OpenHarmony 通信:Flutter Channel 使用指南
前端·javascript·flutter