bind():您正在将组件方法绑定到组件。 React会自动为您执行此操作吗?

时间:2015-02-24 18:48:11

标签: javascript reactjs react-jsx reactjs.net

我从reactJS.NET

收到此警告
  

bind():您正在将组件方法绑定到组件。应对   以高性能的方式为您自动执行此操作,以便您可以   安全地删除此电话。见LikeCon

组件看起来像这样

var LikeCon = React.createClass({
    handleClick: function() {
            var data = new FormData();
            var like = !this.state.like;
            var likeCounter = this.state.likeCount;

            data.append("catgoryType", this.state.categoryKey);
            data.append("objectId", this.state.objectId);
            data.append("like", like);

            if(like)
                likeCounter++;
            else
                likeCounter--;

            this.setState({ like: like, likeCount: likeCounter, userId: this.state.userId, categoryKey: this.state.categoryKey, objectId: this.state.objectId});

            var xhr = new XMLHttpRequest();
            xhr.open("post", "http://localhost:2215/Home/SetLike", true);
            xhr.onload = function() {
        };
        xhr.send(data);
    },
    getInitialState: function() {
        return { like: this.props.initialLike, likeCount: this.props.initialLikeCount, userId: this.props.userId, categoryKey: this.props.categoryKey, objectId: this.props.objectId  };
    },
    render(){
        return this.renderLikeButton()
    },
    renderLikeButton(){
        return (
                content =  
                <div className="likeCon">
                    <div className={this.state.like==true ? "likeButConAct" : "likeButCon"}>
                        <div className="likeB" title={this.state.like==true ? "Unlike" : "Like"} onClick={this.handleClick.bind(this)} >
                            &nbsp;
                        </div>
                        { this.state.likeCount > 0 ? <div className="likeCount">{this.state.likeCount}</div>: null}

                    </div>
                </div>
            );
    }
})

我在调用方法handleClick时使用了一个bind,如果我删除它,我会得到另一个异常?那么我该怎样做呢?

6 个答案:

答案 0 :(得分:5)

通过*.bind(null,this)代替;

有关说明,请参阅this Google Groups thread

答案 1 :(得分:2)

react会在方法调用时自动将方法绑定到此方法。 这很有用,因为它允许您直接传递函数。 所以要避免此消息,只需传递null而不是this。 参考:AutoBind

答案 2 :(得分:1)

就我而言,以前我有这个,

<input placeholder="URL" id="txt_url" className="form-control"
        value={this.state.url} onChange={this.handleChange.bind(this)}/>

删除.bind来电解决了

<input placeholder="URL" id="txt_url" className="form-control"
        value={this.state.url} onChange={this.handleChange}/>

答案 3 :(得分:0)

删除&#34; content =&#34;或者创建一个包装div:

<div>     content = 
          <div className="likeCon">
                <div className={this.state.like==true ? "likeButConAct" : "likeButCon"}>
                    <div className="likeB" title={this.state.like==true ? "Unlike" : "Like"} onClick={this.handleClick.bind(this)} >
                        &nbsp;
                    </div>
                    { this.state.likeCount > 0 ? <div className="likeCount">{this.state.likeCount}</div>: null}

                </div>
            </div>
</div>

您需要在返回HTML中使用根元素。

答案 4 :(得分:0)

从v0.4开始为你做反应autoBind。见https://facebook.github.io/react/blog/2013/07/02/react-v0-4-autobind-by-default.html所以你不需要绑定自己

答案 5 :(得分:0)

您应该了解bind要达到的目标,我将在此解释。

首先,试着想一下谁会调用handleClick?即应该有一些像xxx.handleClickxxx这样的代码真的很重要,因为当你在this.setState内召唤handleClick时,this会引用xxxsetState仅存在于React component,因此xxx应引用component来实现您的目标,这就是.bind(this)handleClick的原因,为了在this

中设置React ComponenthandleClick

现在,回到我的第一个问题,如果你没有明确地设置this,那么xxx,在简单的javascript中,onClick回调是全局的,这意味着没有xxx,所以this应该引用全局对象,即如果我是正确的话window。但是React以一种神奇的方式将xxx设置为React Component,这就是您不需要明确设置的原因