【问题标题】:bind() in render method gives me a warning?render 方法中的 bind() 给了我一个警告?
【发布时间】:2017-07-21 05:40:04
【问题描述】:

我的代码工作正常,但它给了我一个警告

警告:bind():您正在将组件方法绑定到组件。 React 以高性能的方式自动为您完成此操作,因此您可以安全地删除此调用。

我也使用 onClick={this.myFun.bind(null,"myvalue")} 如Why does React warn me against binding a component method to the object? 中所述

它仍然给我警告。

我的代码:

var MyClass = React.createClass({
  myFun : function (value){  
      console.log(value);  
  },
  render: function () {
  var that = this; 
    var card = this.props.data.map(function (val,key) {
      return (
        <p onClick={that.myFun.bind(null,val)}> Click Me</p>
        );
    });
    return (  
        <div>
        {card}  
        </div>
      );
  }
});  

【问题讨论】:

  • 你为什么要这样做?反应清楚说清楚
  • 我没有将它传递给绑定函数。
  • 你确定这有效吗:var this = that?
  • @Muhaimin 抱歉,这是 var that =this ;
  • 您收到此警告是因为 myFun 已绑定。你可以改用&lt;p onClick={function() { that.myFun(val); }}&gt;

标签: javascript reactjs


【解决方案1】:

您的代码有一些问题

  1. render: function () { var this = that;

    应该是

    render: function () { var that = this;

  2. return ( {card}) 将给出 you may have returned undefined or null or an Object 的错误,因此您需要将其包装在像 &lt;div&gt;{card}&lt;/div&gt; 这样的 div 中以返回 React 元素。

  3. 您的组件名称必须以大写字符开头。看这里的解释:React - Adding component after AJAX to view

查看工作演示

var MyClass = React.createClass({
  myFun : function (value){  
      console.log(value);  
  },
  render: function () {
    var that = this;
    var card = this.props.data.map(function (val,key) {
      return (
        <p key={key} onClick={that.myFun.bind(null,val)}> Click Me</p>
        );
    });
    return (
        <div>{card}</div>
      );
  }
}); 

ReactDOM.render(<MyClass data={['1', '2']}/>, document.getElementById('app'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.js"></script>
<div id="app"></div>

注意:React.createClass 已弃用,将在 v16.0 中删除 因此你应该通过扩展来编写你的组件 React.Component 语法

【讨论】:

  • " 会报错,因为 card 可能未定义或为 null " 不,不会。它实际上是对象速记符号,与{card: card} 相同。当然这不起作用,因为render 应该返回一个反应元素,而不是一个对象。所以,这是错误的,但不是因为你提到的原因。尽管您对所有这些事情都是正确的,但您仍然没有解决 OP 提出的问题。
  • @Shubham Khatri,很抱歉这个愚蠢的错误,但我已经尝试了你的建议。但这对我不起作用。它仍然给我一个警告。
  • @FelixKling 我在回答中错过了这一点。谢谢提醒
【解决方案2】:

您唯一错过的是将that 分配给this

var myClass = React.createClass({
  myFun : function (value){  
      console.log(value);  
  },
  render: function () {
    var that = this; 
    var card = this.props.data.map(function (val,key) {
      return <p onClick={that.myFun.bind(null,val)}> Click Me</p>;
    });
    return <div>{card}</div>;
  }
});

【讨论】:

    【解决方案3】:

    最好的方法是将其提取到子组件中并将参数作为道具传递。这样您就不会在每次渲染时都创建一个新函数,并且可以防止不必要的重新渲染 (More info here jsx-no-bind):

    var Item = React.createClass({
      handleClick: function() {
        this.props.onItemClick(this.props.val);
      },
      render: function() {
        return (
          <p onClick={this.handleClick}>Click Me</p>
        );
      }
    });
    
    var MyClass = React.createClass({
      myFun: function (value){  
          console.log(value);  
      },
      render: function () {
        var that = this; 
        var card = this.props.data.map(function (val, key) {
          return (
            <Item onItemClick={that.myFun} val={val} />
          );
        });
        return (
          <div>{card}</div>
        );
      }
    });
    
    ReactDOM.render(
      <MyClass data={['a', 'b', 'c']} />,
      document.getElementById('test')
    );
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id="test"></div>

    您还应该考虑使用或学习 es6,这将大大清理您的代码。

    【讨论】:

    • 我不能这样做,因为我也为其他功能使用了很多绑定。所以我不能为所有这些上课。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 2017-02-20
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多