【问题标题】:Passing an empty function into a React component将空函数传递给 React 组件
【发布时间】:2019-06-25 21:48:26
【问题描述】:

我有一个 React 组件;例如:

export class Component1 extends Component<IProps, IState> {

它接受的一个道具是一个函数:

export interface IProps {    
    a: number,
    b: number,
    onMouseClick: () => void
}

所以,当我使用这个组件时,我可以这样做:

<Component1 onMouseClick={() => this.DoStuff()} a={1} b={2} />

但是如果我想传入一个空函数,那么该函数在鼠标单击时什么也不做;例如:

<Component1 onMouseClick={() => void} a={1} b={2} />

Typescript 对我抱怨,说它需要一个表达式。我可以声明一个空函数;像这样:

<Component1 onMouseClick={() => function(){}} a={1} b={2} />

有没有更好的方法来声明一个空函数?我也有点不清楚为什么我可以在 IProps 定义中将属性 onMouseClick 分配为 void,但在使用组件时却不能。

【问题讨论】:

  • () =&gt; {}? () =&gt; void 是 void 函数的 type,因此它在接口中的使用,而不是真正的函数定义。

标签: reactjs typescript


【解决方案1】:

考虑到 linter,我认为这可能很有用

<Component1 onMouseClick={() => void undefined} a={1} b={2} />

【讨论】:

    【解决方案2】:

    void 是 JavaScript 中的运算符,后面必须跟一个表达式。所以() =&gt; void 不是有效的回调定义。 Noop 函数看起来像这样 () =&gt; {} 并且可以像这样在 jsx 中使用:

    <Component1 onMouseClick={() => {}}  a={1} b={2}/>
    

    但我宁愿让 `onMouseClick 可选,它对于组件的使用者来说更方便和明显

    interface IProps {    
       a: number,
       b: number,
       onMouseClick?: () => void
    }
    

    【讨论】:

      【解决方案3】:

      你可以让它成为可选的

      export interface IProps {    
          a: number,
          b: number,
          onMouseClick?: () => void 
      }
      

      你可能想用默认实现来做默认道具,这样你就不必在每次使用它时检查 onMouseClick 是否是一个函数

      class ... extends React.Component<...>{
       static defaultProps = {
        onMouseClick: () => null,
       }
      }
      

      【讨论】:

        【解决方案4】:

        () =&gt; void 就打字稿而言是一种类型(实际上是 Javascript 中的语法错误)。你应该试试() =&gt; void 0 这是一个返回未定义的函数

        <Component1 onMouseClick={() => void 0} a={1} b={2} />
        

        或者,如果您想允许 null 或可选,请更改道具的类型以包含 null,尽管您需要额外检查组件

        export interface IProps {    
            a: number,
            b: number,
            onMouseClick?: () => void // ? makes it optional
        }
        <Component1 a={1} b={2} /> // no error
        

        【讨论】:

          【解决方案5】:

          试试

          export interface IProps {    
              a: number,
              b: number,
              onMouseClick?: () => void
          }
          

          export interface IProps {    
              a: number,
              b: number,
              onMouseClick: () => void | null
          }
          

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-01
          • 2020-05-22
          • 2017-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-20
          • 2018-07-14
          相关资源
          最近更新 更多