美文网首页react
react中this的绑定

react中this的绑定

作者: nico1988 | 来源:发表于2019-05-17 20:19 被阅读0次

JavaScript中this的绑定是头疼的问题,于是出现了call,apply,bind三兄弟用来改变函数调用时this的指向

react环境下也存在这个问题, 第一次碰到这个问题时,不免会认为啥react连这个都没搞定

class Search extends Component {
    static propTypes = {
        onSearch: React.PropTypes.func.isRequired
    }
    onSearch() {
        console.log('表单值:', this.field.getValues());
        this.props.onSearch(this.field.getValues());
    }
    render(){
        const {init} = this.field;
        return <div>
            <Form direction="hoz" labelAlign="left">
                    <FormItem label="loginID:">
                        <Input placeholder="请输入loginID" {...init('loginID')}/>
                    </FormItem>
                     {/*这里的this其实指向window 而不是我们想当然的Search,函数的this指向跟函数的执行上下文时有关系的*/}
                    <Button type="primary" onClick={this.onSearch}>搜索</Button>
            </Form>
        </div>
    }
}

解决办法

1、 通过bind绑定

class Search extends Component {
    render(){
        return <div>
            <Form direction="hoz" labelAlign="left">
                    <FormItem label="loginID:">
                        <Input placeholder="请输入loginID" {...init('loginID')}/>
                    </FormItem>
                    <Button type="primary" onClick={this.onSearch.bind(this)}>搜索</Button>
            </Form>
        </div>
    }
}

2、 :: es7 stage-0 proposal, 其实就是bind的语法糖,babel已经支持

class Search extends Component {
    render(){
        return <div>
            <Form direction="hoz" labelAlign="left">
                    <FormItem label="loginID:">
                        <Input placeholder="请输入loginID" {...init('loginID')}/>
                    </FormItem>
                    <Button type="primary" onClick={::this.onSearch}>搜索</Button>
            </Form>
        </div>
    }
}

3、 在构造函数中统一绑定this

class Search extends Component {
    constructor(props) {
        super(props);
        this.onSearch = this.onSearch.bind(this)
        // 如果很多的 话,这里貌似有点臃肿
    }
    render(){
        return <div>
            <Form direction="hoz" labelAlign="left">
                    <FormItem label="loginID:">
                        <Input placeholder="请输入loginID" {...init('loginID')}/>
                    </FormItem>
                    <Button type="primary" onClick={this.onSearch}>搜索</Button>
            </Form>
        </div>
    }
}

4、使用箭头函数 原理:箭头函数自身没有this的绑定,会寻找外层对象

class Search extends Component {
    render(){
        return <div>
            <Form direction="hoz" labelAlign="left">
                    <FormItem label="loginID:">
                        <Input placeholder="请输入loginID" {...init('loginID')}/>
                    </FormItem>
                    <Button type="primary" onClick={(...args)=>{
                        this.onSearch( ...args)
                    }}>搜索</Button>
            </Form>
        </div>
    }
}

5、 通过第三方插件 core-decorators.js
写法类似java的注解

class Search extends Component {
    @autobind
    onSearch() {
        console.log('表单值:', this.field.getValues());
        this.props.onSearch(this.field.getValues());
    }
    render(){
        const {init} = this.field;
        return <div>
            <Form direction="hoz" labelAlign="left">
                    <FormItem label="loginID:">
                        <Input placeholder="请输入loginID" {...init('loginID')}/>
                    </FormItem>
                    <Button type="primary" onClick={this.onSearch}>搜索</Button>
            </Form>
        </div>
    }
}

相关文章

  • react事件、生命周期

    事件 react中、原生事件绑定丢失this,绑定this写法 jsx中onClosed={ this.handl...

  • react中的this

    在ES6写法中的react:React.Component创建组件,其成员不会自动绑定this,需要手动绑定。手动...

  • 学习react总结知识点

    传统HTML中 handleclick函数自动绑定了this,而react中 需要手动绑定,下面是回调函数绑定...

  • react中绑定this

    在开发过程中,react定义的组件中,如果不为事件处理程序绑定this: 当我点击按钮,页面将报错,我将this打...

  • React中的this绑定

    在编写react组件时经常需要进行函数的this绑定,使用ES6方式创建的组件中的函数必须手动绑定this,thi...

  • react中this的绑定

    JavaScript中this的绑定是头疼的问题,于是出现了call,apply,bind三兄弟用来改变函数调用时...

  • #React-Redux

    React-Redux是Redux的官方React绑定库。它能够使你的React组件从Redux store中读取...

  • Vue和React数据绑定对比

    在数据绑定上来说,vue的特色是双向数据绑定,而在react中是单向数据绑定。 一 单向和双向数据绑定其实不是完全...

  • Vue.js数据双向绑定实现

    目前的几种主流前端框架中,react是单向绑定,而angular.js和vue.js是双向绑定,实现双向绑定的方法...

  • React事件绑定this的几种方法

    React事件处理函数绑定this的集中方法 Follow me on GitHub React事件处理函数绑定t...

网友评论

    本文标题:react中this的绑定

    本文链接:https://www.haomeiwen.com/subject/zkkaaqtx.html