react中为什么要bind?bind的三种方法

为什么?

1.JavaScript自身特性说明

如果传递一个函数名给一个变量,之后通过函数名()的方式进行调用,在方法内部如果使用this则this的指向会丢失。

示例代码:

首先我们创建test对象并直接调用方法 :

const test = {

    name:'jack',

    getName:function(){

        console.log(this.name)

    }

}

test.getName()

const test = {

    name:'jack',

    getName:function(){        console.log(this.name)

    }

}

test.getName()

使用node test.js执行上述代码可以正常输出jack。

之后,我们对代码进行调整:

const test = {

    name:'jack',

    getJack:function(){

        console.log(this.name)

    }

}

const func = test.getJack;

func();

我们没有直接调用对象的方法,而是将方法声明给一个中间变量,之后利用中间变量()调用方法,此时this则失去指向,输出undefined,如果使用node环境执行js文件则输出node相关信息,如嵌入到html中则this指向window对象。

2.React事件绑定

React中的bind同上方原理一致,在JSX中传递的事件不是一个字符串,而是一个函数(如:onClick={this.handleClick}),此时onClick即是中间变量,所以处理函数中的this指向会丢失。解决这个问题就是给调用函数时bind(this),从而使得无论事件处理函数如何传递,this指向都是当前实例化对象。

当然,如果不想使用bind(this),我们可以在声明函数时使用箭头函数将函数内容返回给一个变量,并在调用时直接使用this.变量名即可。示例代码如下:

import React from 'react';

export default class Life extends React.Component{

    constructor(props){

        super(props);

        this.state = {

            count:4

        };

    }

    render(){

        var style = {

            padding:'10px',

            color:'red',

            fontSize:'30px'

        }

        return (

            <div style={style}>{/*注意js语法使用一个括号{}去表示,style使用两个括号,原因里面其实是一个对象*/}

                <p>React生命周期介绍</p>

                <button onClick={this.handleAdd}>无bind点击一下</button>

                <button onClick={this.handleClick.bind(this)}>有bind点击一下</button>

                <p>{this.state.count}</p>

            </div>

        )

    }

    //此时this指向是当前实例对象

    handleAdd = ()=> {

        console.log(this)

        this.setState({

            count:5

        })

    }

    handleClick(){

        this.setState({

            count:6

        })

    }

}





REACT 函数BIND(THIS)的三种方式

1.在调用地方直接bind(this)

handleClick(){

this.setState({

word2:'word2 changed'

})

}

<button onClick={this.handleClick.bind(this)}>点击</button>

2、使用ES6 箭头函数

handleClick=()=>{

this.setState({

word2:'word2 changed'

})

}

<button onClick={this.handleClick}>点击</button>

3、构造函数中bind(this)

constructor(props){

super(props);

this.state=({

word2:'word2'

})

this.handleClick = this.handleClick.bind(this);

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 40、React 什么是React?React 是一个用于构建用户界面的框架(采用的是MVC模式):集中处理VIE...
    萌妹撒阅读 1,196评论 0 1
  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,684评论 1 33
  • 现在最热门的前端框架,毫无疑问是React。在基于React的React Native发布一天之内,就获得了 50...
    Mycro阅读 1,127评论 3 6
  • 现在最热门的前端框架,毫无疑问是 React 。上周,基于 React 的 React Native 发布,结果一...
    sakura_L阅读 490评论 0 0
  • 我为他人着想 他人却觉得这是可利用的机会 对小人做好事是吃亏的 算了吧,给他,就一点钱 就是最近受地藏王菩萨的熏陶...
    奋力向前冲阅读 223评论 0 1

友情链接更多精彩内容