How to stop subscribing store updates?












0















I move user from component1 to component2 by this.props.history.push. When I am in component2 it looks like component1 is still mounted.



I tried everything as in similar problems with unsubscribe store.



import React, {Component} from 'react';
import axios from 'axios';
import {Animate} from 'react-animate-mount';
import {translateTexts} from "../App";
import store from "../../store";


class Component1 extends Component {

constructor(props) {
super(props);
this.state = {
texts: {
computing: null
},
};
}

componentWillUnmount() {
return store.subscribe(() => {
console.log('unmount');
})
}

componentWillMount() {
store.subscribe(() => {
translateTexts(this.state.texts),store.getState().translate.userLanguage).then((res) => {{
this.setState({texts: res.data});
});
});


axios.post(`/api/`)
.then((res) => {
this.setState({show: false});
setTimeout(() => {
window.location.href = '/storage/'+res.data.id
}, 600);
})
.catch((err) => {
this.props.history.push({
pathname: '/error/'+err.response.status,
state: { code: err.response.status }});
});
});


render() {
return (
<div className="box">
Something
</div>
);
}
}

export default Component1;




import React, { Component } from 'react';
import store from "../../store";
import {translateTexts} from "../App";

class Component2 extends Component {

constructor(props) {
super(props);
this.state = {
code : null,
texts: {
msg: null
}
};
}

componentWillMount() {
this.setState( {
code: this.props.location.state.code,
});

store.subscribe(() => {
translateTexts(this.state.texts),store.getState().translate.userLanguage).then((res) => {{
this.setState({texts: res.data});
});
});
}

render() {
return (
<div>
Code: {this.state.code}
<br></br>
Message: <strong>{this.state.texts.msg}</strong>
</div>
);
}
}

export default Component2;


After componentWillUnmount I would to stop subscribing store events in component, because now when my store updates I see log unmount in my console, so Component1 is somehow mounted.
Thanks for any suggestions.










share|improve this question























  • A good practice is to keep your subscription open until the component unmounts. You can use componentWillUnmount to unsubscribe. You could also subscribe in the constructor, but I would suggest you don't do this as that's not what constructors are for.

    – Baruch
    Jan 18 at 16:04
















0















I move user from component1 to component2 by this.props.history.push. When I am in component2 it looks like component1 is still mounted.



I tried everything as in similar problems with unsubscribe store.



import React, {Component} from 'react';
import axios from 'axios';
import {Animate} from 'react-animate-mount';
import {translateTexts} from "../App";
import store from "../../store";


class Component1 extends Component {

constructor(props) {
super(props);
this.state = {
texts: {
computing: null
},
};
}

componentWillUnmount() {
return store.subscribe(() => {
console.log('unmount');
})
}

componentWillMount() {
store.subscribe(() => {
translateTexts(this.state.texts),store.getState().translate.userLanguage).then((res) => {{
this.setState({texts: res.data});
});
});


axios.post(`/api/`)
.then((res) => {
this.setState({show: false});
setTimeout(() => {
window.location.href = '/storage/'+res.data.id
}, 600);
})
.catch((err) => {
this.props.history.push({
pathname: '/error/'+err.response.status,
state: { code: err.response.status }});
});
});


render() {
return (
<div className="box">
Something
</div>
);
}
}

export default Component1;




import React, { Component } from 'react';
import store from "../../store";
import {translateTexts} from "../App";

class Component2 extends Component {

constructor(props) {
super(props);
this.state = {
code : null,
texts: {
msg: null
}
};
}

componentWillMount() {
this.setState( {
code: this.props.location.state.code,
});

store.subscribe(() => {
translateTexts(this.state.texts),store.getState().translate.userLanguage).then((res) => {{
this.setState({texts: res.data});
});
});
}

render() {
return (
<div>
Code: {this.state.code}
<br></br>
Message: <strong>{this.state.texts.msg}</strong>
</div>
);
}
}

export default Component2;


After componentWillUnmount I would to stop subscribing store events in component, because now when my store updates I see log unmount in my console, so Component1 is somehow mounted.
Thanks for any suggestions.










share|improve this question























  • A good practice is to keep your subscription open until the component unmounts. You can use componentWillUnmount to unsubscribe. You could also subscribe in the constructor, but I would suggest you don't do this as that's not what constructors are for.

    – Baruch
    Jan 18 at 16:04














0












0








0








I move user from component1 to component2 by this.props.history.push. When I am in component2 it looks like component1 is still mounted.



I tried everything as in similar problems with unsubscribe store.



import React, {Component} from 'react';
import axios from 'axios';
import {Animate} from 'react-animate-mount';
import {translateTexts} from "../App";
import store from "../../store";


class Component1 extends Component {

constructor(props) {
super(props);
this.state = {
texts: {
computing: null
},
};
}

componentWillUnmount() {
return store.subscribe(() => {
console.log('unmount');
})
}

componentWillMount() {
store.subscribe(() => {
translateTexts(this.state.texts),store.getState().translate.userLanguage).then((res) => {{
this.setState({texts: res.data});
});
});


axios.post(`/api/`)
.then((res) => {
this.setState({show: false});
setTimeout(() => {
window.location.href = '/storage/'+res.data.id
}, 600);
})
.catch((err) => {
this.props.history.push({
pathname: '/error/'+err.response.status,
state: { code: err.response.status }});
});
});


render() {
return (
<div className="box">
Something
</div>
);
}
}

export default Component1;




import React, { Component } from 'react';
import store from "../../store";
import {translateTexts} from "../App";

class Component2 extends Component {

constructor(props) {
super(props);
this.state = {
code : null,
texts: {
msg: null
}
};
}

componentWillMount() {
this.setState( {
code: this.props.location.state.code,
});

store.subscribe(() => {
translateTexts(this.state.texts),store.getState().translate.userLanguage).then((res) => {{
this.setState({texts: res.data});
});
});
}

render() {
return (
<div>
Code: {this.state.code}
<br></br>
Message: <strong>{this.state.texts.msg}</strong>
</div>
);
}
}

export default Component2;


After componentWillUnmount I would to stop subscribing store events in component, because now when my store updates I see log unmount in my console, so Component1 is somehow mounted.
Thanks for any suggestions.










share|improve this question














I move user from component1 to component2 by this.props.history.push. When I am in component2 it looks like component1 is still mounted.



I tried everything as in similar problems with unsubscribe store.



import React, {Component} from 'react';
import axios from 'axios';
import {Animate} from 'react-animate-mount';
import {translateTexts} from "../App";
import store from "../../store";


class Component1 extends Component {

constructor(props) {
super(props);
this.state = {
texts: {
computing: null
},
};
}

componentWillUnmount() {
return store.subscribe(() => {
console.log('unmount');
})
}

componentWillMount() {
store.subscribe(() => {
translateTexts(this.state.texts),store.getState().translate.userLanguage).then((res) => {{
this.setState({texts: res.data});
});
});


axios.post(`/api/`)
.then((res) => {
this.setState({show: false});
setTimeout(() => {
window.location.href = '/storage/'+res.data.id
}, 600);
})
.catch((err) => {
this.props.history.push({
pathname: '/error/'+err.response.status,
state: { code: err.response.status }});
});
});


render() {
return (
<div className="box">
Something
</div>
);
}
}

export default Component1;




import React, { Component } from 'react';
import store from "../../store";
import {translateTexts} from "../App";

class Component2 extends Component {

constructor(props) {
super(props);
this.state = {
code : null,
texts: {
msg: null
}
};
}

componentWillMount() {
this.setState( {
code: this.props.location.state.code,
});

store.subscribe(() => {
translateTexts(this.state.texts),store.getState().translate.userLanguage).then((res) => {{
this.setState({texts: res.data});
});
});
}

render() {
return (
<div>
Code: {this.state.code}
<br></br>
Message: <strong>{this.state.texts.msg}</strong>
</div>
);
}
}

export default Component2;


After componentWillUnmount I would to stop subscribing store events in component, because now when my store updates I see log unmount in my console, so Component1 is somehow mounted.
Thanks for any suggestions.







javascript reactjs redux react-redux store






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Jan 18 at 15:59









bddddbdddd

317




317













  • A good practice is to keep your subscription open until the component unmounts. You can use componentWillUnmount to unsubscribe. You could also subscribe in the constructor, but I would suggest you don't do this as that's not what constructors are for.

    – Baruch
    Jan 18 at 16:04



















  • A good practice is to keep your subscription open until the component unmounts. You can use componentWillUnmount to unsubscribe. You could also subscribe in the constructor, but I would suggest you don't do this as that's not what constructors are for.

    – Baruch
    Jan 18 at 16:04

















A good practice is to keep your subscription open until the component unmounts. You can use componentWillUnmount to unsubscribe. You could also subscribe in the constructor, but I would suggest you don't do this as that's not what constructors are for.

– Baruch
Jan 18 at 16:04





A good practice is to keep your subscription open until the component unmounts. You can use componentWillUnmount to unsubscribe. You could also subscribe in the constructor, but I would suggest you don't do this as that's not what constructors are for.

– Baruch
Jan 18 at 16:04












2 Answers
2






active

oldest

votes


















1














Store subscribe should return the unsubscribe function which you can call at componentWillUnmount to successfully unsubscribe from the store.



you can define and store it in state directly in componentWillMount:



this.setState({
unsubscribe: store.subscribe(() => {
translateTexts(this.state.texts),store.getState().translate.userLanguage).then((res) => {{
this.setState({texts: res.data});
});
});
});


and then call unsubscribe on componentWillUnmount



componentWillUnmount() {
this.state.unsubscribe()
}


Redux docs: https://redux.js.org/api/store#subscribe






share|improve this answer










New contributor




Giorgos Sideris is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
















  • 1





    Thank you... :-)

    – bdddd
    Jan 18 at 17:12



















0














If you're using React and Redux together, you really shouldn't be interacting with the store directly in your component. Instead, you should be using the official React-Redux library, which handles all the subscription and store update process for you. See the docs page on Why Use React Redux? for more details.






share|improve this answer























    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',
    autoActivateHeartbeat: false,
    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
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54257462%2fhow-to-stop-subscribing-store-updates%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    Store subscribe should return the unsubscribe function which you can call at componentWillUnmount to successfully unsubscribe from the store.



    you can define and store it in state directly in componentWillMount:



    this.setState({
    unsubscribe: store.subscribe(() => {
    translateTexts(this.state.texts),store.getState().translate.userLanguage).then((res) => {{
    this.setState({texts: res.data});
    });
    });
    });


    and then call unsubscribe on componentWillUnmount



    componentWillUnmount() {
    this.state.unsubscribe()
    }


    Redux docs: https://redux.js.org/api/store#subscribe






    share|improve this answer










    New contributor




    Giorgos Sideris is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.
















    • 1





      Thank you... :-)

      – bdddd
      Jan 18 at 17:12
















    1














    Store subscribe should return the unsubscribe function which you can call at componentWillUnmount to successfully unsubscribe from the store.



    you can define and store it in state directly in componentWillMount:



    this.setState({
    unsubscribe: store.subscribe(() => {
    translateTexts(this.state.texts),store.getState().translate.userLanguage).then((res) => {{
    this.setState({texts: res.data});
    });
    });
    });


    and then call unsubscribe on componentWillUnmount



    componentWillUnmount() {
    this.state.unsubscribe()
    }


    Redux docs: https://redux.js.org/api/store#subscribe






    share|improve this answer










    New contributor




    Giorgos Sideris is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.
















    • 1





      Thank you... :-)

      – bdddd
      Jan 18 at 17:12














    1












    1








    1







    Store subscribe should return the unsubscribe function which you can call at componentWillUnmount to successfully unsubscribe from the store.



    you can define and store it in state directly in componentWillMount:



    this.setState({
    unsubscribe: store.subscribe(() => {
    translateTexts(this.state.texts),store.getState().translate.userLanguage).then((res) => {{
    this.setState({texts: res.data});
    });
    });
    });


    and then call unsubscribe on componentWillUnmount



    componentWillUnmount() {
    this.state.unsubscribe()
    }


    Redux docs: https://redux.js.org/api/store#subscribe






    share|improve this answer










    New contributor




    Giorgos Sideris is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.










    Store subscribe should return the unsubscribe function which you can call at componentWillUnmount to successfully unsubscribe from the store.



    you can define and store it in state directly in componentWillMount:



    this.setState({
    unsubscribe: store.subscribe(() => {
    translateTexts(this.state.texts),store.getState().translate.userLanguage).then((res) => {{
    this.setState({texts: res.data});
    });
    });
    });


    and then call unsubscribe on componentWillUnmount



    componentWillUnmount() {
    this.state.unsubscribe()
    }


    Redux docs: https://redux.js.org/api/store#subscribe







    share|improve this answer










    New contributor




    Giorgos Sideris is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.









    share|improve this answer



    share|improve this answer








    edited Jan 18 at 16:16





















    New contributor




    Giorgos Sideris is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.









    answered Jan 18 at 16:10









    Giorgos SiderisGiorgos Sideris

    263




    263




    New contributor




    Giorgos Sideris is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.





    New contributor





    Giorgos Sideris is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.






    Giorgos Sideris is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.








    • 1





      Thank you... :-)

      – bdddd
      Jan 18 at 17:12














    • 1





      Thank you... :-)

      – bdddd
      Jan 18 at 17:12








    1




    1





    Thank you... :-)

    – bdddd
    Jan 18 at 17:12





    Thank you... :-)

    – bdddd
    Jan 18 at 17:12













    0














    If you're using React and Redux together, you really shouldn't be interacting with the store directly in your component. Instead, you should be using the official React-Redux library, which handles all the subscription and store update process for you. See the docs page on Why Use React Redux? for more details.






    share|improve this answer




























      0














      If you're using React and Redux together, you really shouldn't be interacting with the store directly in your component. Instead, you should be using the official React-Redux library, which handles all the subscription and store update process for you. See the docs page on Why Use React Redux? for more details.






      share|improve this answer


























        0












        0








        0







        If you're using React and Redux together, you really shouldn't be interacting with the store directly in your component. Instead, you should be using the official React-Redux library, which handles all the subscription and store update process for you. See the docs page on Why Use React Redux? for more details.






        share|improve this answer













        If you're using React and Redux together, you really shouldn't be interacting with the store directly in your component. Instead, you should be using the official React-Redux library, which handles all the subscription and store update process for you. See the docs page on Why Use React Redux? for more details.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Jan 18 at 17:02









        markeriksonmarkerikson

        21.4k44467




        21.4k44467






























            draft saved

            draft discarded




















































            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.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54257462%2fhow-to-stop-subscribing-store-updates%23new-answer', 'question_page');
            }
            );

            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







            Popular posts from this blog

            Callistus III

            Ostreoida

            Plistias Cous