My answer:
I've trained myself very long time to think in functional programming's way so I maybe not the best one to answer this question but here're are some tips I got in building https://jianliao.com .
Back the time we are using Backbone we used Backbone.Events a lot to synchronise states among different views. It was quite troublesome as our app grow and the behaviors are hard to predict. After migrated to React the event emitters are still there, but we decide to make them as few as possible.
Facebook introduced immutable-js for JavaScript. React does not force people to use immutable data, but if someone use mutable objects everywhere he will find it very hard to optimise the performance after the app grows larger. Also immutable data is more reliable.
We already known it's bad idea to add side-effects in the function body of this.render. I found it also bad idea to have that in this.componentDidMount this.componentWillUnmount. If you are using tools like Redux which time travels you will find components mount and unmount for many reasons, and they are also part of the rendering process. So, don't introduce side-effects in lifetime hooks if you still have other choices.