React Hooks: The February 2019 Shift in React 16.8
React Hooks shipped in React 16.8, released in February 2019, and it is hard to overstate how much that single release changed the way React code is written. Before Hooks, state and lifecycle behavior lived inside class components, and the community was split between classes and a patchwork of patterns. After 16.8, functions became the default way to hold state and side effects, and the mental model of a React component shifted permanently. For someone who has maintained a React app through that transition, the before and after is unmistakable.
To understand the impact you have to remember what came before. A component that needed local state had to be a class. You wrote constructor methods to initialize state, bound handlers to preserve this, and used lifecycle methods like componentDidMount and componentDidUpdate to fetch data or subscribe to events. Reusing stateful logic meant higher order components or render props, which layered anonymous wrappers and props drilling into otherwise simple trees. It worked, but it was verbose and easy to get wrong, especially around whether this was bound in the right scope.
Hooks replaced that machinery with plain functions. useState gives you a value and a setter without a class. useEffect lets you run side effects and clean them up in the same place. Custom Hooks, functions that call other Hooks, became the idiomatic way to share stateful logic between components, which was precisely the problem that classes and higher order components had only solved clumsily. You could finally extract a fetch-and-cache routine into a function and call it from any component, with none of the wrapper nesting.
The design was grounded in the same fiber-based reconciler that had recently landed. Rules like calling Hooks unconditionally at the top level exist because React tracks calls in a stable order that is keyed to the component's position in the tree, not to any name or internal state. That is why the rules of Hooks matter so much, and why React ships a lint plugin to enforce them. A Hook called inside a conditional would desynchronize the order and break the association between a component and its state.
For a senior developer the shift is also a lesson in why APIs matter. Classes were not wrong, they were just overhead that stood between a developer and an idea. Hooks removed that overhead and let the thing you actually want to express, "this component fetches data and renders it," live as a short, readable function. The popularity of the release was not because the syntax was clever, but because it made ordinary React work dramatically simpler and easier to reason about.
The release was explicitly marked as the stable debut of a technology that had been previewed months earlier. By the time React 16.8 went out, the ecosystem had already begun reorganizing around function components, and almost every popular library published Hooks compatible versions. Eight years on, class components are widely seen only in legacy code, and new React is written with Hooks everywhere. That February release did not just add a feature, it decided the future direction of the entire framework and set the standard every modern React developer works against today.