As many know, this.someFunction = this.someFunction.bind(this)
can be used in React class components. However, sometimes it's burdensome to create classes for very simple components. So, how can I bind a function to this
without creating a class?

- 388
- 5
- 23
-
1you can use es6 `arrow function`. No need to bind this for that – Shakil Feb 14 '19 at 04:05
-
3if you have a simple component how/why are you referencing `this` inside the component? pure functional components are generally for presentation and should have any values they need passed as props, whats the requirement to access `this` – atmd Feb 14 '19 at 04:22
5 Answers
use arrow function arrow function

- 385
- 3
- 12
-
3Your answer is correct, but I suggest you elaborate a little bit with an example, which would add some more value for future readers stumbling upon this question. – Angelos Chalaris Feb 14 '19 at 07:08
In React 16.8, you can use hooks for stateful components, essentially allowing you to write everything as a function and eliminating the need to use classes and all the caveats that come with them (this
, .bind()
etc).
Usage example
Here's an example of using the useState()
hook and the useEffect()
hook inside a function, along with an arrow function, which is already bound to the component's context:
import React, { useState, useEffect } from 'react';
function LimitedTextarea({ rows, cols, value, limit }) {
const [content, setContent] = useState(value);
const setFormattedContent = text => {
text.length > limit ? setContent(text.slice(0, limit)) : setContent(text);
};
useEffect(() => {
setFormattedContent(content);
}, []);
return (
<div>
<textarea
rows={rows}
cols={cols}
onChange={event => setFormattedContent(event.target.value)}
value={content}
/>
<p>
{content.length}/{limit}
</p>
</div>
);
}
Short explanation
- You use
useState()
to create a state variablecontent
and a method to update that variable,setContent()
. - You create an arrow function
setFormattedContent
to update thecontent
state variable via thesetContent
method, which is already bound to context. - You use
useEffect()
to callsetFormattedContent
on the value of thecontent
state variable. - Finally, you return whatever you would have in your
render()
method in a class component.

- 6,611
- 8
- 49
- 75
this
makes sense in class component because it refers to component instance. It doesn't make sense in functional component because it is either undefined
or a global, depending on the environment and how a function was declared.
As for class components, explicit constructor can be omitted if it's not needed, class fields can be used to assign instance properties, including bound methods:
class Foo extends Component {
foo = this.foo.bind(this);
foo() { ... }
...
}
Which is syntactic sugar for:
class Foo extends Component {
constructor(props) {
super(props);
this.foo = this.foo.bind(this);
}
foo() { ... }
...
}
Bound prototype methods have several benefits over instance arrow methods.

- 206,104
- 70
- 425
- 565
Yes arrow function is the solution.
Bind with this,
this.someFunction = this.someFunction.bind(this)
Using arrow function,
someFunction = () => {
// do something
}

- 1,636
- 2
- 16
- 24
There is no need to bind "this" If you use arrow function. It has simple and cleaner syntax.
someFuncton = () => {
// whatever write here...
}

- 81
- 1
- 4