为什么我们在函数引用之前添加“ ( ) => ”?
Why do we add " ( ) => " before a function reference?
我正在学习打字稿,并试图从 Microsoft Fluent UI 实现一个 detailList 组件,但我 运行 遇到了一些麻烦:
Type '(ev: React.MouseEvent<HTMLElement>, checked: boolean) => void' is not assignable to type '(event: MouseEvent<HTMLElement, MouseEvent>, checked?: boolean | undefined) => void'.
在代码中有一个名为 _onChangeCompactMode 的函数在单击切换按钮时被引用
private _onChangeCompactMode = (ev: React.MouseEvent<HTMLElement>, checked: boolean): void => {
this.setState({ isCompactMode: checked });
这里是它被引用的地方:
<Fabric>
<div className={classNames.controlWrapper}>
<Toggle
label="Enable compact mode"
checked={isCompactMode}
onChange={this._onChangeCompactMode}
onText="Compact"
offText="Normal"
styles={controlStyles}
/>
...
</Fabric>
我通过将此行 onChange={this._onChangeCompactMode}
更改为此 onChange={() => this._onChangeCompactMode}
来解决此问题
我不确定为什么会这样。我的理解是,我传递了一个函数引用。但是,如果没有 () =>
,它为什么不能正常工作呢?
这里还是新的,所以欢迎建设性的反馈。
问题是因为类型不匹配。看看 toggle documentation
onChange
具有类型:
(event: React.MouseEvent<HTMLElement>, checked?: boolean) => void
请注意,checked
是可选的,但在您的实现中不是。如果您将其设为可选,它应该可以工作:
private _onChangeCompactMode = (ev: React.MouseEvent<HTMLElement>, checked?: boolean): void => {
this.setState({ isCompactMode: checked ?? false });
现在确保添加一个默认值,因为选中是可选的,就像我对 checked ?? false
所做的那样
你必须注意 JSX 回调中 this
的含义。如果忘记绑定 this._onChangeCompactModeand
将其传递给 onChange,则在实际调用该函数时将未定义。这就是为什么您必须像以前一样使用 arrow function
。或者 _onChangeCompactMode
本身必须是一个箭头函数,像这样:
_onChangeCompactMode = () => {
// your code
}
然后传递它的引用:
onChange={this._onChangeCompactMode}
它们的工作原理应该相同
我正在学习打字稿,并试图从 Microsoft Fluent UI 实现一个 detailList 组件,但我 运行 遇到了一些麻烦:
Type '(ev: React.MouseEvent<HTMLElement>, checked: boolean) => void' is not assignable to type '(event: MouseEvent<HTMLElement, MouseEvent>, checked?: boolean | undefined) => void'.
在代码中有一个名为 _onChangeCompactMode 的函数在单击切换按钮时被引用
private _onChangeCompactMode = (ev: React.MouseEvent<HTMLElement>, checked: boolean): void => {
this.setState({ isCompactMode: checked });
这里是它被引用的地方:
<Fabric>
<div className={classNames.controlWrapper}>
<Toggle
label="Enable compact mode"
checked={isCompactMode}
onChange={this._onChangeCompactMode}
onText="Compact"
offText="Normal"
styles={controlStyles}
/>
...
</Fabric>
我通过将此行 onChange={this._onChangeCompactMode}
更改为此 onChange={() => this._onChangeCompactMode}
我不确定为什么会这样。我的理解是,我传递了一个函数引用。但是,如果没有 () =>
这里还是新的,所以欢迎建设性的反馈。
问题是因为类型不匹配。看看 toggle documentation
onChange
具有类型:
(event: React.MouseEvent<HTMLElement>, checked?: boolean) => void
请注意,checked
是可选的,但在您的实现中不是。如果您将其设为可选,它应该可以工作:
private _onChangeCompactMode = (ev: React.MouseEvent<HTMLElement>, checked?: boolean): void => {
this.setState({ isCompactMode: checked ?? false });
现在确保添加一个默认值,因为选中是可选的,就像我对 checked ?? false
你必须注意 JSX 回调中 this
的含义。如果忘记绑定 this._onChangeCompactModeand
将其传递给 onChange,则在实际调用该函数时将未定义。这就是为什么您必须像以前一样使用 arrow function
。或者 _onChangeCompactMode
本身必须是一个箭头函数,像这样:
_onChangeCompactMode = () => {
// your code
}
然后传递它的引用:
onChange={this._onChangeCompactMode}
它们的工作原理应该相同