React 事件处理:bind(this) 原理与实际开发常用写法

React 事件处理:bind(this) 原理与实际开发常用写法

对于 React 开发,你需要先理解一个结论:

bind(this) 主要用于早期 React Class 组件。现代 React 函数组件基本不需要它,工作中更常见的是 onClick、onChange、箭头函数和 useState。

一、bind(this) 是干什么的?

bind(this) 是 JavaScript 提供的方法,用来固定函数执行时 this 的指向。

例如:

ini 复制代码
const user = {
  name: "Kevin",

  sayHello() {
    console.log(this.name);
  }
};

const fn = user.sayHello.bind(user);

fn(); // Kevin

这里:

  • user.sayHello:获取函数本身。
  • .bind(user):创建一个新函数,把 this 绑定为 user。
  • fn():执行绑定后的函数。

为什么早期 React 需要 bind(this)?

因为 Class 组件中经常需要通过 this 访问组件状态。

kotlin 复制代码
class Counter extends React.Component {
  constructor(props) {
    super(props);

    this.state = { count: 0 };

    // 绑定 this
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState({
      count: this.state.count + 1
    });
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.count}
      </button>
    );
  }
}

如果不绑定,普通类方法作为回调传出去后,执行时可能丢失原本的 this,导致无法访问组件实例。

但现在 React 主要使用函数组件,所以你了解这个原理就够了。

二、实际 React 开发最常用的 6 种事件写法

写法 用途 重要程度
onClick={handleClick} 点击事件 P0
onClick={() => handleClick(id)} 点击时传参数 P0
onChange={(e) => ...} 输入框变化 P0
onSubmit={handleSubmit} 表单提交 P0
onClick={(e) => e.stopPropagation()} 阻止事件冒泡 P1
onKeyDown={handleKeyDown} 键盘快捷键 P1

1. onClick:普通点击事件

最常用:

javascript 复制代码
function TaskPage() {
  const handleClick = () => {
    console.log("新增任务");
  };

  return (
    <button onClick={handleClick}>
      新增任务
    </button>
  );
}

重点是:

ini 复制代码
// ✅ 正确:传递函数
onClick={handleClick}

// ❌ 错误:渲染时立即执行
onClick={handleClick()}

2. onClick:传递参数(非常常用)

比如任务列表中,每个任务都有删除按钮。

javascript 复制代码
function TaskList() {
  const handleDelete = (taskId) => {
    console.log("删除任务:", taskId);
  };

  return (
    <div>
      <button onClick={() => handleDelete(101)}>
        删除任务 101
      </button>

      <button onClick={() => handleDelete(102)}>
        删除任务 102
      </button>
    </div>
  );
}

为什么写:

scss 复制代码
onClick={() => handleDelete(101)}

因为箭头函数创建了一个回调,只有点击时才调用 handleDelete(101)。

这是实际 React 业务开发中最常见的写法之一。

3. onChange:获取输入框内容

ini 复制代码
import { useState } from "react";

function SearchBox() {
  const [keyword, setKeyword] = useState("");

  return (
    <input
      value={keyword}
      onChange={(e) => setKeyword(e.target.value)}
      placeholder="输入任务名称"
    />
  );
}

这里:

  • e:事件对象。
  • e.target:触发事件的输入框。
  • e.target.value:输入框当前的值。
  • setKeyword():更新 React 状态。

这就是 React 最常见的受控输入框。

4. onSubmit:表单提交

javascript 复制代码
function TaskForm() {
  const handleSubmit = (e) => {
    e.preventDefault();

    console.log("提交任务");
  };

  return (
    <form onSubmit={handleSubmit}>
      <input name="taskName" />

      <button type="submit">
        提交
      </button>
    </form>
  );
}

e.preventDefault() 用于阻止浏览器默认的表单提交导航行为,以便自己处理业务逻辑。

5. stopPropagation:阻止事件冒泡

例如任务卡片本身可以点击,内部还有删除按钮。

javascript 复制代码
function TaskCard() {
  const handleCardClick = () => {
    console.log("查看任务详情");
  };

  const handleDelete = (e) => {
    e.stopPropagation();

    console.log("删除任务");
  };

  return (
    <div onClick={handleCardClick}>
      <h3>任务 A</h3>

      <button onClick={handleDelete}>
        删除
      </button>
    </div>
  );
}

点击删除按钮时:

  • 不加 stopPropagation():删除按钮事件执行后,父级卡片的点击事件也可能执行。
  • 加上 stopPropagation():阻止点击事件继续向父组件传播。

实际开发中也可以通过调整交互结构,避免不必要的嵌套点击区域。

三、交互演示:React 事件是怎么工作的?

无

四、React + Ant Design 中如何处理事件?

如果你实际使用 Ant Design,常见写法是:

javascript 复制代码
import { Button, Input } from "antd";
import { useState } from "react";

export default function TaskPage() {
  const [keyword, setKeyword] = useState("");

  const handleSearch = () => {
    console.log("搜索任务:", keyword);
  };

  return (
    <div>
      <Input
        value={keyword}
        onChange={(e) => setKeyword(e.target.value)}
        placeholder="请输入任务名称"
      />

      <Button
        type="primary"
        onClick={handleSearch}
      >
        查询
      </Button>
    </div>
  );
}

这个例子你应该重点掌握:

ini 复制代码
onChange={(e) => setKeyword(e.target.value)}

onClick={handleSearch}

它们是中后台开发里非常常见的 React 事件处理写法。

五、bind、箭头函数、useCallback 怎么选择?

写法 主要用途 是否推荐优先学习
bind(this) 旧 Class 组件绑定 this 了解即可
箭头函数 () => {} 现代函数组件事件处理 强烈推荐
useCallback() 在有实际需要时缓存函数引用 后续学习

注意:useCallback 并不是 bind(this) 的替代品,它主要解决函数引用稳定性相关的问题。

六、学习重点总结

对于你目前的 React + TypeScript 开发,优先学会这四种写法:

javascript 复制代码
// 1. 普通点击
<Button onClick={handleClick}>点击</Button>

// 2. 传参点击
<Button onClick={() => handleDelete(taskId)}>删除</Button>

// 3. 输入框变化
<Input onChange={(e) => setKeyword(e.target.value)} />

// 4. 表单提交
<form onSubmit={handleSubmit}>...</form>

最终建议:bind(this) 花 5 分钟理解原理即可,真正值得重点学习的是箭头函数、React 事件对象、表单事件以及事件冒泡。

这几块掌握之后,你就能比较轻松地阅读 React + Ant Design 的大部分业务交互代码。

相关推荐
ZhengEnCi19 分钟前
小白用 AI 做官网完全指南:不用框架的六格清单,双击就能打开
前端·html·ai编程
zhanlang021734 分钟前
HTML 零基础入门到企业实战【第五章 5.2】图片路径精讲:绝对路径、相对路径、网络路径(新手必踩坑点)
前端·html
夕水1 小时前
我用trae重构了ew-color-picker,一个插件化架构的现代颜色选择器
前端·javascript·开源
Penge6661 小时前
React JSX 核心语法:从入门到业务开发实战
前端
zhanlang02171 小时前
HTML 零基础入门到企业实战全套教程【第五章 5.5 综合案例:图文影音展示页面开发】
前端·html
zhanlang02172 小时前
HTML 零基础入门到企业实战全套教程【连载 5.3】audio、video 音频视频标签|兼容格式、自动播放踩坑、企业规范
前端·html
qq_406981032 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
zhanlang02172 小时前
HTML 零基础入门到企业实战【第五章 5.4】内嵌网页 iframe 标签:嵌入网页、视频、地图实战
前端·html·音视频
2分钟速写快排10 小时前
孔乙己的茴字有多少种写法?|AI 对话实时通信的三种实现
前端·javascript·github