12

我有这个反应组件。这没有正确渲染,但会收到一个烦人的警告,例如

函数作为 React 子级无效。如果您返回 Component 而不是从渲染中返回,则可能会发生这种情况。或者,也许您打算调用此函数而不是返回它。

这是我的组件。我在这里做错了什么?

import React, { Component } from 'react';

class Squares extends Component {   

    constructor(props){
        super(props);
        this.createSquare = this.createSquare.bind(this);
    }

    createSquare() {
        let indents = [], rows = this.props.rows, cols = this.props.cols;
        let squareSize = 50;
        for (let i = 0; i < rows; i++) {
            for (let j = 0; i < cols; j++) {
                let topPosition = j * squareSize;
                let leftPosition = i * squareSize;
                let divStyle = {
                    top: topPosition+'px', 
                    left: leftPosition+'px'
                };
                indents.push(<div style={divStyle}></div>);
            }   
          }
        return indents;
    }    

    render() {
      return (
        <div>
            {this.createSquare()}
        </div>
      );
    }
}

export default Squares;

更新

@Ross Allen - 进行更改后,渲染方法似乎处于无限循环中,可能会导致内存崩溃

4

3 回答 3

35

您需要调用createSquare,现在您只是传递对函数的引用。在其后添加括号:

render() {
  return (
    <div>
      {this.createSquare()}
    </div>
  );
}
于 2018-07-07T05:21:36.297 回答
6

React 使用 JSX 来呈现 HTML,并且 render() 中的返回函数应该只包含 HTML 元素,并且任何需要评估的表达式必须{ }https://reactjs.org/docs/introducing-jsx.html中解释。但最好的做法是在 render() 内部进行任何 return 之外的操作,您可以在其中存储值并在 return() 中引用它们,并将使用限制{ }为仅简单的表达式评估。请参阅与 React 的深度 JSX 集成https://reactjs.org/docs/jsx-in-depth.html

render() {
var sq = this.createSquare();
return (
  <div>
    {sq}
  </div>
);

罗斯艾伦的回答也很好,重点是在 JSX 内部包含任何操作/评估{ }

于 2018-07-07T05:56:36.487 回答
-3

你只需要从你的函数调用中删除 () 。

render() {
  return (
    <div>
        {this.createSquare}
    </div>
  );
}
于 2019-01-02T21:22:12.520 回答