From Important Defaults section:
Query instances via useQuery or useInfiniteQuery by default consider
cached data as stale.
Stale queries are refetched automatically in the background when:
- New instances of the query mount
By default, when a query is successfully fetched, it's considered stale immediately, that's why your data is refetched every time you change the tab. You can set a longer staleTime (default to 0) if you don't want the aggressive refetching behavior:
const { isLoading, error, data } = useQuery("planets", fetchPlanets, {
  staleTime: 10000, // only eligible to refetch after 10 seconds
});
Optionally, you can set staleTime globally for all queries during QueryClient instantiation, like so:
const queryClient = new QueryClient({
    defaultOptions: { queries: { staleTime: 10000 }}
});
There is another error in your code not very related to react-query, in this code of yours below:
function App() {
  const [page, setPage] = useState("planets");
  const queryClient = new QueryClient();
  const pageSetter = (page) => {
    setPage(page);
  };
  return (
    <QueryClientProvider client={queryClient}>
      <div className="App">
        <h1>Star Wars Info</h1>
        <Navbar setPage={pageSetter} />
        <div className="content">
          {page === "planets" ? <Planets /> : <People />}
        </div>
      </div>
    </QueryClientProvider>
  );
}
Every time the user clicks the buttons to display different data, the whole component gets re-render, a new instance of queryClient is created and passed to QueryClientProvider,  resetting any internal state of the client cache. You should decouple your component to avoid unnecessary re-render like this:
function Content() {
  const [page, setPage] = useState("planets");
  const pageSetter = (page) => {
    setPage(page);
  };
  return (
    <div className="App">
      <h1>Star Wars Info</h1>
      <Navbar setPage={pageSetter} />
      <div className="content">
        {page === "planets" ? <Planets /> : <People />}
      </div>
    </div>
  );
}
// top level component, should not get re-rendered
function App() {
  const queryClient = new QueryClient();
  return (
    <QueryClientProvider client={queryClient}>
      <Content />
    </QueryClientProvider>
  );
}
Live Demo
