React中绑定this并给函数传参的三种方式

 更新时间:2025年07月02日 08:56:26   作者:编程的一拳超人  
React中定义一个组件,可以通过ES6版本以前的React.createClass或者ES6的class xxx extends React.Component,绑定this是react中非常重要的一部分,React中,绑定this的方式有多种,下面一一看看怎么进行this绑定并给函数传参,需要的朋友可以参考下

前言

我们先来看下面这段代码:

components/MyComponent.jsx

import React from "react";

export default class MyComponent extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      msg: "这是 MyComponent 组件 默认的msg"
    };
  }

  render() {
    return (
      <div>
        <h1>绑定This并传参</h1>
        <input type="button" value="绑定this并传参" onClick={this.changeMsg} />
        <h3>{this.state.msg}</h3>
      </div>
    );
  }

  changeMsg() {
    // 注意:这里的changeMsg()只是一个普通方法。因此,在触发的时候,这里的 this 是 undefined
    console.log(this); // 打印结果:undefined
    this.setState({
      msg: "设置 msg 为新的值"
    });
  }
}


上面的代码中,点击按钮,执行 changeMsg() 方法,尝试修改 this.state.msg 的值。但是,这个方法执行的时候,是会报错的:

Uncaught TypeError: Cannot read property 'setState' of null

而且,打印this的结果也是 undefined。这是为啥呢?因为这里的 this 并不是指向 MyComponent 组件本身。

那如何让 changeMsg() 方法里面的 this,指向MyComponent 组件呢?办法总是有的,比如说,将changeMsg() 修改为箭头函数:

  changeMsg = () => {
    console.log(this); // 打印结果:MyComponent 组件
    this.setState({
      msg: "设置 msg 为新的值"
    });
  };

那么,除了箭头函数可以 绑定 this,还有没有其他的方式呢?我们接下来讲一讲。

绑定 this 的方式一:bind()

代码举例:

import React from "react";

export default class MyComponent extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      msg: "这是 MyComponent 组件 默认的msg"
    };
  }

  render() {
    return (
      <div>
        <h1>绑定This并传参</h1>
        {/* bind 的作用:为前面的函数,修改函数内部的 this 指向。让 函数内部的this,指向 bind 参数列表中的 第一个参数 */}
        <input
          type="button"
          value="绑定this并传参"
          onClick={this.changeMsg1.bind(this)}
        />
        <h3>{this.state.msg}</h3>
      </div>
    );
  }

  changeMsg1() {
    this.setState({
      msg: "设置 msg 为新的值"
    });
  }
}

上方代码中,我们为什么用 bind(),而不是用 call/apply 呢?因为 bind() 并不会立即调用,正是我们需要的。

注意:bind 中的第一个参数,是用来修改 this 指向的。第一个参数后面的所有参数,都将作为函数的参数传递进去。

我们来看看通过 bind() 是怎么传参的。

通过 bind() 绑定this,并给函数传参

import React from "react";

export default class MyComponent extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      msg: "这是 MyComponent 组件 默认的msg"
    };
  }

  render() {
    return (
      <div>
        <h1>绑定This并传参</h1>
        {/* bind 的作用:为前面的函数,修改函数内部的 this 指向。让 函数内部的this,指向 bind 参数列表中的 第一个参数 */}
        <input type="button" value="绑定this并传参" onClick={this.changeMsg1.bind(this, "编程的一拳超人啊", "编程的一拳超人啊")} />
        <h3>{this.state.msg}</h3>
      </div>
    );
  }

  changeMsg1(arg1, arg2) {
    this.setState({
      msg: "设置 msg 为新的值" + arg1 + arg2
    });
  }
}

绑定 this 并给函数传参 的方式二:构造函数里设置 bind()

我们知道,构造函数中的 this 本身就是指向组件的实例的,所以,我们可以在这里做一些事情。

代码举例:

import React from "react";

export default class MyComponent extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      msg: "这是 MyComponent 组件 默认的msg"
    };

    // 绑定 this 并给函数传参的方式2: 在构造函数中绑定并传参
    // 注意:当一个函数调用 bind 改变了this指向后,bind 函数调用的结果,有一个【返回值】,这个值,就是被改变this指向后的函数的引用。
    // 也就是说: bind 不会修改 原函数的 this 指向,而是改变了 “函数拷贝”的this指向。
    this.changeMsg2 = this.changeMsg2.bind(this, "编程的一拳超人恩", "编程的一拳超人恩");
  }

  render() {
    return (
      <div>
        <h1>绑定This并传参</h1>
        <input type="button" value="绑定this并传参" onClick={this.changeMsg2} />
        <h3>{this.state.msg}</h3>
      </div>
    );
  }

  changeMsg2(arg1, arg2) {
    this.setState({
      msg: "设置 msg 为新的值" + arg1 + arg2
    });
  }
}


上方代码中,需要注意的是:当一个函数调用 bind 改变了this指向后,bind 函数调用的结果,有一个【返回值】,这个值,就是被改变this指向后的函数的引用。也就是说: bind 不会修改 原函数的 this 指向,而是改变了 “函数拷贝”的this指向。

绑定 this 并给函数传参 的方式三:箭头函数【荐】

第三种方式用得最多。

代码举例:

import React from "react";

export default class MyComponent extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      msg: "这是 MyComponent 组件 默认的msg"
    };
  }

  render() {
    return (
      <div>
        <h1>绑定This并传参</h1>
        <input
          type="button"
          value="绑定this并传参"
          onClick={() => {
            this.changeMsg3("编程的一拳超人3", "编程的一拳超人3");
          }}
        />
        <h3>{this.state.msg}</h3>
      </div>
    );
  }

  changeMsg3 = (arg1, arg2) => {
    // console.log(this);
    // 注意:这里的方式,是一个普通方法,因此,在触发的时候,这里的 this 是 undefined
    this.setState({
      msg: "绑定this并传参的方式3:" + arg1 + arg2
    });
  };
}


到此这篇关于React中绑定this并给函数传参的三种方式的文章就介绍到这了,更多相关React绑定this并传参内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈react 同构之样式直出

    浅谈react 同构之样式直出

    这篇文章主要介绍了浅谈react 同构之样式直出,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • React中useRef hook的简单用法

    React中useRef hook的简单用法

    useRef是react的自定义hook,它用来引用一个不需要渲染的值,这篇文章介绍useRef的简单用法,感兴趣的朋友一起看看吧
    2024-01-01
  • React18系列commit从0实现源码解析

    React18系列commit从0实现源码解析

    这篇文章主要为大家介绍了React18系列commit从0实现源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 详解react-navigation6.x路由库的基本使用

    详解react-navigation6.x路由库的基本使用

    最近两个项目都用到了React Navigation,所以就研究一下如何使用,本文主要介绍了react-navigation6.x路由库的基本使用,感兴趣的可以了解一下
    2021-11-11
  • React实现菜单栏滚动功能

    React实现菜单栏滚动功能

    本文将会基于react实现滚动菜单栏功能,点击菜单,内容区域会自动滚动到对应卡片,内容区域滑动,指定菜单栏会被选中,代码简单易懂,感兴趣的朋友一起看看吧
    2024-03-03
  • React项目中应用TypeScript的实现

    React项目中应用TypeScript的实现

    TypeScript通常都会依赖于框架,例如和vue、react 这些框架结合,本文就主要介绍了React项目中应用TypeScript的实现,分享给大家,具体如下:
    2021-09-09
  • 浅谈React之状态(State)

    浅谈React之状态(State)

    这篇文章主要介绍了浅谈React之状态(State),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • React 高阶组件与Render Props优缺点详解

    React 高阶组件与Render Props优缺点详解

    这篇文章主要weidajai 介绍了React 高阶组件与Render Props优缺点详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • React使用hook如何实现数据双向绑定

    React使用hook如何实现数据双向绑定

    这篇文章主要介绍了React使用hook如何实现数据双向绑定方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 深入理解React 三大核心属性

    深入理解React 三大核心属性

    本文主要介绍了React 三大核心属性,主要包括State属性,Props属性,Refs属性,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论