1. Перерисовка компонента происходит, как следствие перерисовки родителя или вызовов this.setState() или this.forceUpdate().
Ее можно контролировать в class components с помощью метода жизненного цикла shouldComponentUpdate. При вызове this.forceUpdate() shouldComponentUpdate не вызывается.
2.
Изменение свойств (props) компонента, полученных от родителя или перерисовка родителя.
Получить новые свойства без перерисовки родителя невозможно.
Чтобы дочерние компоненты не перерисовывались по цепочке, вы должны реализовывать метод shouldComponentUpdate или использовать PureComponent там, где это уместно. Перерисовку функциональных компонентов контролировать нельзя(разве с помощью HOC). Использование HOC connect убирает все лишние перерисовки дочернего компонента.
3. Провайдеры это обычные компоненты. Перерисовывается родитель - перерисовываются они.
Все, что я написал выше, кроме кейса с connect, есть в официальной документации. Стоит открыть почитать.