【问题标题】:React Function Component Form not setting state variables?React Function Component Form没有设置状态变量?
【发布时间】:2021-12-22 15:29:16
【问题描述】:

我有一个 React 函数组件,它是一种用户输入值的表单。用户输入使用 Hooks 存储。我遇到的问题是它似乎没有正确设置钩子。当我在 axios 调用之前控制台记录一个值时,它返回为未定义。以下是我到目前为止的代码。我认为我非常接近,但不确定我在哪里犯了错误。任何帮助表示赞赏!

import React, { useState, useEffect } from "react";
import axios from "axios";

function ReportOutage(){
    //Use state hook to hold the values users input, passed into axios call
    //setting the default values
    const [formData, setFormData] = useState({
        userReport: '6',
        serviceType: "",
        serviceName: "",
        serviceStreet: "",
        serviceCity: "",
        serviceState: "",
        serviceDescription: ""
    }) 

    const handleChange = (event) => {
        event.preventDefault();
        setFormData({[event.target.name]: event.target.value})
    };

    const handleSubmitReport = async (event) =>{
        event.preventDefault();
        console.log(formData.serviceName); // This is returning undefined when I am expecting the service name entered by the user.
        const res = await axios.post("/outage-new", {
            user_id: `${formData.userReport}`,
            service_type: `${formData.serviceType}`,
            service_name: `${formData.serviceName}`,
            outage_street: `${formData.serviceStreet}`,
            outage_city: `${formData.serviceCity}`,
            outage_state: `${formData.serviceState}`,
            outage_description: `${formData.serviceDescription}`,
        })
    };

    return (
        <>
            <h1 id="Report-Title" class>Test Dialog box</h1>
            <form onSubmit={handleSubmitReport}>
                <input type="text" placeholder="Service Type" 
                onChange={handleChange}
                value={formData.serviceType}
                name="serviceType"/>

                <input type="text" placeholder="Service Name"
                onChange={handleChange} 
                value={formData.serviceName}
                name="serviceName"/>

                <input type="text" placeholder="Street"
                onChange={handleChange} 
                value={formData.serviceStreet}
                name="serviceStreet"/>

                <input type="text" placeholder="City"
                onChange={handleChange} 
                value={formData.serviceCity}
                name="serviceCity"/>

                <input type="text" placeholder="State"
                onChange={handleChange} 
                value={formData.serviceState}
                name="serviceState"/>

                <input type="text" placeholder="Description"
                onChange={handleChange} 
                value={formData.serviceDescription}
                name="serviceDescription"/>

                <button type="submit">Report Outage</button>
            </form>
        </>
    );
}

export default ReportOutage;

【问题讨论】:

    标签: javascript reactjs axios react-hooks jsx


    【解决方案1】:

    当使用useState 挂钩时,更新不会像在类组件的this.setState 中那样进行浅层合并。您正在用一个新对象替换状态,更新了最后一个字段值。

    const handleChange = (event) => {
      event.preventDefault();
      setFormData({ // <-- new object with only field name/value
        [event.target.name]: event.target.value
      });
    };
    

    您必须自己手动管理。使用functional state update 访问并将前一个状态浅拷贝到下一个状态对象中。

    const handleChange = (event) => {
      event.preventDefault();
      const { name, value } = event.target;
      setFormData(data => ({
        ...data,
        [name]: value,
      }));
    };
    

    【讨论】:

    • 酷!快速提问。我有点困惑什么是“数据”。就我而言,它是 formData 和 ...formData 正确的吗?我尝试了两种方式,但我仍然返回 undefined 我的值。
    • @ShafiKamal 在功能更新中,回调被传递了一个值,之前的状态,我们只是给它一个名字,在这个特定的例子中我称之为data,是的,它是formData 状态值。什么返回未定义?
    • handleSubmitReport 下的console.log(formData.serviceName)。
    • @ShafiKamal 似乎在此codesandbox 中按预期工作。你确定你正在运行最新的代码吗?杀死任何观察者/热加载器并重新启动您的开发构建。
    猜你喜欢
    • 2019-07-31
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 2020-12-04
    相关资源
    最近更新 更多