react中关于函数调用()与bind this的原因及分析

 更新时间:2023年02月12日 14:58:27   作者:漫漫想想  
这篇文章主要介绍了react中关于函数调用()与bind this的原因及分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

关于函数调用()与bind this的原因

以下内容主要基于onClick的回调函数解决方案

官方文档对于jsx回调函数解释

  • 对待 JSX 回调函数中的 this,在 JavaScript 中,class 的方法默认不会绑定 this。
  • 如果你忘记绑定this.handleClick 并把它传入了 onClick,当你调用这个函数的时候 this 的值为 undefined。
//函数组件则就是 无状态组件  只负责数据的展示(静态)
//类组件这就是有状态组件      负责更新ui,让页面动起来
//状态(state )就是数据,是组件内部的私有数据,只能在组件内部使用
//state的值是对象,即就是一个组件内部可以拥有多个数据
class StateComponent extends React.Component{
  //使用es6简化办法初始化
  //state={
  //  count:0
  //}
   constructor(props) {
    super(props);
    this.state = {count: 0};
    this.addClick3 = this.addClick3.bind(this);
  }
  addClick(){
    this.setState({count : this.state.count + 1});
  }
  addClick2=()=>{
    this.setState({count : this.state.count + 1});
  }
  addClick3(){
    this.setState({count : this.state.count + 1});
  }
  render(){
    return(
      <>
    <button onClick={()=>{
      this.setState({
        count: this.state.count+1
      })
    }}>有状态组件,{this.state.count}</button>

    <button onClick={this.addClick.bind(this)} >不使用constructor,使用注释的es6简化写法</button>
    <button onClick={()=>this.addClick()} >箭头函数使用</button>
    <button onClick={this.addClick2} >使用箭头函数</button>
    <button onClick={this.addClick3} >constructor中进行绑定后可使用</button>
    </>
    )
  }
}

由于初学js以及react框架,所以对于jsx插值表达式中的函数调用有些疑问

function check(){
}

1、有些插值表达式调用函数不需要使用(),如{check};但是有些地方调用则需要使用(),如{check()}

2、在使用react中的onClick函数时,调用函数如果函数内部没有使用this,则可以直接调用{check};如果使用了this则需要使用特殊处理,如最顶部的代码所示。

答1

在界面直接使用jsx插值表达式,如果是希望直接返回函数结果,需要使用{check()};如果不需要直接调用函数,而是等待某些触发条件再调用函数{check}。这里函数的()即就是函数调用,而函数名是指向函数体的指针。

react官网对于以下问题的解答可以很好地看出()的区别

为什么我的函数每次组件渲染时都会被调用?

确保你在传递一个函数给组件时,没有调用这个函数:

hadleClick(){
 return <div>hello world</div>
 //函数体内部没有使用this
}
render() {
  // Wrong: handleClick is called instead of passed as a reference!
  return <button onClick={this.handleClick()}>Click Me</button>
}

正确做法是,传递函数本身(不带括号):

render() {
  // Correct: handleClick is passed as a reference!
  return <button onClick={this.handleClick}>Click Me</button>
}

答2

js本身有一个特性,如果直接调用函数,尽管函数内部使用了this也可以正常使用。但是如果函数内容使用了this,但是不是直接调用这个函数,则内部的this会丢失,this会变成undefined。

所以下面代码中renderList()直接调用,使用{this.renderList()},尽管函数体内部使用了this,也不需要特殊处理。

但是onClick就不是直接调用。这里的onClick就相当于一个中间量。

函数体内部的this指向会丢失。

class Comment extends React.Component{
    state={
         comments:[
            {id:1,name:'jack',comment:"沙发"},
            {id:2,name:"tom",comment:'沙发不错'},
            {id:3,name:"blue",comment:"还行"}
         ]
    }
    renderList(){
        return(
            this.state.comments.kength===0?
                <div className="no-comment" >暂无评论,快去评论</div>:
                <ul >
              {this.state.comments&&this.state.comments.map(comment=>
                  <li key={comment.id}><h3>评论人:{comment.name}</h3>
                  <p>评论内容 :{comment.content}</p>
                  </li>
              )} 
               </ul>
              
        )
    }
      render(){
        return(
            <>
            {this.renderList()}
             </>
        )
      }

}

this的丢失可以使用箭头函数来解决,因为箭头函数具有如下特质:

箭头函数的时候,箭头函数会默认帮我们绑定外层 this 的值,所以在箭头函数中 this 的值和外层的 this 是一样的。

因此可以通过使用箭头函数避免this的丢失,当然为了避免this的丢失还有很多种方式

1、使用es5的语法,在初始化component的时候使用constructor,对函数进行绑定

2、在中间量声明时使用bind(this) 进行绑定

3、中间量声明函数时使用箭头函数,可以直接进行函数调用;或者将函数内容直接书写在箭头函数内(注意这里进行函数调用时需要使用函数名+(),因为在函数内部声明是直接调用)

4、最常用的方式,使用箭头函数声明函数,则可以直接调用,不需要额外处理

总结

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

相关文章

  • React类组件中super()和super(props)的区别详解

    React类组件中super()和super(props)的区别详解

    这篇文章给大家详细介绍了React类组件中super()和super(props)有什么区别,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • react实现todolist的增删改查详解

    react实现todolist的增删改查详解

    这篇文章主要为大家介绍了react实现todolist的增删改查,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • 基于CSS实现MaterialUI按钮点击动画并封装成 React 组件

    基于CSS实现MaterialUI按钮点击动画并封装成 React 组件

    笔者先后开发过基于vue,react,angular等框架的项目,碧如vue生态的elementUI, ant-design-vue, iView等成熟的UI框架, react生态的ant-design, materialUI等,这些第三方UI框架极大的降低了我们开发一个项目的成本和复杂度,使开发者更专注于实现业务逻辑和服务化
    2021-11-11
  • 详解React-Native全球化多语言切换工具库react-native-i18n

    详解React-Native全球化多语言切换工具库react-native-i18n

    这篇文章主要介绍了详解React-Native全球化语言切换工具库react-native-i18n,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • react-router 路由切换动画的实现示例

    react-router 路由切换动画的实现示例

    这篇文章主要介绍了react-router 路由切换动画的实现示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 编写React组件项目实践分析

    编写React组件项目实践分析

    本文通过实例给大家分享了编写React组件项目实践的全过程,对此有兴趣的朋友可以参考下。
    2018-03-03
  • React和Vue实现文件下载进度条

    React和Vue实现文件下载进度条

    本文主要介绍了React和Vue实现文件下载进度条,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Electron整合React使用搭建开发环境的步骤详解

    Electron整合React使用搭建开发环境的步骤详解

    这篇文章主要介绍了Electron整合React使用搭建开发环境,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2020-06-06
  • React 高德地图进京证路线规划问题记录(汇总)

    React 高德地图进京证路线规划问题记录(汇总)

    这篇文章主要介绍了React高德地图进京证路线规划问题小记,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • 详解React 和 Redux的关系

    详解React 和 Redux的关系

    这篇文章主要为大家介绍了React 和 Redux的关系,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11

最新评论