React事件的正确类型是什么?

最初为了简单起见,我只是使用any。现在,我正在努力清理,完全避免使用任何东西。

简单的形式是这样的:

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>
    )
  }
}

我在这里使用什么类型作为事件类型?

反应。SyntheticEvent<EventTarget>似乎不工作,因为我得到一个错误,名称和值在目标上不存在。

对所有事件的更普遍的答案将真的很感激。

谢谢


当前回答

for update: event: React。ChangeEvent 为提交:事件:反应。FormEvent 对于点击:事件:反应。MouseEvent

其他回答

或者你可以用

const handles = (e: React.UIEvent<'type of element', UIEvent>) => {
//do something
}

这是2022年typescript编译器的推荐方式:

const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
      console.log('click');
 };

不需要添加void作为返回值,因为这是由编译器自动完成的。

以下有相同的类型:

let event1: { target: { value: any } };
let event2: { target: HTMLInputElement } }; 

for update: event: React。ChangeEvent 为提交:事件:反应。FormEvent 对于点击:事件:反应。MouseEvent

我有以下类型。Ts文件的HTML输入,选择和文本区域:

export type InputChangeEventHandler = React.ChangeEventHandler<HTMLInputElement>
export type TextareaChangeEventHandler = React.ChangeEventHandler<HTMLTextAreaElement>
export type SelectChangeEventHandler = React.ChangeEventHandler<HTMLSelectElement>

然后导入它们:

import { InputChangeEventHandler } from '../types'

然后使用它们:


const updateName: InputChangeEventHandler = (event) => {
  // Do something with `event.currentTarget.value`
}
const updateBio: TextareaChangeEventHandler = (event) => {
  // Do something with `event.currentTarget.value`
}
const updateSize: SelectChangeEventHandler = (event) => {
  // Do something with `event.currentTarget.value`
}

然后在标记上应用这些函数(替换…与其他必要的道具):

<input onChange={updateName} ... />
<textarea onChange={updateName} ... />
<select onChange={updateSize} ... >
  // ...
</select>