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

目录
  • react的onClick自动触发等问题
  • react的onClick事件调用的各种写法与触发情况
    • handleClick 是普通函数
    • handleClick 是箭头函数
  • 总结

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;

react的onClick事件调用的各种写法与触发情况

handleClick 是普通函数

  handleClick(params?: any) {
    console.log('1000101010101010100');
    console.log(params);
    console.log(this)
  }
  onClick={this.handleClick}
    // 正确,但是无法传值
  onClick={this.handleClick()}
    // 在handleClick(): any,即声明返回值any 时,不需要 this.handleClick = this.handleClick.bind(this),似乎能正确使用,能获取到 this;
    // 在handleClick() 不设置 : any 时,不管是否增加 this.handleClick = this.handleClick.bind(this),都是报错,界面无法显示。
  onClick={this.handleClick.bind(this, 12)}
    // 正确,不需要 this.handleClick = this.handleClick.bind(this),能获取this,能获取参数。
  onClick={() => this.handleClick}
    // 无效且无报错,即无法触发
  onClick={() => { this.handleClick }}
    // 无效且无报错,即无法触发
  onClick={() => this.handleClick()}
    // 正确,不需要 this.handleClick = this.handleClick.bind(this),能获取this,能获取参数。
  onClick={() => { this.handleClick() }}
    // 正确,能获取this,能获取参数。

handleClick 是箭头函数

PS:箭头函数皆不需要 this.handleClick = this.handleClick.bind(this):

  handleClick = (params?: any) => {
    console.log('1000101010101010100');
    console.log(params);
    console.log(this)
  }
  onClick={this.handleClick}
    // 正确,但是无法传值
  onClick={this.handleClick()}
    // 在handleClick(): any,即声明返回值any 时,页面渲染时,自动触发onClick,且onClick点击失效;
    // 在handleClick() 不设置 : any 时,报错,界面无法显示。
  onClick={() => this.handleClick}
    // 无效且无报错,即无法触发
  onClick={() => { this.handleClick }}
    // 无效且无报错,即无法触发
  onClick={() => this.handleClick()}
    // 正确,能获取this,能获取参数。
  onClick={() => { this.handleClick() }}
    // 正确,能获取this,能获取参数。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解使用webpack+electron+reactJs开发windows桌面应用

    electron是一两年前挺火的一个框架 本质上是一个浏览器,但是集成了很多windows系统的功能,让前端开发也可以直接操作windows的窗体,做成一个实打实的桌面软件 (当然听说mac上也可以用electron,不过没试过) (没错我还在用windows,不是mac也不是linux,我是个lowB) 团队主要的技术栈是react,所以考虑用react开发,方便维护. PS.由于项目是大半年前做的,所以一些细节可能记忆有误请见谅 几个重点: 1.想要能调试必须使用webpack打包,不能用r

  • 快速创建React项目并配置webpack

    目录 1.快速创建React项目 2.安装所需包 3.根目录创建webpack.config.js文件,代码如下 4.在根目录下添加文件 .babelrc,代码如下 5.修改 package.json 6.修改public/index.html文件 7.修改src/index.js文件 8.修改src/App.js文件 9.修改 src/App.css文件 10.在项目根目录下执行 1.快速创建React项目 npm install -g create-react-app // 全局安装crea

  • 使用webpack5从0到1搭建一个react项目的实现步骤

    前言 在这之前,每开始一个新项目我都是使用现有的脚手架,这非常便于快速地启动一个新项目,而且通用的脚手架通常考虑地更加全面,也有利于项目的稳定开发:不过对于一个小项目,根据需求自己搭建可能会更好,一方面小项目不需要脚手架那么丰富的功能,另一方面可以提高对项目的掌控度以方便后期的扩展. 这篇文章是在实践中总结的,具有实操性,读者可跟着一步步进行搭建,中间我会穿插一些原理,当然因为笔者的能力有限,不会特别深入. 预备知识 熟悉Javascript && HTML && CSS

  • react实现浏览器自动刷新的示例代码

    在单页应用如此流行的今天,曾经令人惊叹的前端路由已经成为各大框架的基础标配,每个框架都提供了强大的路由功能,导致路由实现变的复杂.想要搞懂路由内部实现还是有些困难的,但是如果只想了解路由实现基本原理还是比较简单的.本文针对前端路由主流的实现方式 hash 和 history,提供了原生JS/React/Vue 共计六个版本供参考,每个版本的实现代码约 25~40 行左右(含空行). 什么是前端路由? 路由的概念来源于服务端,在服务端中路由描述的是 URL 与处理函数之间的映射关系. 在 Web

  • 通过示例源码解读React首次渲染流程

    目录 说明 题目 首次渲染流程 render beginWork completeUnitOfWork commit 准备阶段 before mutation 阶段 mutation 阶段 切换 Fiber Tree layout 阶段 题目解析 总结 说明 本文结论均基于 React 16.13.1 得出,若有出入请参考对应版本源码.参考了 React 技术揭秘. 题目 在开始进行源码分析前,我们先来看几个题目: 题目一: 渲染下面的组件,打印顺序是什么? import React from

  • jQuery如何使用自动触发事件trigger

    有时候,需要通过模拟用户操作,来达到点击的效果,例如用户进入页面后 就触发click事件,而无需主动点击. 比如以下代码: <body> <a href="#" onclick="javascript:document.getElementById('d').innerHTML='x1'">点击1</a> <a href="#" onclick="javascript:document.getE

  • 详解Jenkins 实现Gitlab事件自动触发Jenkins构建及钉钉消息推送

    实践环境 GitLab Community Edition 12.6.4 Jenkins 2.284 Post build task 1.9(Jenkins插件) Generic Webhook Trigger Plugin 1.72(Jenkins插件) GitLab 1.5.13(Jenkins插件) 实现步骤 钉钉机器人配置 选择要推送的钉钉群 -> 点击群设置按钮 -> 点击智能群助手 -> 点击添加机器人 -> 点击添加机器人+号按钮 -> 点击自定义->填写

  • js实现加载页面就自动触发超链接的示例

    如下所示: 以上这篇js实现加载页面就自动触发超链接的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • C#中winform实现自动触发鼠标、键盘事件的方法

    程序触发鼠标.键盘事件是C#程序设计中比较常见的功能,本文实例展示了C#中winform实现自动触发鼠标.键盘事件的方法,有不错的实用价值.具体如下: 要想在C#程序中触发鼠标.键盘事件就必须要调用windows函数. 一.鼠标事件的触发 1.引用windows函数mouse_event /// <summary> /// 鼠标事件 /// </summary> /// <param name="flags">事件类型</param> /

  • ASP.Net防止刷新自动触发事件的解决方案

    使用asp.net,在刷新页面的时候会自动触发服务器端的事件.举个简单的例子,如:一个注册页面,我们填写完注册信息之后,如果按F5刷新之后,会自动触发到Button事件上,这样就造成了又注册了一次的麻烦. 我先前的解决方案:用关键字查询,如有相同,则提示已有此用户. 但是这种方案不能在没有表识的情况下使用,他会重新提交.鉴于此,我寻找了一种新的解决方案,很庆幸,在朋友的提点下,迸发了这样的解决方案,肯定有更好的解决方案,不吝赐教. 解决思路:刷新时,捕捉KeyPress,让他触发其他无用的事件.

  • javascript 动态改变onclick事件触发函数代码

    javascript 动态改变onclick事件触发函数代码 function oc() { alert("原本的方法"); } function od() { alert("我改变方法了."); } function of() { document.getElementById('name').onclick = function(){ od(); }; } 原来的方法 通过点击,改变原来的方法的执行 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

  • ASP.Net中防止刷新自动触发事件的解决方案

    使用asp.net,在刷新页面的时候会自动触发服务器端的事件.举个简单的例子,如:一个注册页面,我们填写完注册信息之后,如果按F5刷新之后,会自动触发到Button事件上,这样就造成了又注册了一次的麻烦. 我先前的解决方案:用关键字查询,如有相同,则提示已有此用户. 但是这种方案不能在没有表识的情况下使用,他会重新提交.鉴于此,我寻找了一种新的解决方案,很庆幸,在朋友的提点下,迸发了这样的解决方案,肯定有更好的解决方案,不吝赐教. 解决思路:刷新时,捕捉KeyPress,让他触发其他无用的事件.

  • JQuery自动触发事件的方法

    本文实例讲述了JQuery自动触发事件的方法.分享给大家供大家参考.具体如下: 常用模拟 有时候,需要通过模拟用户操作,来达到单击的效果.例如在用户进入页面后,就触发click事件,而不需要用户去主动单击. 在JQuery中,可以使用trigger()方法完成模拟操作.例如可以使用下面的代码来触发id为btn的按钮的click事件. $('#btn').trigger("click"); 这样,当页面加载完毕后,就会立刻输出想要的效果.也可以直接简写click(),来达到同样的效果:

随机推荐