Реагирует на состояние формы, измененное функцией submit - PullRequest
1 голос
/ 27 февраля 2020

Я учу себя React и создаю небольшое одностраничное приложение React с помощью Ax ios API. У меня есть запрос POST, который продолжает сбой. Широкое использование console.log, похоже, указывает на то, что состояние ввода формы каким-то образом изменяется функцией отправки, хотя я не могу понять, почему. Помогите!

Вот код:

import React, { useState, useEffect } from 'react'
import axios from 'axios'
import { Grid, TextField, Button, Typography } from '@material-ui/core'
import { FaHome } from 'react-icons/fa'

const AddItem = ({ setShowAddItem }) => {
    const [inputs, setInputs] = useState()
    const [submitted, setSubmitted] = useState(false)

    useEffect(() => {
        console.log(`Type: ${typeof inputs} Data: ${inputs}`)
        if (inputs) {
            console.log('executing POST')
            console.log(`Inside if() Type: ${typeof inputs} Data: ${inputs}`)
            axios.post('/api/ItemModels', { ...inputs })
                .then(res => {
                    console.log(res.data)
                })
                .catch(err => console.error(err))
            setInputs()
            setSubmitted(false)
        }
    }, [submitted])

    const handleInputChange = event => {
        setInputs({ ...inputs, [event.target.name]: event.target.value })
        console.log(inputs)
        console.log(typeof inputs)
    }

    const handleSubmit = event => {
        console.log("handleSubmit triggered")
        if (event) {
            console.log("if() in handleSubmit triggered")
            console.log(`Inside handleSubmit Data: ${inputs}`)
            event.preventDefault()
            setSubmitted(true)
        }
    }

    return (
        <>
            <Grid container className="form-container">
                <Typography variant="h3">Add an Item</Typography>
                <form noValidate onSubmit={handleSubmit}>
                    <TextField name="shape" label="Shape" onChange={handleInputChange} required />
                    <TextField name="size" label="Size" onChange={handleInputChange}  required />
                    <TextField name="color" label="Color" onChange={handleInputChange} required />
                    <TextField name="clarity" label="Clarity" onChange={handleInputChange} required />
                    <TextField name="price" label="Price" onChange={handleInputChange} required />
                    <TextField name="listPrice" label="List Price" onChange={handleInputChange} required />

                    <Button type="submit">
                        Submit
                    </Button>
                </form>
            </Grid>

            <Button type="button" onClick={() => setShowAddItem(false)}>
                <FaHome />
            </Button>
        </>
    )
}

export default AddItem

Вот ссылка на CodeSandbox (который может немного отличаться от того, что здесь, так как я играюсь с разными вещами): CodeSandbox

А вот копия консоли из моей последней попытки:

// the last console.log from handleInputChange shows an Object with the right data
object                                    // <= that's the typeof from handleInputChange
handleSubmit triggered
Inside handleSubmit Data: [object Object]
if() in handleSubmit triggered
Inside handleSubmit if() Data: [object Object]
Type: object Data: [object Object]        // <= from useEffect
executing POST
Inside if() Type: object Data: [object Object]
Type: undefined Data: undefined           // <= useEffect triggered by setSubmitted(false)
Error: "Request failed with status code 400"

Похоже, что запись в журнал указывает на то, что состояние inputs видоизменяется от нормального JavaScript object для [object Object] в функции handleSubmit даже до вызова if() и / или preventDefault(), хотя я не могу понять, почему. Вот код handleSubmit() снова:

const handleSubmit = event => {
        console.log("handleSubmit triggered")
        console.log(`Inside handleSubmit Data: ${inputs}`)
        if (event) {
            console.log("if() in handleSubmit triggered")
            console.log(`Inside handleSubmit if() Data: ${inputs}`)
            event.preventDefault()
            setSubmitted(true)
        }
}

Я, вероятно, должен подчеркнуть, что я относительный новичок в программировании, и мне пришлось учить себя в значительной степени в изоляции, поэтому я довольно страшно, что где-то есть очевидная ошибка. Тем не менее, я потратил пару часов, пытаясь исследовать это, и даже позвонил другу, который является разработчиком React, и он тоже был в замешательстве. Я пытался поиграться с тем, как вызывается handleSubmit, помещая его в кнопку или возвращая его с помощью функции стрелки на onSubmit. Я также пытался передвигаться по preventDefault. Кажется, ничто не помогает.

Я не думаю, что это имеет отношение к Ax ios, так как inputs уже undefined к тому времени, когда они получают запрос POST, но я положил в Ax ios в качестве тега, надеясь, что это может быть ошибкой. Ax ios -ориентированные программисты знакомы.

Аналогично, выполнение POST-запроса через Postman работает как чудо.

И последнее: бэкэнд для проекта. NET, поэтому я занимаюсь разработкой для Visual Studio. Я подумал, что это может привести к некоторому ошибочному поведению Visual Studio, но выполнение кода из CodeSandbox создает такую ​​же ошибку, поэтому, если это не какая-то странная ошибка форматирования, которая будет перенесена, это, по моему скромному и необразованному мнению, будет чем-то другим.

Есть идеи?

1 Ответ

1 голос
/ 27 февраля 2020

Это сводка комментариев, которые решили проблему:

Передача объекта в строку для console.log(), как показано ниже, всегда приводит к отображению [object Object] из-за приведения его в виде строки, приводящей к подозревая, что свойства объекта изменены, когда они действительно присутствовали.

console.log(`Type: ${typeof inputs} Data: ${inputs}`);

Вместо этого используйте второй аргумент или выполните отдельный вызов журнала:

console.log(`Type: ${typeof inputs} Data:`, inputs);

После этого это был случай исправить свойства данных POST, чтобы убедиться, что регистр и типы соответствуют бэкэнд-API.

...