react的onClick自动触发等相关问题

react分页组件遇到的问题:

  private getFirst() {
    const { pageNo } = this.state;
    if (pageNo > 3) {
      return (<span onClick={this.changePage(1)}>首页</span>);
    } else {
      return;
    }
  }
  private changePage (index: number) {
    this.setState({ pageNo: index });
  }

这段代码的onClick直接报错:不能将类型“void”分配给类型“((event: MouseEvent<HTMLSpanElement>) => void) | undefined”,这个报错看得我莫名其妙……
同事告诉我要给changePage函数加个return ()=>{}形成闭包。其实后来我才发现,虽然changePage写得很像function,但其只是一个变量而已,所以并不满足onClick的内容是方法的情况。

  private getFirst() {
    const { pageNo } = this.state;
    if (pageNo > 3) {
      return (<span onClick={this.changePage(1)}>首页</span>);
    } else {
      return;
    }
  }

  private changePage (index: number) {
    return () => {this.setState({ pageNo: index });}
  }

这样写虽然不报错,但有个严重的问题,每次生成UI时它都会自动触发onClick,这个机制真是???……所以最后改成了:

  private getFirst() {
    const { pageNo } = this.state;
    if (pageNo > 3) {
      return (<span onClick={()=>this.changePage(1)}>首页</span>);
    } else {
      return;
    }
  }
  private changePage (index: number) {
    this.setState({ pageNo: index });
  }

再补充一个使用的例子:

import React from 'react';

interface Iprops {
  name: string;
  click: any;
}

const ButtonItem = (props: Iprops) => {
  return <div onClick={props.click}>{props.name}</div>
}

const ContentMenu: React.FC<{}> = () => {
  const product = (type: number) => {
    return () => {
      alert(type);
    }
  }

  return (
    <div>
      <ButtonItem name="生成1" click={product(1)} />
    </div>
  );
};

export default ContentMenu;

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值