如何在React/Jsx中的渲染函数内调用一个函数

92

我想在嵌入的HTML中调用一个函数。我尝试了下面的方法,但是函数没有被调用。这样调用渲染方法中的函数是否不正确?

import React, { Component, PropTypes } from 'react';

export default class PatientTable extends Component {
      constructor(props) {
        super(props);
        this.state = { 
         checking:false
      };
        this.renderIcon = this.renderIcon.bind(this);
  }

  renderIcon(){
    console.log("came here")
    return(
      <div>Function called</div>
    )
  }

  render() {

   return (
       <div className="patient-container">

       {this.renderIcon}      

      </div>
   );
 }
}
3个回答

140
为调用该函数,您需要添加()
{this.renderIcon()}   

3
这取决于您的需求,您可以使用 this.renderIcon() 或者绑定this.renderIcon.bind(this)。这是正确的翻译。 - arora
4
我建议不要这样做。1.) renderIcon 是/应该是一个组件。在 React 中不应该使用 {this.renderIcon()} 这种方式来使用组件。2.) render 方法是您的组件呈现内容的真实来源。将其抽象化会增加额外的复杂性。 - Galupuf
4
值得一提的是,这个答案是正确的,并且很好地回答了发布的问题。我认为值得努力教导人们,如果他们发现自己编写类似这样的代码,有理由不这样做。如果您想知道为什么这通常和客观上都是个不好的做法,请参阅此链接:https://kentcdodds.com/blog/dont-call-a-react-function-component。 - Galupuf
1
@Galupuf 我个人认为可以这样做的一个原因是,例如你有一个条件,并且不想使用嵌套的三元运算符:myConditionalRender(){ if(loading) return if(error) return return }render(){
...更多内容 ... {myConditionalRenderer()} } - jaycee
1
为什么不把那个条件放在组件里呢?这样可以达到相同的效果,而且没有任何副作用。 - Galupuf
显示剩余6条评论

19

class App extends React.Component {
  
  buttonClick(){
    console.log("came here")
    
  }
  
  subComponent() {
    return (<div>Hello World</div>);
  }
  
  render() {
    return ( 
      <div className="patient-container">
          <button onClick={this.buttonClick.bind(this)}>Click me</button>
          {this.subComponent()}
       </div>
     )
  }
  


}

ReactDOM.render(<App/>, document.getElementById('app'));
<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="app"></div>

这取决于您的需求,您可以使用 this.renderIcon()bind this.renderIcon.bind(this) 中的任一种。

更新:

这是如何在渲染外调用方法的。

buttonClick(){
    console.log("came here")
}

render() {
   return (
       <div className="patient-container">
          <button onClick={this.buttonClick.bind(this)}>Click me</button>
       </div>
   );
}

推荐的方法是编写一个单独的组件并进行导入。


1
这似乎更好,因为当您需要传递事件或参数时,它可以正常工作。 - Pranav Singh

3
修复方法在被接受的答案中。但如果有人想知道为什么它有效以及为什么SO问题的实现无效,首先,JavaScript中的函数是一等公民,这意味着它们像任何其他变量一样对待。函数可以作为参数传递给其他函数,可以由另一个函数返回,并且可以分配为变量的值。请阅读更多信息。因此,我们使用该变量通过在末尾添加圆括号()来调用函数。另外,如果您有一个返回函数并且只需要调用返回的函数的函数,则可以在调用外部函数时使用双重括号()()。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接