ReactJS lifecycle method inside a functional Component
up vote
29
down vote
favorite
Instead of writing my components inside a class, since they are dumb, I mostly write these inside a function.
But how do I override componentDidMount
, componentWillMount
inside functional components? Is it even possible?
const grid = (props) => {
console.log(props);
let {skuRules} = props;
const componentDidMount = () => {
if(!props.fetched) {
props.fetchRules();
}
console.log('mount it!');
};
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
reactjs redux
add a comment |
up vote
29
down vote
favorite
Instead of writing my components inside a class, since they are dumb, I mostly write these inside a function.
But how do I override componentDidMount
, componentWillMount
inside functional components? Is it even possible?
const grid = (props) => {
console.log(props);
let {skuRules} = props;
const componentDidMount = () => {
if(!props.fetched) {
props.fetchRules();
}
console.log('mount it!');
};
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
reactjs redux
1
I think a reason should be provided for downvoting a question or an answer.
– Aftab Naveed
Jun 12 '17 at 21:48
I think it's a good question, though the note on classes being dumb is a personal opinion and might have earned the downvoting :)
– Joehannes
Oct 13 '17 at 17:02
1
Understood, but that's the way the REACT community calls it :-)
– Aftab Naveed
Oct 19 '17 at 7:20
It's always safer inside the herd, but when you reach the edges it starts getting messy ...
– Joehannes
Oct 20 '17 at 12:59
functional components are not supposed to have lifecycle methods. because they are just functions. and functions don't have methods. there are classes for that
– avalanche1
Oct 24 at 11:10
add a comment |
up vote
29
down vote
favorite
up vote
29
down vote
favorite
Instead of writing my components inside a class, since they are dumb, I mostly write these inside a function.
But how do I override componentDidMount
, componentWillMount
inside functional components? Is it even possible?
const grid = (props) => {
console.log(props);
let {skuRules} = props;
const componentDidMount = () => {
if(!props.fetched) {
props.fetchRules();
}
console.log('mount it!');
};
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
reactjs redux
Instead of writing my components inside a class, since they are dumb, I mostly write these inside a function.
But how do I override componentDidMount
, componentWillMount
inside functional components? Is it even possible?
const grid = (props) => {
console.log(props);
let {skuRules} = props;
const componentDidMount = () => {
if(!props.fetched) {
props.fetchRules();
}
console.log('mount it!');
};
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
reactjs redux
reactjs redux
edited 2 days ago
MeltedPenguin
530515
530515
asked Jun 12 '17 at 18:20
Aftab Naveed
83811027
83811027
1
I think a reason should be provided for downvoting a question or an answer.
– Aftab Naveed
Jun 12 '17 at 21:48
I think it's a good question, though the note on classes being dumb is a personal opinion and might have earned the downvoting :)
– Joehannes
Oct 13 '17 at 17:02
1
Understood, but that's the way the REACT community calls it :-)
– Aftab Naveed
Oct 19 '17 at 7:20
It's always safer inside the herd, but when you reach the edges it starts getting messy ...
– Joehannes
Oct 20 '17 at 12:59
functional components are not supposed to have lifecycle methods. because they are just functions. and functions don't have methods. there are classes for that
– avalanche1
Oct 24 at 11:10
add a comment |
1
I think a reason should be provided for downvoting a question or an answer.
– Aftab Naveed
Jun 12 '17 at 21:48
I think it's a good question, though the note on classes being dumb is a personal opinion and might have earned the downvoting :)
– Joehannes
Oct 13 '17 at 17:02
1
Understood, but that's the way the REACT community calls it :-)
– Aftab Naveed
Oct 19 '17 at 7:20
It's always safer inside the herd, but when you reach the edges it starts getting messy ...
– Joehannes
Oct 20 '17 at 12:59
functional components are not supposed to have lifecycle methods. because they are just functions. and functions don't have methods. there are classes for that
– avalanche1
Oct 24 at 11:10
1
1
I think a reason should be provided for downvoting a question or an answer.
– Aftab Naveed
Jun 12 '17 at 21:48
I think a reason should be provided for downvoting a question or an answer.
– Aftab Naveed
Jun 12 '17 at 21:48
I think it's a good question, though the note on classes being dumb is a personal opinion and might have earned the downvoting :)
– Joehannes
Oct 13 '17 at 17:02
I think it's a good question, though the note on classes being dumb is a personal opinion and might have earned the downvoting :)
– Joehannes
Oct 13 '17 at 17:02
1
1
Understood, but that's the way the REACT community calls it :-)
– Aftab Naveed
Oct 19 '17 at 7:20
Understood, but that's the way the REACT community calls it :-)
– Aftab Naveed
Oct 19 '17 at 7:20
It's always safer inside the herd, but when you reach the edges it starts getting messy ...
– Joehannes
Oct 20 '17 at 12:59
It's always safer inside the herd, but when you reach the edges it starts getting messy ...
– Joehannes
Oct 20 '17 at 12:59
functional components are not supposed to have lifecycle methods. because they are just functions. and functions don't have methods. there are classes for that
– avalanche1
Oct 24 at 11:10
functional components are not supposed to have lifecycle methods. because they are just functions. and functions don't have methods. there are classes for that
– avalanche1
Oct 24 at 11:10
add a comment |
5 Answers
5
active
oldest
votes
up vote
29
down vote
accepted
You can use react-pure-lifecycle to add lifecycle functions to functional components.
Example:
import React, { Component } from 'react';
import lifecycle from 'react-pure-lifecycle';
const methods = {
componentDidMount(props) {
console.log('I mounted! Here are my props: ', props);
}
};
const Channels = props => (
<h1>Hello</h1>
)
export default lifecycle(methods)(Channels);
1
This is exactly what I needed and hopefully will make its way to the top of the upvoted comments.
– JSager
Mar 25 at 17:02
3
What isGrid
? I don't see it defined anywhere in your code snippet? If you wanted to use redux with this as well could you get away with something likeexport default lifecycle(methods)(connect({},{})(ComponentName))
?
– Sean Clancy
May 4 at 15:16
@SeanClancy Sorry for late response. The code snippet was updated.
– Yohann
Jul 10 at 20:15
add a comment |
up vote
20
down vote
Edit: With the introduction of Hooks
its possible to implement lifecycle kind of behaviour as well as state in functional Component. Currently
Hooks are a new feature proposal that lets you use state and other
React features without writing a class. They’re currently in React
v16.7.0-alpha
useEffect
hook can be used to replicate lifecycle behaviour, and useState
can be used to store state in a functional component.
You can implement your use case in hooks like
const grid = (props) => {
console.log(props);
let {skuRules} = props;
useEffect(() => {
if(!props.fetched) {
props.fetchRules();
}
console.log('mount it!');
}, ); // passing an empty array as second argument triggers the callback in useEffect only after the initial render thus replicating `componentDidMount` lifecycle behaviour
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
useEffect
can also return a function that will be run when the component is unmounted. This can be used to unsubscribe to listeners. An can be used to replicate the componentWillUnmount
behaviour
Eg: componentWillUnmount
useEffect(() => {
window.addEventListener('unhandledRejection', handler);
return () => {
window.removeEventListener('unhandledRejection', handler);
}
}, )
As the second argument if you provide values, these will be compared before triggering the callback if these is any change in any of the following
Eg: componentDidUpdate
componentDidUpdate(prevProps, prevState) {
const { counter } = this.props;
if (this.props.counter !== nextProps.counter) {
// some action here
}
}
Hooks Equivalent
useEffect(() => {
// action here
}, [props.counter]);
Before v16.7.0
The property of functional components is that they don't have access to Reacts lifecycle functions or the this
keyword. You need to extend the React.Component
class if you want to use the lifecycle function.
class Grid extends React.Component {
constructor(props) {
super(props)
}
componentDidMount () {
if(!this.props.fetched) {
this.props.fetchRules();
}
console.log('mount it!');
}
render() {
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
}
Functional components are useful when you only want to render your Component without the need of extra logic.
1
As I said, you have a logic in your component and you requirement wants you to use a lifecycle function and you you cant do that with functioanl components. So better make use of class. Use functional component when your component contains no extra logic
– Shubham Khatri
Jun 12 '17 at 18:41
Happy to help :), Glad I was able to explain
– Shubham Khatri
Jun 12 '17 at 18:59
add a comment |
up vote
5
down vote
Solution One:
You can use new react HOOKS API. Currently in React v16.7.0-alpha
Hooks let you use more of React’s features without classes.
Hooks provide a more direct API to the React concepts you already know: props, state, context, refs, and lifecycle.
Hooks solves all the problems addressed with Recompose.
A Note from the Author of recompose
(acdlite, Oct 25 2018):
Hi! I created Recompose about three years ago. About a year after
that, I joined the React team. Today, we announced a proposal for
Hooks. Hooks solves all the problems I attempted to address with
Recompose three years ago, and more on top of that. I will be
discontinuing active maintenance of this package (excluding perhaps
bugfixes or patches for compatibility with future React releases), and
recommending that people use Hooks instead. Your existing code with
Recompose will still work, just don't expect any new features.
Solution Two:
If you are using react version that does not support hooks, no worries, use recompose
(A React utility belt for function components and higher-order components.) instead. You can use recompose
for attaching lifecycle hooks, state, handlers etc
to a functional component.
Here’s a render-less component that attaches lifecycle methods via the lifecycle HOC (from recompose).
// taken from https://gist.github.com/tsnieman/056af4bb9e87748c514d#file-auth-js-L33
function RenderlessComponent() {
return null;
}
export default lifecycle({
componentDidMount() {
const { checkIfAuthed } = this.props;
// Do they have an active session? ("Remember me")
checkIfAuthed();
},
componentWillReceiveProps(nextProps) {
const {
loadUser,
} = this.props;
// Various 'indicators'..
const becameAuthed = (!(this.props.auth) && nextProps.auth);
const isCurrentUser = (this.props.currentUser !== null);
if (becameAuthed) {
loadUser(nextProps.auth.uid);
}
const shouldSetCurrentUser = (!isCurrentUser && nextProps.auth);
if (shouldSetCurrentUser) {
const currentUser = nextProps.users[nextProps.auth.uid];
if (currentUser) {
this.props.setCurrentUser({
'id': nextProps.auth.uid,
...currentUser,
});
}
}
}
})(RenderlessComponent);
add a comment |
up vote
4
down vote
If you need use React LifeCycle, you need use Class.
Sample:
import React, { Component } from 'react';
class Grid extends Component {
constructor(props){
super(props)
}
componentDidMount () { /* do something */ }
render () {
return <h1>Hello</h1>
}
}
I don't want to use the class.
– Aftab Naveed
Jun 12 '17 at 18:34
1
But, componentDidMount just work in class :/
– Gabriel Ferreira
Jun 12 '17 at 18:35
1
hmm makes sense thank you.
– Aftab Naveed
Jun 12 '17 at 18:59
You're welcome :D
– Gabriel Ferreira
Jun 12 '17 at 20:15
add a comment |
up vote
0
down vote
You can make use of create-react-class module.
Official documentation
Of course you must first install it
npm install create-react-class
Here is a working example
import React from "react";
import ReactDOM from "react-dom"
let createReactClass = require('create-react-class')
let Clock = createReactClass({
getInitialState:function(){
return {date:new Date()}
},
render:function(){
return (
<h1>{this.state.date.toLocaleTimeString()}</h1>
)
},
componentDidMount:function(){
this.timerId = setInterval(()=>this.setState({date:new Date()}),1000)
},
componentWillUnmount:function(){
clearInterval(this.timerId)
}
})
ReactDOM.render(
<Clock/>,
document.getElementById('root')
)
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f44506207%2freactjs-lifecycle-method-inside-a-functional-component%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
5 Answers
5
active
oldest
votes
5 Answers
5
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
29
down vote
accepted
You can use react-pure-lifecycle to add lifecycle functions to functional components.
Example:
import React, { Component } from 'react';
import lifecycle from 'react-pure-lifecycle';
const methods = {
componentDidMount(props) {
console.log('I mounted! Here are my props: ', props);
}
};
const Channels = props => (
<h1>Hello</h1>
)
export default lifecycle(methods)(Channels);
1
This is exactly what I needed and hopefully will make its way to the top of the upvoted comments.
– JSager
Mar 25 at 17:02
3
What isGrid
? I don't see it defined anywhere in your code snippet? If you wanted to use redux with this as well could you get away with something likeexport default lifecycle(methods)(connect({},{})(ComponentName))
?
– Sean Clancy
May 4 at 15:16
@SeanClancy Sorry for late response. The code snippet was updated.
– Yohann
Jul 10 at 20:15
add a comment |
up vote
29
down vote
accepted
You can use react-pure-lifecycle to add lifecycle functions to functional components.
Example:
import React, { Component } from 'react';
import lifecycle from 'react-pure-lifecycle';
const methods = {
componentDidMount(props) {
console.log('I mounted! Here are my props: ', props);
}
};
const Channels = props => (
<h1>Hello</h1>
)
export default lifecycle(methods)(Channels);
1
This is exactly what I needed and hopefully will make its way to the top of the upvoted comments.
– JSager
Mar 25 at 17:02
3
What isGrid
? I don't see it defined anywhere in your code snippet? If you wanted to use redux with this as well could you get away with something likeexport default lifecycle(methods)(connect({},{})(ComponentName))
?
– Sean Clancy
May 4 at 15:16
@SeanClancy Sorry for late response. The code snippet was updated.
– Yohann
Jul 10 at 20:15
add a comment |
up vote
29
down vote
accepted
up vote
29
down vote
accepted
You can use react-pure-lifecycle to add lifecycle functions to functional components.
Example:
import React, { Component } from 'react';
import lifecycle from 'react-pure-lifecycle';
const methods = {
componentDidMount(props) {
console.log('I mounted! Here are my props: ', props);
}
};
const Channels = props => (
<h1>Hello</h1>
)
export default lifecycle(methods)(Channels);
You can use react-pure-lifecycle to add lifecycle functions to functional components.
Example:
import React, { Component } from 'react';
import lifecycle from 'react-pure-lifecycle';
const methods = {
componentDidMount(props) {
console.log('I mounted! Here are my props: ', props);
}
};
const Channels = props => (
<h1>Hello</h1>
)
export default lifecycle(methods)(Channels);
edited Jul 6 at 3:57
Arturo Volpe
2,54731834
2,54731834
answered Jan 15 at 14:04
Yohann
41658
41658
1
This is exactly what I needed and hopefully will make its way to the top of the upvoted comments.
– JSager
Mar 25 at 17:02
3
What isGrid
? I don't see it defined anywhere in your code snippet? If you wanted to use redux with this as well could you get away with something likeexport default lifecycle(methods)(connect({},{})(ComponentName))
?
– Sean Clancy
May 4 at 15:16
@SeanClancy Sorry for late response. The code snippet was updated.
– Yohann
Jul 10 at 20:15
add a comment |
1
This is exactly what I needed and hopefully will make its way to the top of the upvoted comments.
– JSager
Mar 25 at 17:02
3
What isGrid
? I don't see it defined anywhere in your code snippet? If you wanted to use redux with this as well could you get away with something likeexport default lifecycle(methods)(connect({},{})(ComponentName))
?
– Sean Clancy
May 4 at 15:16
@SeanClancy Sorry for late response. The code snippet was updated.
– Yohann
Jul 10 at 20:15
1
1
This is exactly what I needed and hopefully will make its way to the top of the upvoted comments.
– JSager
Mar 25 at 17:02
This is exactly what I needed and hopefully will make its way to the top of the upvoted comments.
– JSager
Mar 25 at 17:02
3
3
What is
Grid
? I don't see it defined anywhere in your code snippet? If you wanted to use redux with this as well could you get away with something like export default lifecycle(methods)(connect({},{})(ComponentName))
?– Sean Clancy
May 4 at 15:16
What is
Grid
? I don't see it defined anywhere in your code snippet? If you wanted to use redux with this as well could you get away with something like export default lifecycle(methods)(connect({},{})(ComponentName))
?– Sean Clancy
May 4 at 15:16
@SeanClancy Sorry for late response. The code snippet was updated.
– Yohann
Jul 10 at 20:15
@SeanClancy Sorry for late response. The code snippet was updated.
– Yohann
Jul 10 at 20:15
add a comment |
up vote
20
down vote
Edit: With the introduction of Hooks
its possible to implement lifecycle kind of behaviour as well as state in functional Component. Currently
Hooks are a new feature proposal that lets you use state and other
React features without writing a class. They’re currently in React
v16.7.0-alpha
useEffect
hook can be used to replicate lifecycle behaviour, and useState
can be used to store state in a functional component.
You can implement your use case in hooks like
const grid = (props) => {
console.log(props);
let {skuRules} = props;
useEffect(() => {
if(!props.fetched) {
props.fetchRules();
}
console.log('mount it!');
}, ); // passing an empty array as second argument triggers the callback in useEffect only after the initial render thus replicating `componentDidMount` lifecycle behaviour
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
useEffect
can also return a function that will be run when the component is unmounted. This can be used to unsubscribe to listeners. An can be used to replicate the componentWillUnmount
behaviour
Eg: componentWillUnmount
useEffect(() => {
window.addEventListener('unhandledRejection', handler);
return () => {
window.removeEventListener('unhandledRejection', handler);
}
}, )
As the second argument if you provide values, these will be compared before triggering the callback if these is any change in any of the following
Eg: componentDidUpdate
componentDidUpdate(prevProps, prevState) {
const { counter } = this.props;
if (this.props.counter !== nextProps.counter) {
// some action here
}
}
Hooks Equivalent
useEffect(() => {
// action here
}, [props.counter]);
Before v16.7.0
The property of functional components is that they don't have access to Reacts lifecycle functions or the this
keyword. You need to extend the React.Component
class if you want to use the lifecycle function.
class Grid extends React.Component {
constructor(props) {
super(props)
}
componentDidMount () {
if(!this.props.fetched) {
this.props.fetchRules();
}
console.log('mount it!');
}
render() {
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
}
Functional components are useful when you only want to render your Component without the need of extra logic.
1
As I said, you have a logic in your component and you requirement wants you to use a lifecycle function and you you cant do that with functioanl components. So better make use of class. Use functional component when your component contains no extra logic
– Shubham Khatri
Jun 12 '17 at 18:41
Happy to help :), Glad I was able to explain
– Shubham Khatri
Jun 12 '17 at 18:59
add a comment |
up vote
20
down vote
Edit: With the introduction of Hooks
its possible to implement lifecycle kind of behaviour as well as state in functional Component. Currently
Hooks are a new feature proposal that lets you use state and other
React features without writing a class. They’re currently in React
v16.7.0-alpha
useEffect
hook can be used to replicate lifecycle behaviour, and useState
can be used to store state in a functional component.
You can implement your use case in hooks like
const grid = (props) => {
console.log(props);
let {skuRules} = props;
useEffect(() => {
if(!props.fetched) {
props.fetchRules();
}
console.log('mount it!');
}, ); // passing an empty array as second argument triggers the callback in useEffect only after the initial render thus replicating `componentDidMount` lifecycle behaviour
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
useEffect
can also return a function that will be run when the component is unmounted. This can be used to unsubscribe to listeners. An can be used to replicate the componentWillUnmount
behaviour
Eg: componentWillUnmount
useEffect(() => {
window.addEventListener('unhandledRejection', handler);
return () => {
window.removeEventListener('unhandledRejection', handler);
}
}, )
As the second argument if you provide values, these will be compared before triggering the callback if these is any change in any of the following
Eg: componentDidUpdate
componentDidUpdate(prevProps, prevState) {
const { counter } = this.props;
if (this.props.counter !== nextProps.counter) {
// some action here
}
}
Hooks Equivalent
useEffect(() => {
// action here
}, [props.counter]);
Before v16.7.0
The property of functional components is that they don't have access to Reacts lifecycle functions or the this
keyword. You need to extend the React.Component
class if you want to use the lifecycle function.
class Grid extends React.Component {
constructor(props) {
super(props)
}
componentDidMount () {
if(!this.props.fetched) {
this.props.fetchRules();
}
console.log('mount it!');
}
render() {
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
}
Functional components are useful when you only want to render your Component without the need of extra logic.
1
As I said, you have a logic in your component and you requirement wants you to use a lifecycle function and you you cant do that with functioanl components. So better make use of class. Use functional component when your component contains no extra logic
– Shubham Khatri
Jun 12 '17 at 18:41
Happy to help :), Glad I was able to explain
– Shubham Khatri
Jun 12 '17 at 18:59
add a comment |
up vote
20
down vote
up vote
20
down vote
Edit: With the introduction of Hooks
its possible to implement lifecycle kind of behaviour as well as state in functional Component. Currently
Hooks are a new feature proposal that lets you use state and other
React features without writing a class. They’re currently in React
v16.7.0-alpha
useEffect
hook can be used to replicate lifecycle behaviour, and useState
can be used to store state in a functional component.
You can implement your use case in hooks like
const grid = (props) => {
console.log(props);
let {skuRules} = props;
useEffect(() => {
if(!props.fetched) {
props.fetchRules();
}
console.log('mount it!');
}, ); // passing an empty array as second argument triggers the callback in useEffect only after the initial render thus replicating `componentDidMount` lifecycle behaviour
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
useEffect
can also return a function that will be run when the component is unmounted. This can be used to unsubscribe to listeners. An can be used to replicate the componentWillUnmount
behaviour
Eg: componentWillUnmount
useEffect(() => {
window.addEventListener('unhandledRejection', handler);
return () => {
window.removeEventListener('unhandledRejection', handler);
}
}, )
As the second argument if you provide values, these will be compared before triggering the callback if these is any change in any of the following
Eg: componentDidUpdate
componentDidUpdate(prevProps, prevState) {
const { counter } = this.props;
if (this.props.counter !== nextProps.counter) {
// some action here
}
}
Hooks Equivalent
useEffect(() => {
// action here
}, [props.counter]);
Before v16.7.0
The property of functional components is that they don't have access to Reacts lifecycle functions or the this
keyword. You need to extend the React.Component
class if you want to use the lifecycle function.
class Grid extends React.Component {
constructor(props) {
super(props)
}
componentDidMount () {
if(!this.props.fetched) {
this.props.fetchRules();
}
console.log('mount it!');
}
render() {
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
}
Functional components are useful when you only want to render your Component without the need of extra logic.
Edit: With the introduction of Hooks
its possible to implement lifecycle kind of behaviour as well as state in functional Component. Currently
Hooks are a new feature proposal that lets you use state and other
React features without writing a class. They’re currently in React
v16.7.0-alpha
useEffect
hook can be used to replicate lifecycle behaviour, and useState
can be used to store state in a functional component.
You can implement your use case in hooks like
const grid = (props) => {
console.log(props);
let {skuRules} = props;
useEffect(() => {
if(!props.fetched) {
props.fetchRules();
}
console.log('mount it!');
}, ); // passing an empty array as second argument triggers the callback in useEffect only after the initial render thus replicating `componentDidMount` lifecycle behaviour
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
useEffect
can also return a function that will be run when the component is unmounted. This can be used to unsubscribe to listeners. An can be used to replicate the componentWillUnmount
behaviour
Eg: componentWillUnmount
useEffect(() => {
window.addEventListener('unhandledRejection', handler);
return () => {
window.removeEventListener('unhandledRejection', handler);
}
}, )
As the second argument if you provide values, these will be compared before triggering the callback if these is any change in any of the following
Eg: componentDidUpdate
componentDidUpdate(prevProps, prevState) {
const { counter } = this.props;
if (this.props.counter !== nextProps.counter) {
// some action here
}
}
Hooks Equivalent
useEffect(() => {
// action here
}, [props.counter]);
Before v16.7.0
The property of functional components is that they don't have access to Reacts lifecycle functions or the this
keyword. You need to extend the React.Component
class if you want to use the lifecycle function.
class Grid extends React.Component {
constructor(props) {
super(props)
}
componentDidMount () {
if(!this.props.fetched) {
this.props.fetchRules();
}
console.log('mount it!');
}
render() {
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
}
Functional components are useful when you only want to render your Component without the need of extra logic.
edited Nov 28 at 8:52
answered Jun 12 '17 at 18:22
Shubham Khatri
77k1490126
77k1490126
1
As I said, you have a logic in your component and you requirement wants you to use a lifecycle function and you you cant do that with functioanl components. So better make use of class. Use functional component when your component contains no extra logic
– Shubham Khatri
Jun 12 '17 at 18:41
Happy to help :), Glad I was able to explain
– Shubham Khatri
Jun 12 '17 at 18:59
add a comment |
1
As I said, you have a logic in your component and you requirement wants you to use a lifecycle function and you you cant do that with functioanl components. So better make use of class. Use functional component when your component contains no extra logic
– Shubham Khatri
Jun 12 '17 at 18:41
Happy to help :), Glad I was able to explain
– Shubham Khatri
Jun 12 '17 at 18:59
1
1
As I said, you have a logic in your component and you requirement wants you to use a lifecycle function and you you cant do that with functioanl components. So better make use of class. Use functional component when your component contains no extra logic
– Shubham Khatri
Jun 12 '17 at 18:41
As I said, you have a logic in your component and you requirement wants you to use a lifecycle function and you you cant do that with functioanl components. So better make use of class. Use functional component when your component contains no extra logic
– Shubham Khatri
Jun 12 '17 at 18:41
Happy to help :), Glad I was able to explain
– Shubham Khatri
Jun 12 '17 at 18:59
Happy to help :), Glad I was able to explain
– Shubham Khatri
Jun 12 '17 at 18:59
add a comment |
up vote
5
down vote
Solution One:
You can use new react HOOKS API. Currently in React v16.7.0-alpha
Hooks let you use more of React’s features without classes.
Hooks provide a more direct API to the React concepts you already know: props, state, context, refs, and lifecycle.
Hooks solves all the problems addressed with Recompose.
A Note from the Author of recompose
(acdlite, Oct 25 2018):
Hi! I created Recompose about three years ago. About a year after
that, I joined the React team. Today, we announced a proposal for
Hooks. Hooks solves all the problems I attempted to address with
Recompose three years ago, and more on top of that. I will be
discontinuing active maintenance of this package (excluding perhaps
bugfixes or patches for compatibility with future React releases), and
recommending that people use Hooks instead. Your existing code with
Recompose will still work, just don't expect any new features.
Solution Two:
If you are using react version that does not support hooks, no worries, use recompose
(A React utility belt for function components and higher-order components.) instead. You can use recompose
for attaching lifecycle hooks, state, handlers etc
to a functional component.
Here’s a render-less component that attaches lifecycle methods via the lifecycle HOC (from recompose).
// taken from https://gist.github.com/tsnieman/056af4bb9e87748c514d#file-auth-js-L33
function RenderlessComponent() {
return null;
}
export default lifecycle({
componentDidMount() {
const { checkIfAuthed } = this.props;
// Do they have an active session? ("Remember me")
checkIfAuthed();
},
componentWillReceiveProps(nextProps) {
const {
loadUser,
} = this.props;
// Various 'indicators'..
const becameAuthed = (!(this.props.auth) && nextProps.auth);
const isCurrentUser = (this.props.currentUser !== null);
if (becameAuthed) {
loadUser(nextProps.auth.uid);
}
const shouldSetCurrentUser = (!isCurrentUser && nextProps.auth);
if (shouldSetCurrentUser) {
const currentUser = nextProps.users[nextProps.auth.uid];
if (currentUser) {
this.props.setCurrentUser({
'id': nextProps.auth.uid,
...currentUser,
});
}
}
}
})(RenderlessComponent);
add a comment |
up vote
5
down vote
Solution One:
You can use new react HOOKS API. Currently in React v16.7.0-alpha
Hooks let you use more of React’s features without classes.
Hooks provide a more direct API to the React concepts you already know: props, state, context, refs, and lifecycle.
Hooks solves all the problems addressed with Recompose.
A Note from the Author of recompose
(acdlite, Oct 25 2018):
Hi! I created Recompose about three years ago. About a year after
that, I joined the React team. Today, we announced a proposal for
Hooks. Hooks solves all the problems I attempted to address with
Recompose three years ago, and more on top of that. I will be
discontinuing active maintenance of this package (excluding perhaps
bugfixes or patches for compatibility with future React releases), and
recommending that people use Hooks instead. Your existing code with
Recompose will still work, just don't expect any new features.
Solution Two:
If you are using react version that does not support hooks, no worries, use recompose
(A React utility belt for function components and higher-order components.) instead. You can use recompose
for attaching lifecycle hooks, state, handlers etc
to a functional component.
Here’s a render-less component that attaches lifecycle methods via the lifecycle HOC (from recompose).
// taken from https://gist.github.com/tsnieman/056af4bb9e87748c514d#file-auth-js-L33
function RenderlessComponent() {
return null;
}
export default lifecycle({
componentDidMount() {
const { checkIfAuthed } = this.props;
// Do they have an active session? ("Remember me")
checkIfAuthed();
},
componentWillReceiveProps(nextProps) {
const {
loadUser,
} = this.props;
// Various 'indicators'..
const becameAuthed = (!(this.props.auth) && nextProps.auth);
const isCurrentUser = (this.props.currentUser !== null);
if (becameAuthed) {
loadUser(nextProps.auth.uid);
}
const shouldSetCurrentUser = (!isCurrentUser && nextProps.auth);
if (shouldSetCurrentUser) {
const currentUser = nextProps.users[nextProps.auth.uid];
if (currentUser) {
this.props.setCurrentUser({
'id': nextProps.auth.uid,
...currentUser,
});
}
}
}
})(RenderlessComponent);
add a comment |
up vote
5
down vote
up vote
5
down vote
Solution One:
You can use new react HOOKS API. Currently in React v16.7.0-alpha
Hooks let you use more of React’s features without classes.
Hooks provide a more direct API to the React concepts you already know: props, state, context, refs, and lifecycle.
Hooks solves all the problems addressed with Recompose.
A Note from the Author of recompose
(acdlite, Oct 25 2018):
Hi! I created Recompose about three years ago. About a year after
that, I joined the React team. Today, we announced a proposal for
Hooks. Hooks solves all the problems I attempted to address with
Recompose three years ago, and more on top of that. I will be
discontinuing active maintenance of this package (excluding perhaps
bugfixes or patches for compatibility with future React releases), and
recommending that people use Hooks instead. Your existing code with
Recompose will still work, just don't expect any new features.
Solution Two:
If you are using react version that does not support hooks, no worries, use recompose
(A React utility belt for function components and higher-order components.) instead. You can use recompose
for attaching lifecycle hooks, state, handlers etc
to a functional component.
Here’s a render-less component that attaches lifecycle methods via the lifecycle HOC (from recompose).
// taken from https://gist.github.com/tsnieman/056af4bb9e87748c514d#file-auth-js-L33
function RenderlessComponent() {
return null;
}
export default lifecycle({
componentDidMount() {
const { checkIfAuthed } = this.props;
// Do they have an active session? ("Remember me")
checkIfAuthed();
},
componentWillReceiveProps(nextProps) {
const {
loadUser,
} = this.props;
// Various 'indicators'..
const becameAuthed = (!(this.props.auth) && nextProps.auth);
const isCurrentUser = (this.props.currentUser !== null);
if (becameAuthed) {
loadUser(nextProps.auth.uid);
}
const shouldSetCurrentUser = (!isCurrentUser && nextProps.auth);
if (shouldSetCurrentUser) {
const currentUser = nextProps.users[nextProps.auth.uid];
if (currentUser) {
this.props.setCurrentUser({
'id': nextProps.auth.uid,
...currentUser,
});
}
}
}
})(RenderlessComponent);
Solution One:
You can use new react HOOKS API. Currently in React v16.7.0-alpha
Hooks let you use more of React’s features without classes.
Hooks provide a more direct API to the React concepts you already know: props, state, context, refs, and lifecycle.
Hooks solves all the problems addressed with Recompose.
A Note from the Author of recompose
(acdlite, Oct 25 2018):
Hi! I created Recompose about three years ago. About a year after
that, I joined the React team. Today, we announced a proposal for
Hooks. Hooks solves all the problems I attempted to address with
Recompose three years ago, and more on top of that. I will be
discontinuing active maintenance of this package (excluding perhaps
bugfixes or patches for compatibility with future React releases), and
recommending that people use Hooks instead. Your existing code with
Recompose will still work, just don't expect any new features.
Solution Two:
If you are using react version that does not support hooks, no worries, use recompose
(A React utility belt for function components and higher-order components.) instead. You can use recompose
for attaching lifecycle hooks, state, handlers etc
to a functional component.
Here’s a render-less component that attaches lifecycle methods via the lifecycle HOC (from recompose).
// taken from https://gist.github.com/tsnieman/056af4bb9e87748c514d#file-auth-js-L33
function RenderlessComponent() {
return null;
}
export default lifecycle({
componentDidMount() {
const { checkIfAuthed } = this.props;
// Do they have an active session? ("Remember me")
checkIfAuthed();
},
componentWillReceiveProps(nextProps) {
const {
loadUser,
} = this.props;
// Various 'indicators'..
const becameAuthed = (!(this.props.auth) && nextProps.auth);
const isCurrentUser = (this.props.currentUser !== null);
if (becameAuthed) {
loadUser(nextProps.auth.uid);
}
const shouldSetCurrentUser = (!isCurrentUser && nextProps.auth);
if (shouldSetCurrentUser) {
const currentUser = nextProps.users[nextProps.auth.uid];
if (currentUser) {
this.props.setCurrentUser({
'id': nextProps.auth.uid,
...currentUser,
});
}
}
}
})(RenderlessComponent);
edited Nov 22 at 5:27
answered Oct 29 at 12:48
Shivam
1,0721228
1,0721228
add a comment |
add a comment |
up vote
4
down vote
If you need use React LifeCycle, you need use Class.
Sample:
import React, { Component } from 'react';
class Grid extends Component {
constructor(props){
super(props)
}
componentDidMount () { /* do something */ }
render () {
return <h1>Hello</h1>
}
}
I don't want to use the class.
– Aftab Naveed
Jun 12 '17 at 18:34
1
But, componentDidMount just work in class :/
– Gabriel Ferreira
Jun 12 '17 at 18:35
1
hmm makes sense thank you.
– Aftab Naveed
Jun 12 '17 at 18:59
You're welcome :D
– Gabriel Ferreira
Jun 12 '17 at 20:15
add a comment |
up vote
4
down vote
If you need use React LifeCycle, you need use Class.
Sample:
import React, { Component } from 'react';
class Grid extends Component {
constructor(props){
super(props)
}
componentDidMount () { /* do something */ }
render () {
return <h1>Hello</h1>
}
}
I don't want to use the class.
– Aftab Naveed
Jun 12 '17 at 18:34
1
But, componentDidMount just work in class :/
– Gabriel Ferreira
Jun 12 '17 at 18:35
1
hmm makes sense thank you.
– Aftab Naveed
Jun 12 '17 at 18:59
You're welcome :D
– Gabriel Ferreira
Jun 12 '17 at 20:15
add a comment |
up vote
4
down vote
up vote
4
down vote
If you need use React LifeCycle, you need use Class.
Sample:
import React, { Component } from 'react';
class Grid extends Component {
constructor(props){
super(props)
}
componentDidMount () { /* do something */ }
render () {
return <h1>Hello</h1>
}
}
If you need use React LifeCycle, you need use Class.
Sample:
import React, { Component } from 'react';
class Grid extends Component {
constructor(props){
super(props)
}
componentDidMount () { /* do something */ }
render () {
return <h1>Hello</h1>
}
}
answered Jun 12 '17 at 18:24
Gabriel Ferreira
31014
31014
I don't want to use the class.
– Aftab Naveed
Jun 12 '17 at 18:34
1
But, componentDidMount just work in class :/
– Gabriel Ferreira
Jun 12 '17 at 18:35
1
hmm makes sense thank you.
– Aftab Naveed
Jun 12 '17 at 18:59
You're welcome :D
– Gabriel Ferreira
Jun 12 '17 at 20:15
add a comment |
I don't want to use the class.
– Aftab Naveed
Jun 12 '17 at 18:34
1
But, componentDidMount just work in class :/
– Gabriel Ferreira
Jun 12 '17 at 18:35
1
hmm makes sense thank you.
– Aftab Naveed
Jun 12 '17 at 18:59
You're welcome :D
– Gabriel Ferreira
Jun 12 '17 at 20:15
I don't want to use the class.
– Aftab Naveed
Jun 12 '17 at 18:34
I don't want to use the class.
– Aftab Naveed
Jun 12 '17 at 18:34
1
1
But, componentDidMount just work in class :/
– Gabriel Ferreira
Jun 12 '17 at 18:35
But, componentDidMount just work in class :/
– Gabriel Ferreira
Jun 12 '17 at 18:35
1
1
hmm makes sense thank you.
– Aftab Naveed
Jun 12 '17 at 18:59
hmm makes sense thank you.
– Aftab Naveed
Jun 12 '17 at 18:59
You're welcome :D
– Gabriel Ferreira
Jun 12 '17 at 20:15
You're welcome :D
– Gabriel Ferreira
Jun 12 '17 at 20:15
add a comment |
up vote
0
down vote
You can make use of create-react-class module.
Official documentation
Of course you must first install it
npm install create-react-class
Here is a working example
import React from "react";
import ReactDOM from "react-dom"
let createReactClass = require('create-react-class')
let Clock = createReactClass({
getInitialState:function(){
return {date:new Date()}
},
render:function(){
return (
<h1>{this.state.date.toLocaleTimeString()}</h1>
)
},
componentDidMount:function(){
this.timerId = setInterval(()=>this.setState({date:new Date()}),1000)
},
componentWillUnmount:function(){
clearInterval(this.timerId)
}
})
ReactDOM.render(
<Clock/>,
document.getElementById('root')
)
add a comment |
up vote
0
down vote
You can make use of create-react-class module.
Official documentation
Of course you must first install it
npm install create-react-class
Here is a working example
import React from "react";
import ReactDOM from "react-dom"
let createReactClass = require('create-react-class')
let Clock = createReactClass({
getInitialState:function(){
return {date:new Date()}
},
render:function(){
return (
<h1>{this.state.date.toLocaleTimeString()}</h1>
)
},
componentDidMount:function(){
this.timerId = setInterval(()=>this.setState({date:new Date()}),1000)
},
componentWillUnmount:function(){
clearInterval(this.timerId)
}
})
ReactDOM.render(
<Clock/>,
document.getElementById('root')
)
add a comment |
up vote
0
down vote
up vote
0
down vote
You can make use of create-react-class module.
Official documentation
Of course you must first install it
npm install create-react-class
Here is a working example
import React from "react";
import ReactDOM from "react-dom"
let createReactClass = require('create-react-class')
let Clock = createReactClass({
getInitialState:function(){
return {date:new Date()}
},
render:function(){
return (
<h1>{this.state.date.toLocaleTimeString()}</h1>
)
},
componentDidMount:function(){
this.timerId = setInterval(()=>this.setState({date:new Date()}),1000)
},
componentWillUnmount:function(){
clearInterval(this.timerId)
}
})
ReactDOM.render(
<Clock/>,
document.getElementById('root')
)
You can make use of create-react-class module.
Official documentation
Of course you must first install it
npm install create-react-class
Here is a working example
import React from "react";
import ReactDOM from "react-dom"
let createReactClass = require('create-react-class')
let Clock = createReactClass({
getInitialState:function(){
return {date:new Date()}
},
render:function(){
return (
<h1>{this.state.date.toLocaleTimeString()}</h1>
)
},
componentDidMount:function(){
this.timerId = setInterval(()=>this.setState({date:new Date()}),1000)
},
componentWillUnmount:function(){
clearInterval(this.timerId)
}
})
ReactDOM.render(
<Clock/>,
document.getElementById('root')
)
answered Oct 29 at 12:36
Chandan Purohit
79889
79889
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f44506207%2freactjs-lifecycle-method-inside-a-functional-component%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
I think a reason should be provided for downvoting a question or an answer.
– Aftab Naveed
Jun 12 '17 at 21:48
I think it's a good question, though the note on classes being dumb is a personal opinion and might have earned the downvoting :)
– Joehannes
Oct 13 '17 at 17:02
1
Understood, but that's the way the REACT community calls it :-)
– Aftab Naveed
Oct 19 '17 at 7:20
It's always safer inside the herd, but when you reach the edges it starts getting messy ...
– Joehannes
Oct 20 '17 at 12:59
functional components are not supposed to have lifecycle methods. because they are just functions. and functions don't have methods. there are classes for that
– avalanche1
Oct 24 at 11:10