I think, the most important aspect I tell my developers is to not define functions inline during render.
So, do not do this:
<button onClick={ () => this.smth() }></button>
This creates a new function every time the rendering happens and mutates the prop onClick on every render. Once you have a component with a lot of elements (e.g. inputs) and child components that check for changes props to determine whether to render, this will get you in performance trouble.We do not use class arrow functions but instead have helpers to bind specific functions to the component's context or generate setter functions.