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函数,从后端获取数据并打印。
相关推荐
卸任31 分钟前
Vibe coding工具使用心得
前端·ai编程
brien91 小时前
为什么模型标称 1M,Google Antigravity 聊到 256K 却突然失忆?我们给它做了个原生行内监控圆环
前端
修炼的dance2 小时前
录屏关键帧间隔多少合适?六档实测,2秒到10秒小了75.6%
前端
Lank_M2 小时前
关键帧从1秒拉到10秒,录屏小87.3%,摄像头小10.8%
前端
补码缩写2 小时前
用 ffprobe 拆录屏,八成字节在 29 个关键帧上
前端
百思不得小李2 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
陈随易2 小时前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
风骏时光牛马2 小时前
前沿视界
前端
kyriewen2 小时前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员
陈随易2 小时前
3000 万人在用的翻译插件,重写一遍就是一门生意
前端·后端·程序员