一个常见的情况是处理表格的逻辑,可以为自定义钩提取
// form.tsx import { formeventhandler, usestate } from "react"; function forms() { const [title, settitle] = usestate(""); const [price, setprice] = usestate(""); const [description, setdescription] = usestate(""); const [image, setimage] = usestate(""); const [category, setcategory] = usestate(""); const [data, setdata] = usestate<any>(null); const [isloading, setisloading] = usestate(false); const [error, seterror] = usestate<any>(null); const handlesubmit: formeventhandler<htmlformelement> = async (e) => { try { setisloading(true); e.preventdefault(); const response = await fetch("https://fakestoreapi.com/products", { method: "post", body: json.stringify({ title, price, description, image, category, }), }); const data = await response.json(); setdata(data); } catch (e) { seterror(e); } finally { setisloading(false); } }; return ( <form style={{ display: "flex", flexflow: "column", gap: 10 }} onsubmit={handlesubmit} > <label htmlfor="name">title:</label> <input type="text" id="title" name="title" value={title} onchange={({ target: { value } }) => settitle(value)} /> <label htmlfor="price">price:</label> <input type="number" id="price" name="price" value={price} onchange={({ target: { value } }) => setprice(value)} /> <label htmlfor="description">description:</label> <textarea id="description" name="description" value={description} onchange={({ target: { value } }) => setdescription(value)} /> <label htmlfor="image">image:</label> <input type="url" id="image" name="image" onchange={({ target: { value } }) => setimage(value)} /> <label htmlfor="category">category:</label> <select id="category" name="category" value={category} onchange={({ target: { value } }) => setcategory(value)} > <option value="electronics">electronics</option> <option value="jewelery">jewelery</option> <option value="men's clothing">men's clothing</option> <option value="women's clothing">women's clothing</option> </select> <button disabled={isloading} type="submit"> send </button> <div>error: {json.stringify(error)}</div> <div>response: {json.stringify(data)}</div> </form> ); } export default forms;
>
对于每个形式的字段和形式的状态
可以通过步骤完成此组件的重写。在处理请求的示例中,我们可以享受一部分我们所做的事情:
提取请求状态
// usemutate.tsx import { usecallback, usestate } from "react"; export type usemutateparams<t, a> = { mutation: (args: a) => promise<t>; }; export function usemutate<t, a>({ mutation }: usemutateparams<t, a>) { const [isloading, setisloading] = usestate(false); const [error, seterror] = usestate<any>(null); const [data, setdata] = usestate<t | null>(null); const mutate = usecallback( async (args: a) => { try { setisloading(true); const data = await mutation(args); setdata(data); } catch (e) { seterror(e); } finally { setisloading(false); } }, [mutation], ); return { isloading, error, data, mutate, }; }
// form.tsx import { formeventhandler, usestate } from "react"; import { usemutate } from "../hooks/usemutate.tsx"; function forms() { const [title, settitle] = usestate(""); const [price, setprice] = usestate(""); const [description, setdescription] = usestate(""); const [image, setimage] = usestate(""); const [category, setcategory] = usestate(""); const { mutate, data, isloading, error } = usemutate({ mutation: async (body) => { const response = await fetch("https://fakestoreapi.com/products", { method: "post", body: json.stringify(body), }); return response.json(); }, }); const handlesubmit: formeventhandler<htmlformelement> = async (e) => { e.preventdefault(); await mutate( json.stringify({ title, price, description, category, image, }), ); }; return ( <form style={{ display: "flex", flexflow: "column", gap: 10 }} onsubmit={handlesubmit} > <label htmlfor="name">title:</label> <input type="text" id="title" name="title" value={title} onchange={({ target: { value } }) => settitle(value)} /> <label htmlfor="price">price:</label> <input type="number" id="price" name="price" value={price} onchange={({ target: { value } }) => setprice(value)} /> <label htmlfor="description">description:</label> <textarea id="description" name="description" value={description} onchange={({ target: { value } }) => setdescription(value)} /> <label htmlfor="image">image:</label> <input type="url" id="image" name="image" onchange={({ target: { value } }) => setimage(value)} /> <label htmlfor="category">category:</label> <select id="category" name="category" value={category} onchange={({ target: { value } }) => setcategory(value)} > <option value="electronics">electronics</option> <option value="jewelery">jewelery</option> <option value="men's clothing">men's clothing</option> <option value="women's clothing">women's clothing</option> </select> <button disabled={isloading} type="submit"> send </button> <div>error: {json.stringify(error)}</div> <div>response: {json.stringify(data)}</div> </form> ); } export default forms;
import { formeventhandler } from "react"; import { usemutate } from "../hooks/usemutate.tsx"; function forms() { const { mutate, data, isloading, error } = usemutate({ mutation: async (body) => { const response = await fetch("https://fakestoreapi.com/products", { method: "post", body: json.stringify(body), }); return response.json(); }, }); const handlesubmit: formeventhandler<htmlformelement> = async (event) => { event.preventdefault(); const form = event.target as htmlformelement; const formdata = new formdata(form); await mutate( json.stringify({ title: formdata.get("title"), price: formdata.get("price"), description: formdata.get("description"), category: formdata.get("category"), image: formdata.get("image"), }), ); }; return ( <form style={{ display: "flex", flexflow: "column", gap: 10 }} onsubmit={handlesubmit} > <label htmlfor="name">title:</label> <input type="text" id="title" name="title" /> <label htmlfor="price">price:</label> <input type="number" id="price" name="price" /> <label htmlfor="description">description:</label> <textarea id="description" name="description" /> <label htmlfor="image">image:</label> <input type="url" id="image" name="image" /> <label htmlfor="category">category:</label> <select id="category" name="category"> <option value="electronics">electronics</option> <option value="jewelery">jewelery</option> <option value="men's clothing">men's clothing</option> <option value="women's clothing">women's clothing</option> </select> <button disabled={isloading} type="submit"> send </button> <div>error: {json.stringify(error)}</div> <div>response: {json.stringify(data)}</div> </form> ); } export default forms;
// useproductcreate.tsx import { usemutate } from "./usemutate.tsx"; async function fetchproductcreate(body) { const response = await fetch("https://fakestoreapi.com/products", { method: "post", body: json.stringify(body), }); return response.json(); } export function useproductcreate() { return usemutate({ mutation: (formdata: formdata) => { const payload = { title: formdata.get("title"), price: formdata.get("price"), description: formdata.get("description"), category: formdata.get("category"), image: formdata.get("image"), }; return fetchproductcreate(payload); }, }); }
// Form.tsx import { FormEventHandler } from "react"; import { useProductCreate } from "../hooks/useProductCreate"; function Forms() { const { data, mutate, isLoading, error } = useProductCreate(); const handleSubmit: FormEventHandler<HTMLFormElement> = async (event) => { event.preventDefault(); const formData = new FormData(event.target as HTMLFormElement); await mutate(formData); }; return ( <form style={{ display: "flex", flexFlow: "column", gap: 10 }} onSubmit={handleSubmit} > <label htmlFor="name">Title:</label> <input type="text" id="title" name="title" /> <label htmlFor="price">Price:</label> <input type="number" id="price" name="price" /> <label htmlFor="description">Description:</label> <textarea id="description" name="description" /> <label htmlFor="image">Image:</label> <input type="url" id="image" name="image" /> <label htmlFor="category">Category:</label> <select id="category" name="category"> <option value="electronics">electronics</option> <option value="jewelery">jewelery</option> <option value="men's clothing">men's clothing</option> <option value="women's clothing">women's clothing</option> </select> <button disabled={isLoading} type="submit"> Send </button> <div>Error: {JSON.stringify(error)}</div> <div>Response: {JSON.stringify(data)}</div> </form> ); } export default Forms;
以上就是在实践中反应:用钩子改善形式的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号