开发者问题收集

React Hooks useState() 出现 Object TypeError: 无法读取未定义的属性“name”

2021-07-31
456

每次我尝试在输入字段中输入一些内容时,我都无法在代码中找到此错误的解决方案。 TypeError:无法读取未定义的属性“name”

但我已经按照以下帖子中的答案做了 https://stackoverflow.com/a/57519847/16568705 仍然不起作用

这里是所有代码

MultiStepForm.js

import { useForm, useStep } from "react-hooks-helper";
import React from "react";
import { LaporanPolisi } from "./stepForm/LaporanPolisi";
const defaultData = {
    laporanPolisi: {
        nomorLp: "",
        jenisKelamin: 0,
        tanggalLp: "",
        kerugian: 0,
        uraianSingkat: "",
        pasalDilanggar: [
            {
                undangUndang: "",
                pasal: ""
            }
        ]
    },
    pelapor: [],
    saksi: [],
    korban: [],
    terlapor: [],
    barangBukti: [],
    tkp: {
        kodeProvinsi: "",
        kodeKabupaten: "",
        kodeKecamatan: "",
        kodeKelurahan: "",
        kodeRT: "",
        kodeRW: ""
    }
}
const steps = [
    { id: "laporanPolisi" },
    { id: "pelapor" },
    { id: "saksi" },
    { id: "korban" },
    { id: "terlapor" },
    { id: "barangBukti" },
    { id: "tkp" },
    { id: "submit" }
]
export const MultiStepForm = () => {
    const [formData, setForm] = useForm(defaultData);
    const { step, navigation } = useStep({
        steps,
        initialStep: 0,
    });

    const props = { formData, setForm, navigation };

    switch (step.id) {
        case "laporanPolisi":
            return <LaporanPolisi {...props} />;
        case "pelapor":
            return "Pelapor";
        case "saksi":
            return "Saksi";
        case "korban":
            return "Korban";
        case "terlapor":
            return "Terlapor";
        case "barangBukti":
            return "Barang Bukti";
        case "tkp":
            return "TKP";
        case "submit":
            return "Submit";
        default:
            return <LaporanPolisi {...props} />;
    }
};

LaporanPolisi.js

import React from 'react';

export const LaporanPolisi = ({ formData, setForm, navigation }) => {
    const {
        laporanPolisi
    } = formData;
    const handleChange = e => {
        const { name, value } = e.target;
        console.log(name)
        setForm(prevState => ({
            ...prevState,
            laporanPolisi: {
                ...prevState.laporanPolisi,
                [name]: value
            }
        }));
    };
    return (
        <div className="card">
            <div className="card-header">
                <h4>Laporan Polisi</h4>
            </div>
            <div className="card-body">
                <div className="row">
                    <div className="col-md-6">
                        <div className="form-group">
                            <label htmlFor="nomorLp">Nomor Laporan</label>
                            <input onChange={handleChange} id="nomorLp"
                                placeholder="Nomor Laporan" type="text" className="form-control" name="nomorLp" value={laporanPolisi.nomorLp} />
                        </div>
                    </div>
                    <div className="col-md-6">
                        <div className="form-group">
                            <label htmlFor="jenisKelamin">Jenis Kelamin</label>
                            <select onChange={handleChange} value={laporanPolisi.jenisKelamin} id="jenisKelamin" name="jenisKelamin" className="custom-select">
                                <option value={0}>Laki-Laki</option>
                                <option value={1}>Perempuan</option>
                            </select>
                        </div>
                    </div>
                    {/* <input placeholder="Tanggal Laporan" type="text" className="form-control" name="nomorLp" value={jenisKelamin}></input>
                    <input placeholder="Kerugian" type="text" className="form-control" name="nomorLp" value={nomorLp}></input>
                    <input placeholder="Uraian Singkat" type="text" className="form-control" name="nomorLp" value={nomorLp}></input>
                    <input placeholder="Nomor Laporan" type="text" className="form-control" name="nomorLp" value={nomorLp}></input> */}
                </div>
            </div>
            <pre>
                <code>
                    {JSON.stringify(formData.laporanPolisi)}
                </code>
            </pre>
        </div>
    )
}

错误图像: https://i.sstatic.net/Q7Gjf.jpg
在此先谢谢了,抱歉我的英语不好。

2个回答

所有 React 组件都必须返回一个组件,例如:...

在你的 MultiStepForm.js 中只有 2 种情况符合此要求。

这是我处理输入的方式,如果你想更新 setForm ,你可以在 hanldeChange 中添加它:

export default function BasicExample({ formData, setForm, navigation }) {
  const [input1, setInput1] =useState(''); 
  const [input2, setInput2] =useState(''); 

  const handleChange = e => {
    e.preventDefault()
        console.log(input1)
        console.log(input2)
    };
  return (

    <form onSubmit={handleChange}>
    <div className="col-md-6">
        <div className="form-group">
            <label htmlFor="nomorLp">Nomor Laporan</label>
            <input onChange={e => setInput1(e.target.value)} id="nomorLp"
                placeholder="Nomor Laporan" type="text" className="form-control" name="nomorLp" value={input1} />
        </div>
    </div>
    <div className="col-md-6">
        <div className="form-group">
            <label htmlFor="jenisKelamin">Jenis Kelamin</label>
            <select onChange={e => setInput2(e.target.value)} value={input2} id="jenisKelamin" name="jenisKelamin" className="custom-select">
                <option value={0}>Laki-Laki</option>
                <option value={1}>Perempuan</option>
            </select>
        </div>
    </div>
      <button type="submit"> Summit</button>
  </form>

  );
}
Mike
2021-07-31

已解决
我需要像这样定义名称 https://i.sstatic.net/xvwIZ.jpg
https://github.com/revelcw/react-hooks-helper
的 Nested Object 部分中 然后,这是我更改后的完整代码:
LaporanPolisi.js

import React from 'react';
export const LaporanPolisi = ({ formData, setForm, navigation }) => {
    const {
        laporanPolisi
    } = formData;

    const handleSubmit = e => {
        e.preventDefault();
    };
    return (
        <div className="card">
            <div className="card-header">
                <h4>Laporan Polisi</h4>
            </div>
            <div className="card-body">
                <form onSubmit={handleSubmit}>
                    <div className="row">
                        <div className="col-md-6">
                            <div className="form-group">
                                <label htmlFor="nomorLp">Nomor Laporan</label>
                                <input onChange={setForm} id="nomorLp"
                                    placeholder="Nomor Laporan" type="text" className="form-control" name="laporanPolisi.nomorLp" value={laporanPolisi.nomorLp} />
                            </div>
                        </div>
                        <div className="col-md-6">
                            <div className="form-group">
                                <label htmlFor="jenisKelamin">Jenis Kelamin</label>
                                <select onChange={setForm} id="jenisKelamin" name="laporanPolisi.jenisKelamin" className="custom-select" value={laporanPolisi.jenisKelamin}>
                                    <option value={0}>Laki-Laki</option>
                                    <option value={1}>Perempuan</option>
                                </select>
                            </div>
                        </div>
                        <div className="col-md-6">
                            <button className="btn btn-primary" onClick={() => navigation.previous()} type="button">Previous</button>
                        </div>
                        <div className="col-md-6">
                            <button className="btn btn-primary" onClick={() => navigation.next()} type="button">Next</button>
                        </div>
                        {/* <input placeholder="Tanggal Laporan" type="text" className="form-control" name="nomorLp" value={jenisKelamin}></input>
                    <input placeholder="Kerugian" type="text" className="form-control" name="nomorLp" value={nomorLp}></input>
                    <input placeholder="Uraian Singkat" type="text" className="form-control" name="nomorLp" value={nomorLp}></input>
                    <input placeholder="Nomor Laporan" type="text" className="form-control" name="nomorLp" value={nomorLp}></input> */}
                    </div>
                </form>
            </div>
            <pre>
                <code>
                    {JSON.stringify(laporanPolisi)}
                </code>
            </pre>
        </div>
    )
}

感谢大家回答我的问题

Said Muhammad Khatami
2021-08-01