Child component doesn't get changed prop





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







1















I have the following structure:



class Parent extends React.Component {

componentDidMount() {
document.addEventListener('keydown', () => {
this.value++;
})
}

this.value = 0;

render() {
return (<ChildComponent value={this.value} />)


ChildComponent simply renders the value:



class ChildComponent extends Component {
render() {
return (
<div>
{this.props.value}
</div>
);
}}


I don't want to rerender Parent component on every KeyDown event, that's why I don't put a value to the state.



I want ChildComponent rerenders on every KeyDown event, but ChildComponent renders only once because it doesn't get changed value and always shows 0 although this.value is changing.



Is it possible to rerender ChildComponent while changing this.value of the ParentComponent or I should place logic into ChildComponent using setState to render correct result?










share|improve this question























  • Without updating the state, you cannot trigger render on Parent. I see setState the best approach.

    – Adam Azad
    Nov 24 '18 at 12:21


















1















I have the following structure:



class Parent extends React.Component {

componentDidMount() {
document.addEventListener('keydown', () => {
this.value++;
})
}

this.value = 0;

render() {
return (<ChildComponent value={this.value} />)


ChildComponent simply renders the value:



class ChildComponent extends Component {
render() {
return (
<div>
{this.props.value}
</div>
);
}}


I don't want to rerender Parent component on every KeyDown event, that's why I don't put a value to the state.



I want ChildComponent rerenders on every KeyDown event, but ChildComponent renders only once because it doesn't get changed value and always shows 0 although this.value is changing.



Is it possible to rerender ChildComponent while changing this.value of the ParentComponent or I should place logic into ChildComponent using setState to render correct result?










share|improve this question























  • Without updating the state, you cannot trigger render on Parent. I see setState the best approach.

    – Adam Azad
    Nov 24 '18 at 12:21














1












1








1








I have the following structure:



class Parent extends React.Component {

componentDidMount() {
document.addEventListener('keydown', () => {
this.value++;
})
}

this.value = 0;

render() {
return (<ChildComponent value={this.value} />)


ChildComponent simply renders the value:



class ChildComponent extends Component {
render() {
return (
<div>
{this.props.value}
</div>
);
}}


I don't want to rerender Parent component on every KeyDown event, that's why I don't put a value to the state.



I want ChildComponent rerenders on every KeyDown event, but ChildComponent renders only once because it doesn't get changed value and always shows 0 although this.value is changing.



Is it possible to rerender ChildComponent while changing this.value of the ParentComponent or I should place logic into ChildComponent using setState to render correct result?










share|improve this question














I have the following structure:



class Parent extends React.Component {

componentDidMount() {
document.addEventListener('keydown', () => {
this.value++;
})
}

this.value = 0;

render() {
return (<ChildComponent value={this.value} />)


ChildComponent simply renders the value:



class ChildComponent extends Component {
render() {
return (
<div>
{this.props.value}
</div>
);
}}


I don't want to rerender Parent component on every KeyDown event, that's why I don't put a value to the state.



I want ChildComponent rerenders on every KeyDown event, but ChildComponent renders only once because it doesn't get changed value and always shows 0 although this.value is changing.



Is it possible to rerender ChildComponent while changing this.value of the ParentComponent or I should place logic into ChildComponent using setState to render correct result?







javascript reactjs






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 24 '18 at 12:13









Evgeny KuznetsovEvgeny Kuznetsov

1,00021220




1,00021220













  • Without updating the state, you cannot trigger render on Parent. I see setState the best approach.

    – Adam Azad
    Nov 24 '18 at 12:21



















  • Without updating the state, you cannot trigger render on Parent. I see setState the best approach.

    – Adam Azad
    Nov 24 '18 at 12:21

















Without updating the state, you cannot trigger render on Parent. I see setState the best approach.

– Adam Azad
Nov 24 '18 at 12:21





Without updating the state, you cannot trigger render on Parent. I see setState the best approach.

– Adam Azad
Nov 24 '18 at 12:21












2 Answers
2






active

oldest

votes


















1














You should add the value to parent state. This is simply the way React works. Even if you could manually trigger a rerender on the child component, it would still be 0 as still 0 is provided props. When React detects state has changed on Parent component, it will calculate the virtual dom of all child elements, do a diff on the virtual dom vs the real dom, then selectively update the real dom with those values (only the inner text of the Child component div will actually be new). React is incredibly optimised to handle rerendering using the virtual dom, and you should not worry about performance loss of this situation.






share|improve this answer































    1














    The reason the child component didn’t get called when value changes because you are overriding normal variable value but not react component state. So inorder to call child component when value changes you need to manage value property in component state of parent so whenever you modify it’s value using setState, component will re render



    Change



       class Parent extends React.Component {

    componentDidMount() {
    document.addEventListener('keydown', () => {
    this.value++;
    })
    }

    this.value = 0;

    render() {
    return (<ChildComponent value={this.value} />)
    }
    }


    To



      class Parent extends React.Component {
    constructor(props){
    super(props);
    this.state = {
    value: 0
    }
    }
    componentDidMount() {
    document.addEventListener('keydown', () => {
    this.setState({value: this.state.value++});
    })
    }

    render() {
    return (<ChildComponent value={this.state.value} />)
    }
    }





    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%2f53458027%2fchild-component-doesnt-get-changed-prop%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














      You should add the value to parent state. This is simply the way React works. Even if you could manually trigger a rerender on the child component, it would still be 0 as still 0 is provided props. When React detects state has changed on Parent component, it will calculate the virtual dom of all child elements, do a diff on the virtual dom vs the real dom, then selectively update the real dom with those values (only the inner text of the Child component div will actually be new). React is incredibly optimised to handle rerendering using the virtual dom, and you should not worry about performance loss of this situation.






      share|improve this answer




























        1














        You should add the value to parent state. This is simply the way React works. Even if you could manually trigger a rerender on the child component, it would still be 0 as still 0 is provided props. When React detects state has changed on Parent component, it will calculate the virtual dom of all child elements, do a diff on the virtual dom vs the real dom, then selectively update the real dom with those values (only the inner text of the Child component div will actually be new). React is incredibly optimised to handle rerendering using the virtual dom, and you should not worry about performance loss of this situation.






        share|improve this answer


























          1












          1








          1







          You should add the value to parent state. This is simply the way React works. Even if you could manually trigger a rerender on the child component, it would still be 0 as still 0 is provided props. When React detects state has changed on Parent component, it will calculate the virtual dom of all child elements, do a diff on the virtual dom vs the real dom, then selectively update the real dom with those values (only the inner text of the Child component div will actually be new). React is incredibly optimised to handle rerendering using the virtual dom, and you should not worry about performance loss of this situation.






          share|improve this answer













          You should add the value to parent state. This is simply the way React works. Even if you could manually trigger a rerender on the child component, it would still be 0 as still 0 is provided props. When React detects state has changed on Parent component, it will calculate the virtual dom of all child elements, do a diff on the virtual dom vs the real dom, then selectively update the real dom with those values (only the inner text of the Child component div will actually be new). React is incredibly optimised to handle rerendering using the virtual dom, and you should not worry about performance loss of this situation.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 24 '18 at 12:39









          CecilCecil

          22625




          22625

























              1














              The reason the child component didn’t get called when value changes because you are overriding normal variable value but not react component state. So inorder to call child component when value changes you need to manage value property in component state of parent so whenever you modify it’s value using setState, component will re render



              Change



                 class Parent extends React.Component {

              componentDidMount() {
              document.addEventListener('keydown', () => {
              this.value++;
              })
              }

              this.value = 0;

              render() {
              return (<ChildComponent value={this.value} />)
              }
              }


              To



                class Parent extends React.Component {
              constructor(props){
              super(props);
              this.state = {
              value: 0
              }
              }
              componentDidMount() {
              document.addEventListener('keydown', () => {
              this.setState({value: this.state.value++});
              })
              }

              render() {
              return (<ChildComponent value={this.state.value} />)
              }
              }





              share|improve this answer






























                1














                The reason the child component didn’t get called when value changes because you are overriding normal variable value but not react component state. So inorder to call child component when value changes you need to manage value property in component state of parent so whenever you modify it’s value using setState, component will re render



                Change



                   class Parent extends React.Component {

                componentDidMount() {
                document.addEventListener('keydown', () => {
                this.value++;
                })
                }

                this.value = 0;

                render() {
                return (<ChildComponent value={this.value} />)
                }
                }


                To



                  class Parent extends React.Component {
                constructor(props){
                super(props);
                this.state = {
                value: 0
                }
                }
                componentDidMount() {
                document.addEventListener('keydown', () => {
                this.setState({value: this.state.value++});
                })
                }

                render() {
                return (<ChildComponent value={this.state.value} />)
                }
                }





                share|improve this answer




























                  1












                  1








                  1







                  The reason the child component didn’t get called when value changes because you are overriding normal variable value but not react component state. So inorder to call child component when value changes you need to manage value property in component state of parent so whenever you modify it’s value using setState, component will re render



                  Change



                     class Parent extends React.Component {

                  componentDidMount() {
                  document.addEventListener('keydown', () => {
                  this.value++;
                  })
                  }

                  this.value = 0;

                  render() {
                  return (<ChildComponent value={this.value} />)
                  }
                  }


                  To



                    class Parent extends React.Component {
                  constructor(props){
                  super(props);
                  this.state = {
                  value: 0
                  }
                  }
                  componentDidMount() {
                  document.addEventListener('keydown', () => {
                  this.setState({value: this.state.value++});
                  })
                  }

                  render() {
                  return (<ChildComponent value={this.state.value} />)
                  }
                  }





                  share|improve this answer















                  The reason the child component didn’t get called when value changes because you are overriding normal variable value but not react component state. So inorder to call child component when value changes you need to manage value property in component state of parent so whenever you modify it’s value using setState, component will re render



                  Change



                     class Parent extends React.Component {

                  componentDidMount() {
                  document.addEventListener('keydown', () => {
                  this.value++;
                  })
                  }

                  this.value = 0;

                  render() {
                  return (<ChildComponent value={this.value} />)
                  }
                  }


                  To



                    class Parent extends React.Component {
                  constructor(props){
                  super(props);
                  this.state = {
                  value: 0
                  }
                  }
                  componentDidMount() {
                  document.addEventListener('keydown', () => {
                  this.setState({value: this.state.value++});
                  })
                  }

                  render() {
                  return (<ChildComponent value={this.state.value} />)
                  }
                  }






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Nov 24 '18 at 17:47

























                  answered Nov 24 '18 at 12:46









                  Hemadri DasariHemadri Dasari

                  10.4k32358




                  10.4k32358






























                      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%2f53458027%2fchild-component-doesnt-get-changed-prop%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







                      這個網誌中的熱門文章

                      Xamarin.form Move up view when keyboard appear

                      Post-Redirect-Get with Spring WebFlux and Thymeleaf

                      Anylogic : not able to use stopDelay()