Kent C. Dodds devoted a whole talk to this, discussing how one should "avoid hasty abstractions":
This speaker touched upon this in a talk that I mostly didn't like, because it is built on overstrained comparisons, but which got rather popular in the React community, and which does contain some valuable nuggets of wisdom:
This speaker, too (also in a talk with quite a bit of fluff in it), says how she dislikes shared components with reusable logic because of the interdependencies they create between different parts of an application:
I bet backend devs had this conversation a long time ago, and it has just recently reached the frontend. It sure takes experience to decide when to build a reusable abstraction and when to write a piece of logic in situ. A teammate of mine goes for reusability almost from the start, while I am more of an in situ kind of guy. Sure makes for long code reviews.