Почему мой onSubmit не работает в диалоговом окне PrimeReact?

Мой код больше не отправляет данные при нажатии onSubmit, хотя это было, когда я использовал тег и:

<Modal><Form onSubmit = { saveProject }></Form></Modal>

Единственное, что изменилось сейчас, это то, что я заменил Modal, поскольку я использую PrimeReact, и удалил тег. Теперь он больше не отправляет данные. Может ли кто-нибудь сказать мне, почему он больше не отправляет данные на сервер?

/Projects.js

    import React, { useState, useEffect } from "react";
    import { Column } from "primereact/column";
    import { DataTable } from "primereact/datatable";
    import { Button } from "primereact/button";
    // import { Modal, ModalFooter, ModalHeader } from "react-bootstrap";
    import { InputText } from "primereact/inputtext";
    import { InputTextarea } from "primereact/inputtextarea";
    // import { InputNumber } from "primereact/inputnumber";
    import { Dropdown } from "primereact/dropdown";
    import { Dialog } from "primereact/dialog";
    
    import axios from "axios";
    
    const Projectz = () => {
        const [ticket_title, setTicketTitle] = useState("");
        const [ticket_description, setTicketDescription] = useState("");
        // const [time_takes, setTimeTakes] = useState("");
        const [type_menu, setTypeMenu] = useState("");
        const [priority_menu, setPriorityMenu] = useState("");
        const [status_menu, setStatusMenu] = useState("");
    
        const [projects, setProjects] = useState([]);
    
        //part of modal
        const [displayResponsive, setDisplayResponsive] = useState(false);
        // const [position, setPosition] = useState("center");
    
        useEffect(() => {
            getProjects();
        }, []);
    
        const getProjects = async () => {
            const response = await axios.get("http://localhost:5002/ticket_table");
            setProjects(response.data);
        };
    
        const saveProject = async (e) => {
            e.preventDefault();
            await axios.post("http://localhost:5002/ticket_table", {
                ticket_title: ticket_title,
                ticket_description: ticket_description,
                // time_takes: time_takes,
                type_menu: type_menu,
                priority_menu: priority_menu,
                status_menu: status_menu,
            });
        };
    
        const dropdownValues1 = [{ value: "Issue" }, { value: "Bug" }, { value: "Error" }, { value: "Other" }];
    
        const dropdownValues2 = [{ value: "Low" }, { value: "Medium" }, { value: "High" }, { value: "Immediate" }];
    
        const dropdownValues3 = [{ value: "New" }, { value: "Open" }, { value: "In Progress" }, { value: "Resolved" }, { value: "Additional Info Required" }];
    
        const dialogFuncMap = {
            displayResponsive: setDisplayResponsive,
        };
    
        const onClick = (name, position) => {
            dialogFuncMap[`${name}`](true);
        };
    
        const onHide = (name) => {
            dialogFuncMap[`${name}`](false);
        };
    
        const renderFooter = (name) => {
            return (
                <div>
                    <Button label = "Submit" className = "p-button-rounded p-button-success mr-2 mb-2 success" />
                </div>
            );
        };
    
        // const [show, setShow] = useState(false);
        // const handleClose = () => setShow(false);
        // const handleShow = () => setShow(true);
        return (
            <>
                <div className = "grid table-demo">
                    <div className = "col-12">
                        <div className = "card">
                            <h5>Tickets</h5>
    
                            <div>
                                {/* <Button label = "New Ticket" className = "p-button-rounded mr-2 mb-2 npbutton" onClick = {handleShow} /> */}
                                <Button className = "p-button-rounded mr-2 mb-2 npbutton" label = "New Ticket" onClick = {() => onClick("displayResponsive")} />
                            </div>
                            <Dialog className = "dialogModal" header = "Create Ticket" visible = {displayResponsive} onHide = {() => onHide("displayResponsive")} breakpoints = {{ "960px": "75vw" }} style = {{ width: "30vw" }} footer = {renderFooter("displayResponsive")}>
                                <form onSubmit = {saveProject}>
                                    <h5>Ticket Name</h5>
                                    <InputText value = {ticket_title} onChange = {(e) => setTicketTitle(e.target.value)} type = "text" placeholder = "Enter ticket name"></InputText>
                                    <h5>Ticket Description</h5>
                                    <InputTextarea value = {ticket_description} onChange = {(e) => setTicketDescription(e.target.value)} type = "text" placeholder = "Enter ticket description" autoResize rows = "3" cols = "30" />
                                    {/* <h5>Time Estimate (Hours)</h5> */}
                                    {/* <InputNumber value = {time_takes} onValueChange = {(e) => setTimeTakes(e.value)} showButtons mode = "decimal"></InputNumber> */}
                                    <h5>Type</h5>
                                    <Dropdown value = {type_menu} onChange = {(e) => setTypeMenu(e.value)} options = {dropdownValues1} optionLabel = "value" placeholder = "Select" />
                                    <h5>Priority</h5>
                                    <Dropdown value = {priority_menu} onChange = {(e) => setPriorityMenu(e.value)} options = {dropdownValues2} optionLabel = "value" placeholder = "Select" />
                                    <h5>Status</h5>
                                    <Dropdown value = {status_menu} onChange = {(e) => setStatusMenu(e.value)} options = {dropdownValues3} optionLabel = "value" placeholder = "Select" />
                                </form>
                            </Dialog>
                            <div>
                                <DataTable
                                    // sortMode = "single" sortField = "representative.name"
    
                                    sortOrder = {1}
                                    scrollable
                                    scrollHeight = "400px"
                                    responsiveLayout = "scroll"
                                >
                                    <Column field = "ticket_title" header = "Ticket Title" style = {{ minWidth: "200px" }}></Column>
                                    <Column field = "description" header = "Description" style = {{ minWidth: "350px" }}></Column>
                                    <Column field = "status" header = "Status" style = {{ minWidth: "200" }}></Column>
                                    <Column field = "createdAt" header = "Date" style = {{ minWidth: "200px" }}></Column>
                                </DataTable>
                            </div>
                        </div>
                    </div>
                </div>
    
                <div className = "grid table-demo">
                    <div className = "col-12">
                        <div className = "card">
                            <h5>Ticket Info</h5>
                            <div>
                                <DataTable
                                // value = {projects}
                                // sortMode = "single" sortField = "representative.name"
                                // sortOrder = {1}
                                // scrollable
                                // scrollHeight = "400px"
                                // responsiveLayout = "scroll"
                                >
                                    {projects.map((project, index) => (
                                        <tr key = {project.id}>
                                            <td>{index + 1}</td>
                                            <td>{project.ticket_title}</td>
                                            <td>{project.ticket_description}</td>
                                            {/* <td>{ticket.time_takes}</td> */}
                                            <td>{project.type_menu}</td>
                                            <td>{project.priority_menu}</td>
                                            <td>{project.status_menu}</td>
                                        </tr>
                                    ))}
                                </DataTable>
                            </div>
                        </div>
                    </div>
                </div>
            </>
        );
    };
    
    export default React.memo(Projectz);
stackoverflow.com/questions/28479239/… Посмотрите на это, на него уже ответили
Tirth 29.03.2022 21:14

@Tirth каким образом? Их функция отправки уже вызывает preventDefault.

Brian Thompson 29.03.2022 21:20

@Tirth saveProject уже вызывает e.preventDefault(), так что этот ответ на самом деле не очень мне помогает, но я ценю ваши усилия, чтобы помочь!

ttsssss 29.03.2022 21:45

Я снова добавил тег <form>, так как onSubmit является опорой для формы, но он все еще не работает.

ttsssss 30.03.2022 00:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
4
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это потому, что диалог отображает renderFooter за пределами вашего <form>. Я столкнулся с той же проблемой.

Вы можете исправить это вместо того, чтобы использовать нижний колонтитул, просто отображая вашу кнопку так, чтобы она выглядела как в нижнем колонтитуле.

<Dialog className = "dialogModal" header = "Create Ticket" visible = {displayResponsive} onHide = {() => onHide("displayResponsive")} breakpoints = {{ "960px": "75vw" }} style = {{ width: "30vw" }}>
    <form onSubmit = {saveProject}>
          ....
          <div className = "p-dialog-footer pb-0">
              <Button label = "Submit" className = "p-button-rounded p-button-success mr-2 mb-2 success" />
          </div>
    </form>
</Dialog>

Другие вопросы по теме