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>
)
}
}
我在这里使用什么类型作为事件类型?
反应。合成事件
对于所有事件的更普遍的答案,我们将不胜感激。
谢谢
结合尼赞和埃德温的答案,我发现这样的东西对我很有用:
update = (e: React.FormEvent<EventTarget>): void => {
let target = e.target as HTMLInputElement;
this.props.login[target.name] = target.value;
}
问题不在于事件类型,而在于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上不存在name
和value
是正确的。您需要做的是将目标转换为具有所需属性的特定元素类型。在这种情况下,它将是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中的元素?
事件接口是通用的:
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”。 我不知道为什么会这样...... 的代码为 当我编写以下代码创建函数组件时,会引发类似的异常: 在本例中,使用