Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

React functional components with methods

If we wanted to make a functional stateless component but we want methods that are able to access the props how would we do that? Is there like a general rule or best practice when it comes to things like this

for example

function Stateless(props) {
   function doSomething(props) {
      console.log(props);
   }
  doSomething() // logs 'undefined'
return (
  <div> some stuff </div>
}

the inside props is always not the props that given, at least in my experience.

If I didn't need a state (using Redux) but still wanted methods that accessed props, is it still good practice to use classes and not stateless functions?

like image 659
christiancn7 Avatar asked Mar 02 '19 06:03

christiancn7


2 Answers

It is perfectly fine to use functions inside functional components. In fact React hooks that were introduced recently in React 16.8, are all about making functional components even more convenient by bringing state and lifecycle events to the the functional components via special hooks.

But as others have mentioned you need to pass proper arguments to your functions: doSomething(props) or not pass arguments at all and correspondingly never expect them in function declaration itself: function doSomething().

like image 78
jayarjo Avatar answered Oct 17 '22 13:10

jayarjo


doSomething() logs undefined because the inner props variable wasn't delivered when you called doSomething(missing props). You can either remove the inner props:

function Stateless(props) {
  function doSomething() {
    console.log(props);
  }
  doSomething();
  return (
    <div> some stuff </div>
  );
}

Or declare doSomething outside your component:

function doSomething(props) {
  console.log(props);
}
function Stateless(props) {
  doSomething(props);
  return (
    <div> some stuff </div>
  );
}

Both will work. The first might be easier, but if your component is redrawn often, the second is more performant, since you only declare doSomething once.

like image 28
jorbuedo Avatar answered Oct 17 '22 12:10

jorbuedo