javascript - setup - Mecanografiado: Reaccionar tipos de eventos
reactdom render example (4)
Creo que la forma más simple es que:
type InputEvent = React.ChangeEvent<HTMLInputElement>;
type ButtonEvent = React.MouseEvent<HTMLButtonElement>;
update = (e: InputEvent): void => this.props.login[e.target.name] = e.target.value;
submit = (e: ButtonEvent): void => {
this.props.login.logIn();
e.preventDefault();
}
¿Cuál es el tipo correcto para los eventos React?
Inicialmente solo usé
any
por simplicidad.
Ahora, estoy tratando de limpiar las cosas y evitar el uso por completo.
Entonces, en una forma simple como esta:
export interface LoginProps {
login: {
[k: string]: string | Function
uname: string
passw: string
logIn: Function
}
}
@inject(''login'') @observer
export class Login extends Component<LoginProps, {}> {
update = (e: React.SyntheticEvent<EventTarget>): void => {
this.props.login[e.target.name] = e.target.value
}
submit = (e: any): void => {
this.props.login.logIn()
e.preventDefault()
}
render() {
const { uname, passw } = this.props.login
return (
<div id=''login'' >
<form>
<input
placeholder=''Username''
type="text"
name=''uname''
value={uname}
onChange={this.update}
/>
<input
placeholder=''Password''
type="password"
name=''passw''
value={passw}
onChange={this.update}
/>
<button type="submit" onClick={this.submit} >
Submit
</button>
</form>
</div>
)
}
}
¿Qué tipo uso aquí como tipo de evento?
React.SyntheticEvent<EventTarget>
no parece funcionar ya que aparece un error de que el
name
y el
value
no existen en el
target
.
Se agradecería una respuesta más generalizada para todos los eventos.
Gracias
El problema no es con el tipo de evento, sino que la interfaz EventTarget en mecanografiado solo tiene 3 métodos:
interface EventTarget {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
dispatchEvent(evt: Event): boolean;
removeEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
interface SyntheticEvent {
bubbles: boolean;
cancelable: boolean;
currentTarget: EventTarget;
defaultPrevented: boolean;
eventPhase: number;
isTrusted: boolean;
nativeEvent: Event;
preventDefault(): void;
stopPropagation(): void;
target: EventTarget;
timeStamp: Date;
type: string;
}
Por lo tanto, es correcto que el
name
y el
value
no existan en EventTarget.
Lo que debe hacer es convertir el destino en el tipo de elemento específico con las propiedades que necesita.
En este caso será
HTMLInputElement
.
update = (e: React.SyntheticEvent): void => {
let target = e.target as HTMLInputElement;
this.props.login[target.name] = target.value;
}
También para eventos en lugar de React.SyntheticEvent, también puede escribirlos de la siguiente manera:
Event
,
MouseEvent
,
KeyboardEvent
... etc., depende del caso de uso del controlador.
La mejor manera de ver todas estas definiciones de tipos es verificar los archivos .d.ts de ambos tipos de letra y reaccionar.
Consulte también el siguiente enlace para obtener más explicaciones: ¿Por qué Event.target no es Element en Typecript?
La interfaz SyntheticEvent es genérica:
interface SyntheticEvent<T> {
...
currentTarget: EventTarget & T;
...
}
Y el
currentTarget
es una intersección de la restricción genérica y
EventTarget
.
Además, dado que sus eventos son causados por un elemento de entrada, debe usar
FormEvent
(
en el archivo de definición
,
los documentos de reacción
).
Debiera ser:
update = (e: React.FormEvent<HTMLInputElement>): void => {
this.props.login[e.currentTarget.name] = e.currentTarget.value
}
Para combinar las respuestas de Nitzan y Edwin, descubrí que algo como esto funciona para mí:
update = (e: React.FormEvent<EventTarget>): void => {
let target = e.target as HTMLInputElement;
this.props.login[target.name] = target.value;
}