Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Functions are not valid as a React child. This may happen if you return a Component instead of from render

I have written a Higher Order Component:

import React from 'react';   const NewHOC = (PassedComponent) => {     return class extends React.Component {         render(){             return (                 <div>                     <PassedComponent {...this.props}/>                 </div>             )         }     } }  export default NewHOC; 

I am using the above in my 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>    );   }  } 

But, the warning I am getting is:

Warning: Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it. in NewHOC (created by App) in div (created by App) in App

The Movie.js file is:

import React from "react";  export default class Movie extends React.Component{     render() {         return <div>             Hello from Movie {this.props.name}             {this.props.children}</div>     } } 

What am I doing wrong?

like image 897
learner Avatar asked Jan 26 '18 09:01

learner


People also ask

How do you fix objects are not valid as a React child?

The React. js error "Objects are not valid as a React child" occurs when we try to directly render an object or an array in our JSX code. To solve the error, use the map() method to render arrays or access properties on the object in your JSX code.

What is render in React JS?

The term “render prop” refers to a technique for sharing code between React components using a prop whose value is a function. A component with a render prop takes a function that returns a React element and calls it instead of implementing its own render logic.

How do you create a component of a React function?

We can create a functional component to React by writing a JavaScript function. These functions may or may not receive data as parameters. In the functional Components, the return value is the JSX code to render to the DOM tree. Example: Program to demonstrate the creation of functional components.

How do you call a function in React?

To call a function, you can either pass its name and arguments to User. callFunction() or call the function as if it was a method on the User.


1 Answers

You are using it as a regular component, but it's actually a function that returns a component.

Try doing something like this:

const NewComponent = NewHOC(Movie) 

And you will use it like this:

<NewComponent someProp="someValue" /> 

Here is a running example:

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);
<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"/>

So basically NewHOC is just a function that accepts a component and returns a new component that renders the component passed in. We usually use this pattern to enhance components and share logic or data.

You can read about HOCS in the docs and I also recommend reading about the difference between react elements and components

I wrote an article about the different ways and patterns of sharing logic in react.

like image 80
Sagiv b.g Avatar answered Sep 23 '22 02:09

Sagiv b.g