当前位置: 首页 > 知识库问答 >
问题:

Typescript:反应事件类型

洪涵亮
2023-03-14

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

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

反应。合成事件

对于所有事件的更普遍的答案,我们将不胜感激。

谢谢


共有3个答案

隗驰
2023-03-14

结合尼赞和埃德温的答案,我发现这样的东西对我很有用:

update = (e: React.FormEvent<EventTarget>): void => {
    let target = e.target as HTMLInputElement;
    this.props.login[target.name] = target.value;
}
戚宏扬
2023-03-14

问题不在于事件类型,而在于typecript中的EventTarget接口只有3个方法:

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

因此,EventTarget上不存在namevalue是正确的。您需要做的是将目标转换为具有所需属性的特定元素类型。在这种情况下,它将是HTMLInputElement

update = (e: React.SyntheticEvent): void => {
    let target = e.target as HTMLInputElement;
    this.props.login[target.name] = target.value;
}

此外,对于事件而不是React.SyntheticEvent,您还可以按以下方式键入它们:事件鼠标事件键盘事件…等等,具体取决于处理程序的使用情况。

查看所有这些类型定义的最佳方法是从两个typescript签出.d.ts文件

还要查看以下链接以获得更多解释:为什么Event.target不是Typescript中的元素?

施自怡
2023-03-14

事件接口是通用的:

interface SyntheticEvent<T> {
    ...
    currentTarget: EventTarget & T;
    ...
}

(从技术上讲,currentTarget属性位于父事件类型上。)

而且currentTarget是通用约束和EventTarget的交叉点
此外,由于您的事件是由输入元素引起的,因此您应该使用ChangeEvent(在定义文件中,react文档)。

应该是:

update = (e: React.ChangeEvent<HTMLInputElement>): void => {
    this.props.login[e.currentTarget.name] = e.currentTarget.value
}

(注意:此答案最初建议使用React.FormEvent。评论中的讨论与此建议相关,但应如上所示使用React.ChangeEvent。)

 类似资料:
  • 问题内容: 我想念一些东西。这是一个非常简单的问候世界,目标是仅触发警报事件onClick。该事件在页面加载时触发,但在单击按钮时不触发。感谢您的帮助。这是一个jsFiddle,使它更易于查看:jsFiddle 问题答案: 我认为您会犯错,因为ReactJS只是JavaScript,我认为触发此事件的方式不起作用。您的onClick应该触发一个附加到React元素的函数,就像这样。

  • 问题内容: 我有一个叫做React的组件,有很多子组件(另一个React组件)。我希望能够从内部对每个事件声明一个事件。我尝试执行以下操作: 不用说,我没有得到任何“点击!” 出现在我的控制台中 Chrome中的React检查器会指示事件已注册,并应使用上述功能体进行注册。 因此,我得出结论,我无法在实际标签上注册事件(不过,我不确定为什么会这样)。我如何才能实现这一目标呢? 问题答案: 这取决于

  • 问题内容: SyntheticEvent已合并。这意味着在调用事件回调之后,将重新使用SyntheticEvent对象,并且所有属性都将无效。这是出于性能原因。因此,您不能以异步方式访问事件。 参考:React中的事件系统 问题答案: 这意味着事件的属性仅在回调处于活动状态时存在。将异步添加到混音或存储事件以供将来使用将失败。 如果在事件处理程序中尝试,则很容易观察到。在您检查对象时,事件对象的大

  • 我正在试着用我的机器人做右舷代码,其他一切都很好。但是我正在努力让机器人忽略实际消息作者的反应。 这是我当前的代码: 它返回以下错误:

  • 有没有一种最佳实践可以将函数类型与React prop类型和TypeScript结合使用? 我以为这会奏效,但事实上它错了: 按照这个思路,我让它工作了,但它似乎不必要地冗长:https://github.com/Microsoft/TypeScript/issues/20007

  • 我有一个类扩展了React。组件类,我将为我希望接收的道具传递我自己的接口。问题是当我使用webstorm linter说有问题,指出类型“typeof SomeComponent”上不存在属性“propTypes”。 我不知道为什么会这样...... 的代码为 当我编写以下代码创建函数组件时,会引发类似的异常: 在本例中,使用