函数作为React子函数无效.如果返回Component而不是render,则可能会发生这种情况

lea*_*ner 44 javascript reactjs higher-order-components

我写了一个高阶组件:

import React from 'react';


const NewHOC = (PassedComponent) => {
    return class extends React.Component {
        render(){
            return (
                <div>
                    <PassedComponent {...this.props}/>
                </div>
            )
        }
    }
}

export default NewHOC;
Run Code Online (Sandbox Code Playgroud)

我在我的App.js中使用上面的内容:

import React from 'react';
import Movie from './movie/Movie';
import MyHOC from './hoc/MyHOC';
import NewHOC from './hoc/NewHOC';
export default class App extends React.Component {
  render() {
   return (
    <div>
     Hello From React!!
     <NewHOC>
        <Movie name="Blade Runner"></Movie>
     </NewHOC>
    </div>
   );
  }
 }
Run Code Online (Sandbox Code Playgroud)

但是,我得到的警告是:

警告:函数作为React子函数无效.如果返回Component而不是render,则可能会发生这种情况.或许你打算调用这个函数而不是返回它.在App中由div(由App创建)中的NewHOC(由App创建)

Movie.js文件是:

import React from "react";

export default class Movie extends React.Component{
    render() {
        return <div>
            Hello from Movie {this.props.name}
            {this.props.children}</div>
    }
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Chi*_*man 142

我也遇到了这个错误,因为我在路由时没有使用正确的snytax。这是在我的 App.js 的<Routes>部分下:

错误的:

<Route path="/movies/list" exact element={ MoviesList } />
Run Code Online (Sandbox Code Playgroud)

正确的:

<Route path="/movies/list" exact element={ <MoviesList/> } />
Run Code Online (Sandbox Code Playgroud)

所以现在MoviesList被识别为一个组件。


Sag*_*b.g 36

您将它用作常规组件,但它实际上是一个返回组件的函数.

尝试做这样的事情:

const NewComponent = NewHOC(Movie)
Run Code Online (Sandbox Code Playgroud)

你会像这样使用它:

<NewComponent someProp="someValue" />
Run Code Online (Sandbox Code Playgroud)

这是一个运行的例子:

const NewHOC = (PassedComponent) => {
  return class extends React.Component {
    render() {
      return (
        <div>
          <PassedComponent {...this.props} />
        </div>
      )
    }
  }
}

const Movie = ({name}) => <div>{name}</div>

const NewComponent = NewHOC(Movie);

function App() {
  return (
    <div>
      <NewComponent name="Kill Bill" />
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
Run Code Online (Sandbox Code Playgroud)
<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="root"/>
Run Code Online (Sandbox Code Playgroud)

因此,基本上NewHOC只是一个接受组件并返回一个新组件的函数,该组件呈现传入的组件.我们通常使用此模式来增强组件并共享逻辑或数据.

您可以在文档中阅读HOCS,我还建议您阅读反应元素和组件之间区别

  • 投了反对票,因为它没有解释任何内容,也没有提供任何关于该主题的进一步阅读。甚至OP都没有解释他/她如何认为这个答案很有价值。隐秘的答案比没有答案更糟糕。上下文就是一切。任何人都不能肯定地知道在哪里放置此代码段。此外,这种解释本身没有任何意义:只有在React中的实现细节对表达式进行了浅浅的评估时,这种解释才有意义,因为已知函数是Javascript中的一等公民。 (4认同)
  • 你能解释一下你的答案吗?我有同样的警告问题 (3认同)
  • 我的印象是这很明显,一个返回新组件的函数.无论如何,我添加了一个运行示例并参考文档. (3认同)

Par*_*saN 7

我也有这个错误。问题是如何调用该函数。

错误代码

const Component = () => {
    const id = ({match}) => <h2>Test1: {match.params.id}</h2>
    return <h1>{id}</h1>;
};
Run Code Online (Sandbox Code Playgroud)

id是一个函数,所以:

正确代码

return <h1>{id()}</h1>;
Run Code Online (Sandbox Code Playgroud)


Ste*_*hev 6

In my case i forgot to add the () after the function name inside the render function of a react component

public render() {
       let ctrl = (
           <>
                <div className="aaa">
                    {this.renderView}
                </div>
            </>
       ); 

       return ctrl;
    };


    private renderView() : JSX.Element {
        // some html
    };
Run Code Online (Sandbox Code Playgroud)

Changing the render method, as it states in the error message to

        <div className="aaa">
            {this.renderView()}
        </div>
Run Code Online (Sandbox Code Playgroud)

fixed the problem


小智 5

我在按照此处的说明操作时遇到此错误:https ://reactjs.org/docs/add-react-to-a-website.html

这是我所拥有的:

ReactDOM.render(Header, headerContainer);
Run Code Online (Sandbox Code Playgroud)

它应该是:

ReactDOM.render(React.createElement(Header), headerContainer);
Run Code Online (Sandbox Code Playgroud)