所以我的目标是在用户使用 localStorage 刷新页面后保留输入值。
我正在使用react-hook-form来处理整个表单行为。
我设法定位这些值并将它们保存在 localStorage 中,以便在刷新浏览器输入值后保存。 (我附上截图)
import { useForm, FormProvider } from "react-hook-form"
import InputsWrapper from "./InputsWrapper"
import Navbar from "../Navbar"
import ChoosePackage from "../ChoosePackage"
//@ts-ignore
import { Packages } from "../../types"
import axios from "axios"
import { useEffect } from "react"
interface FormData {
name: string
email: string
phone: string
city: string
address: string
contact_preference: string[]
photos: Array<string | Blob>
project_type: string
project_level: string
additional_info: string
contractor: boolean | undefined
package: Packages | undefined
}
type InquiryPayload = Omit<FormData, "photos"> & { photos: number[] }
const defaultData = {
name: "",
email: "",
phone: "",
city: "",
address: "",
contact_preference: [],
photos: undefined,
project_type: "",
project_stage: "",
additional_info: "",
contractor: undefined,
package: undefined,
}
// { phone: true, online_meeting: false} as Record<string, boolean>
const Form: React.FC = () => {
const FormMethods = useForm<FormData>({ defaultValues: defaultData })
const { handleSubmit, reset } = FormMethods
useEffect(() => {
const savedFormData = localStorage.getItem("formData")
if (savedFormData) {
const parsedFormData = JSON.parse(savedFormData)
reset(parsedFormData)
}
}, [])
useEffect(() => {
const saveFormData = JSON.stringify(FormMethods.getValues())
localStorage.setItem("formData", saveFormData)
}, [FormMethods.watch()])
const onFormSubmit = async (data: FormData) => {
const token =
"*********************"
let formData = new FormData()
Object.values(data.photos).forEach((photo: string | Blob) =>
formData.append("files", photo)
)
try {
const res = await axios({
method: "POST",
url: "https://strapi-km.herokuapp.com/api/upload",
data: formData,
headers: {
Authorization: `Bearer ${token}`,
},
})
const photoIds: number[] = res.data.map((e: { id: number }) => e.id)
let dataCopy: InquiryPayload = { ...data, photos: photoIds }
const response = await axios({
method: "POST",
url: "https://strapi-km.herokuapp.com/api/inquiries",
data: { data: dataCopy },
headers: {
Authorization: `Bearer ${token}`,
},
})
window.alert("Form has been submitted !")
console.log("Inquiry", response.data)
} catch (error) {
console.log(error)
}
localStorage.removeItem("formData")
reset()
}
return (
<>
<div className="bg-gray-50">
<Navbar />
<FormProvider {...FormMethods}>
<form onSubmit={handleSubmit(onFormSubmit)}>
<div>
<ChoosePackage />
<InputsWrapper />
<div className="mx-10">
<button
className="transition-colors duration-300 w-full mb-5 tracking-widest text-2xl border border-black text-gray-50 p-2 hover:bg-indigo-100 hover:text-indigo-900 bg-indigo-800"
type="submit"
>
SUBMIT
</button>
</div>
</div>
</form>
</FormProvider>
</div>
</>
)
}
export default Form
问题是,在提交表单后,我想清除 localStorage 以再次清除输入(例如,如果有人想提交另一个表单)。不知道为什么,但是
localStorage.removeItem("formData") 和 localStorage.clear() 不起作用...
我也尝试在表单提交后或在reset()后调用它,但它也没有解决问题。
如果有人可以帮助我并解释该问题,我将非常感谢任何帮助:)
您是否尝试过在从 localStorage 中清除或删除项目后重新加载页面。