Simply said: NO!
React was not created for Redux, and Redux was not created for React.
From the official website (https://redux.js.org/faq/general):
I would like to amend this: don't use Redux until you have problems
with vanilla React
So if you can do your job without Redux it is recommended not to use it.
And my past experience confirms that it is a very healthy recommendation for multiple reasons:
Lots of boiler plate that will grown along with the application (this applies also for Redux toolkit, you will still have a lot of extra code but not as much as with plain Redux).
You can't prototype something very fast to try and see if it works.
Will slow down delivery, so if yo have to deliver constantly in a fast manner, there is no time for Redux.
Components cannot be reused with different data sets. Think of having 100 typeaheads across your app for searching for 100 different types of entities. You have to adapt all entities to the same data structure plus you have no control on the order of writing to that state. Any instantiated component can dispatch to that state from anywhere and any time.
Global access is usually bad in programming because it can bring the application into an unpredictable state. Every instantiated component can change anything any time. So it is a high probability that you can end up in states you never dreamed of. And this probability grows along with the application because you are growing the global access. Of course Redux has amazing dev tools and architecture that help you track the paths that put the application into an unpredictable state. But why spend time on tracking when you cand avoid it?
Global access is bad for developing new features + bug fixing, because changes in place A can ruin something in places B, C, D because A, B, C and D share the same global state. So when you fix/develop something you have to do regression every where, where the state is used, which again is time consuming and things get worse as the application grows. Fast bug fixing in production will become a nightmare if you do not have bullet prof automated regression tests.
Unit testing becomes way more harder for components that use Redux because you throw away dependency injection when using Redux. And every developer knows that dependency injection is one the best friends of unit testing. Anyway you will have to find a third party library that will do some magic mocking of the Redux part and still you will have issues as the number of unit tests grows, mostly because of the the global access and the magic mocking which is not in your control. Every developer knows that global access is one of the worst enemies of unit testing and extensible code. So unit testing will become a nightmare as the application grows.
As the application starts growing the state well keep growing and it will be very hard to follow especially if not planned right.
As the application grows you will encounter performance issues (UI level).
So based on my experience I would say don't do that and try to identify if you have problems that Redux can solve and vanilla React can't, and only then use it.
I often read online that Redux should be used for large application. And I disagree with this statement for the reasons mentioned above. As longer the global state and global access grow, the higher the probability the development, bug fixing, testing time will grow too, because "global" is usually an evil word in programming for many reasons. So you have to be careful when using "global" stuff. Of course Redux is a special kind of global access with a controlled way of doing things and time traveling. But still it has to be used wisely. Global access in general can be very useful or very harming depending on how, when and for what purpose it is used.
I would say Redux is more fit for complex applications, and even small applications as long as they have a complex part. But for sure not large applications if the complexity is low. An let me give you and example:
You can have a large SPA with 100+ "pages", and the client wants to be delivered yesterday. Each page represents a CRUD interface for a different type of entity, not very complex. No Entity is used in two separate pages. Why would would you add Redux everywhere in this case, when every page has nothing to do with the other? You can keep local state at each page level, incapsulated, inject the data service via default props as an abstract async function and that's it. You will have less code, deliver faster, test faster because you inject the data service in an abstract way and you don't have to worry that you or someone else will break something in pages B, C, D by touching page A.
On the other hand you can have a small application, let's say even one "page". But that page contains 30 distinct inner components, where each component is user interactable and the user can do lots of clicks every where, and double clicks, and right clicks, and drag and drops every where, and resizing and typing, and some components state depend on other component state, some components interchange with other components depending on state and so one. For sure Redux is better choice here.
Or some people say that you should do everything with Redux because you have a single source truth. But in case of server data, isn't the endpoint the single source of truth? Why do you want to centralize a copy of the server data in the UI when you already have a single centralized source of truth: the actual BE endpoints. Querying an endpoint is way more truthy than querying a global copy that can be changed any time from anywhere in the UI. If somebody says but what about caching, well yes, first of all you have to know if you need caching at all and second Redux was not developed for caching. Dedicated libraries exist for caching like React Query which is way more elegant and flexible for this purpose. And as for UI state (ex: isModalVisible), each "page" should have it's own encapsulated single source of truth. Because globally accessing things that are meant to be local is again bad practice for all the reasons mentioned above.
I often heard that you should put server data in Redux because the component should not know about the data source. Sure but if you inject an async function via props that makes the request, the component will still not know the data source. It is using an abstraction and it is easily testable without installing a bunch of other helpers.
Some use Redux to avoid prop drilling but usually if the "page" is not complex you shouldn't end up with a deep tree of components. Most components are most probably layout components and you can use the children property to extract the middle components that you have to drill only to pass further the data somewhere below .
So as a conclusion, I say the same thing as it says on the official website:
"Don't use Redux until you have problems with vanilla React".
Redux was not developed for storing server data, you can do this with vanilla React.
Redux was not developed for UI state, you can do this with vanilla React.
Redux was not developed for caching, this is another story and it usually has to be done server side, but if on the server there is no possibility for some reason, they are dedicated tools for caching on FE like React Query.
Redux was not developed for large applications, you can do this in vanilla React if you are bit smart and organized.
Redux was developed to solve complex problems, for complex applications or applications that contain complex parts, that will give you big problems in vanilla React. Think like Facebook, where the application is huge + complex, and each request counts because they have billions+ each day, everything has to be fixed quick. As far as I read on different blogs, they didn't build the architecture on Redux, they introduced it when they actually encountered problems that had not other solution. To avoid performance issues (each request and opened web socket counts) for such a highly "stressed" app and provide a relatively easy fix, they needed a global access mechanism (so global is the hero here) to fix something not to build on top of it... and they also needed this global access to be predictable and time traveling so they can debug and trace the path that put the application in an undesirable state.
So unless yo have problems with vanilla React, unless you have complex problems to solve, you don't need Redux. You just need to be a bit smart and organized.
Think as React state as the police department and Redux state as the swat team. You call the swat team when the police department doesn't manage. You don't make the swat team do police work just because the police has a lot of work to do (large app). You let the swat team do the things it was trained for.