A side-effect of a function is anything the function does that affects any part of the system outside of the function scope.
Examples of side effects are:
changing a value of a global variable
making a network request
changing the DOM
logging to a console
registering a event listener
using external code might be a side-effect
What is not a side effect:
changing a value of a local variable
Dumb components
Those components should be pure functions that receive some data from their parent using props and based on that return JSX element. They have no internal state, very little (or none at all) logic.
They are easy to write, easy to understand and easy to test.
Smart components
Usually impure functions, have some internal state, make requests to server, etc. This is where the application logic and 99% of bugs are.
In action
Let's get back to the counting Clicker component and split it into a smart and a dumb component:
The Clicker now is only concerned about the UI - how the clicker looks. It has clearly defined API, can be changed completely, without risking breaking any logic related to state or potential side-effects. It can be reused by another component, that does something entirely different when the button is clicked.
On the other hand, the ClickerContainer only knows how to update the state in reaction to the incrementClicks event. More abstract application of this pattern is called Higher Order Components or HOC and is a primary (little outdated) tool for sharing code among React components.