【问题标题】:react auto binding on click is automatic for this点击时反应自动绑定是自动的
【发布时间】:2017-01-30 04:42:52
【问题描述】:

我在一些网站上发现关于 react autobindig 的矛盾,例如:

第一个链接做手动自动绑定 React, Binding input values

class Post extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      post: this.props.data,
      comment: ''
    };
  }

  render() {
    return <div>
      <input 
        type="text" 
        value={this.state.comment} 
        onChange={ this.handleChange.bind(this) } 
        placeholder="Write a comment..." />

      <button 
        className="button comments" 
        onClick={ this.handleClick.bind(this, this.state.post.id)}>Button</button>
    </div>
    }

  handleClick(postId, e) {
    console.log( postId );
    console.log( this.state.comment );
  }

  handleChange(e) {
    this.setState({ comment: e.target.value });
  }
}

第二个链接做自动 http://buildwithreact.com/tutorial/state

在最后一个链接上:

var CowClicker = React.createClass({
  getInitialState: function() {
    return {
      clicks: 0
    };
  },

  onCowClick: function(evt) {
    this.setState({
      clicks: this.state.clicks + 1
    });
  },

  render: function() {
    return (
      <div>
        <div>Clicks: {this.state.clicks}</div>
        <img
          src="http://s3.bypaulshen.com/buildwithreact/cow.png"
          onClick={this.onCowClick}
          className="cow"
        />
        <p>Click the cow</p>
      </div>
    );
  }
});

ReactDOM.render(
  <CowClicker />,
  document.getElementById('container')

"注意:自动绑定 您可能会惊讶我们不需要将回调作为 this.onCowClick.bind(this) 传递。 (如果没有,请阅读此内容)。这是因为 React 出于性能原因自动绑定组件实例上的方法。在这里阅读更多内容。”

React 自动绑定?如果答案是“是”,有时您需要在某些情况下使用 onclick 手动绑定??

【问题讨论】:

  • 如果你使用 createClass,react 会自动绑定。您无需手动操作。
  • 谢谢,我已经更新了我的答案,第一个代码链接,手册,为什么?谢谢

标签: reactjs


【解决方案1】:

在 React v0.13 中,引入了 es6 类,并且没有自动绑定。 React v0.4 中引入了自动绑定。

如果您有一些使用 React 版本低于 v0.4 的旧项目,则没有自动绑定。

我也对学习材料感到困惑,我创建了一个 post 来讨论这个问题。

【讨论】:

  • 不错的博客,我看得更清楚,我更喜欢 ES6,你尝试过 typescript 吗?我想用打字稿编码,但我不确定
  • 我没有尝试过打字稿,但我相信它也可以。由于 typescript 是 javascript 的扩展,它不会改变 js 定义的行为
【解决方案2】:

正如用户 @havenchyk 解释的那样,

使用 React.createClass 会自动为我们正确绑定这些值,但是使用 ES6 类时的更改会影响这一点。与 ES6 类略有不同,类的属性不会自动绑定到 React 类实例。

来源:https://toddmotto.com/react-create-class-versus-component/

  • 在您的第一个示例中,他们使用的是 ES6 方法。其次,他们使用的是传统的

【讨论】:

    【解决方案3】:

    当你使用 React.createClass 时,为你做绑定。
    如果您使用的是 es6 类语法,则不再为您绑定。
    这意味着您应该手动执行.bind(this)

    但您可以使用不定义自己的this 值的胖箭头函数,而是将它们绑定到当前上下文的lexical this

    看看http://codepen.io/dagman/pen/wzgvja

    class Button extends React.Component {
        handleClick = () => {
            alert('Hello World');
        };
        render() {
            return (
                <button onClick={this.handleClick}>button</button>
            );
        }
    }
    
    ReactDOM.render(
        <Button />,
        document.getElementById('mount-node')
    );
    

    【讨论】:

    • React.createClass 自动绑定,但 React.Component 不是,它是 React.createClass 旧方式?我一定不能用吗?谢谢
    • 来自官方文档:“我们的最终目标是让 ES6 类完全替换 React.createClass,但在我们替换当前的 mixin 用例并支持该语言中的类属性初始化器之前,我们不打算弃用 React.createClass。”什么意思?
    • 我不认为 React.createClass 旧方式因为你也可以使用 es6 很酷的东西。我认为这只是偏好问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2022-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多