【问题标题】:React Typescript OnClick with optional parameters使用可选参数反应 Typescript OnClick
【发布时间】:2022-01-09 13:34:09
【问题描述】:

这有一个简单的解决方法,但我是一名学生,正在尝试学习打字稿。谢谢你的帮助。

我正在尝试将一些自定义挂钩转换为打字稿

import { useState } from 'react';

export default function useToggle(defaultValue: Boolean = false) {
  const [value, setValue] = useState(defaultValue);
  const toggleValue = (value?: boolean) => {
    setValue((currentValue) =>
      typeof value === 'boolean' ? value : !currentValue
    );
  };
  return [value, toggleValue] as const;
}

ToggleValue 的类型是 Boolean |不明确的。我想将它用作 onClick 并仅发送默认切换的功能。这在不使用打字稿时有效。我认为是因为 onClick 可以接受 undefined 但不能接受可选的布尔值。

      <button onClick={toggleValue}>toggle</button> {/* MAKE ThIS WORK? */}
      <button onClick={() => toggleValue(true)}>set True</button>
      <button onClick={() => toggleValue(false)}>set False</button>

使用 Typescript,即使不提供参数,我也需要将其编写为回调

<button onClick={()=>toggleValue()}>toggle</button> 

【问题讨论】:

  • onClick 会将事件作为回调的第一个参数传递,并且 TS 会(正确地)警告您这不是您的函数所期望的值
  • 谢谢。如果 ToggleValue() 不接受任何参数,它就可以工作。 (没有设置值功能)为什么不期望任何内容的函数会接受事件?将可选事件添加到 ToggleValue 是否有意义,或者尝试使此实现工作是一种不好的做法。
  • 按照你说的把它包起来:() =&gt; toggleValue()

标签: reactjs typescript react-hooks callback onclick


【解决方案1】:

当您将函数传递给 onClick 事件时,它总是将鼠标事件作为第一个参数传递,打字稿知道它并警告您在使用它时该事件丢失。

您有两种解决方案来处理此问题,第一种是您建议的解决方案:

<button onClick={()=>toggleValue()}>toggle</button> 

当没有参数传递给 toggleValue。

否则你可以将点击事件添加到你的toggleValue函数中:

  const toggleValue = (e: React.MouseEvent<HTMLButtonElement>, value?: boolean) => {

但是当你需要你的 toggleValue 的 value 参数时,你还必须像这样传递事件:

  <button onClick={(e) => toggleValue(e, true)}>set True</button>

【讨论】:

  • 谢谢。我在返回元组中添加了一个用于“on”和“off”的函数,并给了 toggle 一个不带参数的作业。我以为我可以使用 useCallback,但发现我只是添加了一个 shell,将类型从 Boolean 更改为 Any
猜你喜欢
  • 2017-07-24
  • 2018-05-11
  • 2020-05-29
  • 2018-06-14
  • 2020-02-07
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 2019-08-07
相关资源
最近更新 更多