You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js中使用useReducer获取textarea值失败求助

问题解决:useReducer无法获取textarea输入值

你的问题根源是textarea的事件属性拼写错误:你写的是OnChange(大写O),但React的事件处理属性要求小驼峰命名,正确的应该是onChange。这个错误导致输入时根本没有触发setFormData,所以formData始终是空对象。

修复后的代码

import Success from "../../components/singleElements/Success"
import Error from "../../components/singleElements/Error"
import { useQueryClient, useMutation } from "react-query"
import { addOnePub, getPub } from "../../lib/helper"
import { useReducer } from "react"

export default function Insertpub(){
// 使用该reducer获取数据
  const formReducer = (state, event) => {
    return {
      ...state,
      [event.target.name]: event.target.value,
    };
  };
// 监听文本框变化
  const [formData, setFormData] = useReducer(formReducer, {});
  
    const queryClient = useQueryClient()
    const addMutation = useMutation(addOnePub, {
        onSuccess : () => {
            queryClient.prefetchQuery('pub', getPub)
        }
    })

    const handleSubmit = (e) => {
      
        e.preventDefault();
        
        if(Object.keys(formData).length == 0) return console.log("Don't have Form Data");

        let {pub} = formData;
        const model = {
            pub
        }

        addMutation.mutate(model)
        console.log("the data is correctly inserted")
    }

    if(addMutation.isLoading) return <div>Loading!</div>
    if(addMutation.isError) return <Error message={addMutation.error.message}></Error>
    if(addMutation.isSuccess) return <Success message={"Added Successfully"}></Success>
    return (
        <form  onSubmit={handleSubmit}>
            <textarea
              className="bg-gray-200 w-full rounded-lg shadow border p-2"
              rows="5"
              placeholder="Ecrivez votre publication ici"
              onChange={setFormData} {/* 修正事件属性名称 */}
              name="pub"
              id="pub"
             
            ></textarea>

            <div className="w-full flex flex-row flex-wrap mt-3">
              
              <div className="w-2/3">
                <button
                  type="submit"
                  className="float-right bg-indigo-400 hover:bg-indigo-300 text-white p-2 rounded-lg"
                >
                  Publier
                </button>
              </div>
            </div>
          </form>
    )
}

只需要修改这一处,输入时就能正常触发reducer更新formData,提交时就能获取到输入内容了。

内容的提问来源于stack exchange,提问作者Aro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:11:08