Как печатать менее многословно

Мне было интересно, можно ли ввести handleSubmit менее подробным способом. Возможно, создав новый интерфейс, поместив eventDefault. Как бы я это сделал?

  import {Project} from "../ProjectsPage/Project";

interface FormTypeProps {
    onCancel: () => void;
    onSave: (project: Project) => void;
}

export function ProjectForm({onCancel, onSave}: FormTypeProps) {
    const handleSubmit = (event: { preventDefault: () => void; }) => {
        event.preventDefault()
        onSave(new Project({name: 'Update Project'}))
    }


    return (
        <form className = "input-group vertical" onSubmit = {handleSubmit}>
            <label htmlFor = "name">Project Name</label>
            <input type = "text" name = "name" placeholder = "enter name"/>
            <label htmlFor = "description">Project Description</label>
            <textarea name = "description" placeholder = "enter description"/>
            <label htmlFor = "budget">Project Budget</label>
            <input type = "number" name = "budget" placeholder = "enter budget"/>
            <label htmlFor = "isActive">Active?</label>
            <input type = "checkbox" name = "isActive"/>
            <div className = "input-group">
                <button className = "primary bordered medium">Save</button>
                <span/>
                <button type = "button" className = "bordered medium" onClick = {onCancel}>
                    Cancel
                </button>
            </div>
        </form>
    )
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете присвоить тип либо самой функции, либо аргументам функции, которая является событием.


React.FormEventHandler<HTMLFormElement>

Это тип функции. Если вы используете это так:

handleSubmit: React.FormEventHandler<HTMLFormElement> = e => {
}

Тогда тип переменной e будет автоматически определен как React.FormEvent. Таким образом, вам на самом деле не нужно знать тип события, потому что вы можете применить тип к самой функции и получить правильный тип.


Или вы можете присвоить тип аргументу события e.

handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
}

Теперь тип свойства handleSubmit выводится как (e: React.FormEvent<HTMLFormElement>) => void.

Как будет выглядеть синтаксис?

Stlick 16.03.2022 18:53

Нет, параметр event не является FormEventHandler<T>. А откуда взялся T?

T.J. Crowder 16.03.2022 18:56

Спасибо за ваш комментарий. Обновлено

Egor 16.03.2022 19:05
Ответ принят как подходящий

Вы можете использовать React.FormEvent как тип параметра event:

import React, { FormEvent } from "react";

// ...

const handleSubmit = (event: FormEvent) => {
    event.preventDefault();
    // ...
};

React имеет свои собственные синтетические типы событий для различных событий, которые вы используете при настройке обработчика таким образом, как вы, со свойством onXyz на элементе. (При настройке обработчика через addEventListener, что все еще иногда необходимо, важно нет использовать синтетические типы событий React, поскольку вы настраиваете не обработчик событий React, вы настраиваете обработчик событий DOM. Но с как вы это делаете, вам нужен синтетический тип.)

Вы мог вводите саму функцию как FormEventHandler<HTMLFormElement>:

import React, { FormEvent } from "react";

// ...

const handleSubmit: FormEventHandler = (event) => {
    event.preventDefault();
    // ...
};

Обратите внимание, что и FormEvent, и FormEventHandler являются универсальными типами, принимающими аргумент типа для типа элемента, которым будет target. По умолчанию используется Element, чего часто бывает достаточно, но вы также можете поставить HTMLFormElement (например, FormEvent<HTMLFormElement>), если хотите быть более тщательным.

Спасибо за ответ! Пользуясь темой, не подскажете, не лагает ли этот метод типа? Я обновлю пост.

Stlick 16.03.2022 19:14

@Stlick - боюсь, я не знаю, что вы подразумеваете под «отставанием».

T.J. Crowder 16.03.2022 19:16

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