/ README.md
README.md
1 Welcome to your new TanStack app! 2 3 # Getting Started 4 5 To run this application: 6 7 ```bash 8 npm install 9 npm run start 10 ``` 11 12 # Building For Production 13 14 To build this application for production: 15 16 ```bash 17 npm run build 18 ``` 19 20 ## Testing 21 22 This project uses [Vitest](https://vitest.dev/) for testing. You can run the tests with: 23 24 ```bash 25 npm run test 26 ``` 27 28 ## Styling 29 30 This project uses [Tailwind CSS](https://tailwindcss.com/) for styling. 31 32 33 ## Linting & Formatting 34 35 36 This project uses [eslint](https://eslint.org/) and [prettier](https://prettier.io/) for linting and formatting. Eslint is configured using [tanstack/eslint-config](https://tanstack.com/config/latest/docs/eslint). The following scripts are available: 37 38 ```bash 39 npm run lint 40 npm run format 41 npm run check 42 ``` 43 44 45 46 ## Routing 47 This project uses [TanStack Router](https://tanstack.com/router). The initial setup is a file based router. Which means that the routes are managed as files in `src/routes`. 48 49 ### Adding A Route 50 51 To add a new route to your application just add another a new file in the `./src/routes` directory. 52 53 TanStack will automatically generate the content of the route file for you. 54 55 Now that you have two routes you can use a `Link` component to navigate between them. 56 57 ### Adding Links 58 59 To use SPA (Single Page Application) navigation you will need to import the `Link` component from `@tanstack/react-router`. 60 61 ```tsx 62 import { Link } from "@tanstack/react-router"; 63 ``` 64 65 Then anywhere in your JSX you can use it like so: 66 67 ```tsx 68 <Link to="/about">About</Link> 69 ``` 70 71 This will create a link that will navigate to the `/about` route. 72 73 More information on the `Link` component can be found in the [Link documentation](https://tanstack.com/router/v1/docs/framework/react/api/router/linkComponent). 74 75 ### Using A Layout 76 77 In the File Based Routing setup the layout is located in `src/routes/__root.tsx`. Anything you add to the root route will appear in all the routes. The route content will appear in the JSX where you use the `<Outlet />` component. 78 79 Here is an example layout that includes a header: 80 81 ```tsx 82 import { Outlet, createRootRoute } from '@tanstack/react-router' 83 import { TanStackRouterDevtools } from '@tanstack/react-router-devtools' 84 85 import { Link } from "@tanstack/react-router"; 86 87 export const Route = createRootRoute({ 88 component: () => ( 89 <> 90 <header> 91 <nav> 92 <Link to="/">Home</Link> 93 <Link to="/about">About</Link> 94 </nav> 95 </header> 96 <Outlet /> 97 <TanStackRouterDevtools /> 98 </> 99 ), 100 }) 101 ``` 102 103 The `<TanStackRouterDevtools />` component is not required so you can remove it if you don't want it in your layout. 104 105 More information on layouts can be found in the [Layouts documentation](https://tanstack.com/router/latest/docs/framework/react/guide/routing-concepts#layouts). 106 107 108 ## Data Fetching 109 110 There are multiple ways to fetch data in your application. You can use TanStack Query to fetch data from a server. But you can also use the `loader` functionality built into TanStack Router to load the data for a route before it's rendered. 111 112 For example: 113 114 ```tsx 115 const peopleRoute = createRoute({ 116 getParentRoute: () => rootRoute, 117 path: "/people", 118 loader: async () => { 119 const response = await fetch("https://swapi.dev/api/people"); 120 return response.json() as Promise<{ 121 results: { 122 name: string; 123 }[]; 124 }>; 125 }, 126 component: () => { 127 const data = peopleRoute.useLoaderData(); 128 return ( 129 <ul> 130 {data.results.map((person) => ( 131 <li key={person.name}>{person.name}</li> 132 ))} 133 </ul> 134 ); 135 }, 136 }); 137 ``` 138 139 Loaders simplify your data fetching logic dramatically. Check out more information in the [Loader documentation](https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#loader-parameters). 140 141 ### React-Query 142 143 React-Query is an excellent addition or alternative to route loading and integrating it into you application is a breeze. 144 145 First add your dependencies: 146 147 ```bash 148 npm install @tanstack/react-query @tanstack/react-query-devtools 149 ``` 150 151 Next we'll need to create a query client and provider. We recommend putting those in `main.tsx`. 152 153 ```tsx 154 import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; 155 156 // ... 157 158 const queryClient = new QueryClient(); 159 160 // ... 161 162 if (!rootElement.innerHTML) { 163 const root = ReactDOM.createRoot(rootElement); 164 165 root.render( 166 <QueryClientProvider client={queryClient}> 167 <RouterProvider router={router} /> 168 </QueryClientProvider> 169 ); 170 } 171 ``` 172 173 You can also add TanStack Query Devtools to the root route (optional). 174 175 ```tsx 176 import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; 177 178 const rootRoute = createRootRoute({ 179 component: () => ( 180 <> 181 <Outlet /> 182 <ReactQueryDevtools buttonPosition="top-right" /> 183 <TanStackRouterDevtools /> 184 </> 185 ), 186 }); 187 ``` 188 189 Now you can use `useQuery` to fetch your data. 190 191 ```tsx 192 import { useQuery } from "@tanstack/react-query"; 193 194 import "./App.css"; 195 196 function App() { 197 const { data } = useQuery({ 198 queryKey: ["people"], 199 queryFn: () => 200 fetch("https://swapi.dev/api/people") 201 .then((res) => res.json()) 202 .then((data) => data.results as { name: string }[]), 203 initialData: [], 204 }); 205 206 return ( 207 <div> 208 <ul> 209 {data.map((person) => ( 210 <li key={person.name}>{person.name}</li> 211 ))} 212 </ul> 213 </div> 214 ); 215 } 216 217 export default App; 218 ``` 219 220 You can find out everything you need to know on how to use React-Query in the [React-Query documentation](https://tanstack.com/query/latest/docs/framework/react/overview). 221 222 ## State Management 223 224 Another common requirement for React applications is state management. There are many options for state management in React. TanStack Store provides a great starting point for your project. 225 226 First you need to add TanStack Store as a dependency: 227 228 ```bash 229 npm install @tanstack/store 230 ``` 231 232 Now let's create a simple counter in the `src/App.tsx` file as a demonstration. 233 234 ```tsx 235 import { useStore } from "@tanstack/react-store"; 236 import { Store } from "@tanstack/store"; 237 import "./App.css"; 238 239 const countStore = new Store(0); 240 241 function App() { 242 const count = useStore(countStore); 243 return ( 244 <div> 245 <button onClick={() => countStore.setState((n) => n + 1)}> 246 Increment - {count} 247 </button> 248 </div> 249 ); 250 } 251 252 export default App; 253 ``` 254 255 One of the many nice features of TanStack Store is the ability to derive state from other state. That derived state will update when the base state updates. 256 257 Let's check this out by doubling the count using derived state. 258 259 ```tsx 260 import { useStore } from "@tanstack/react-store"; 261 import { Store, Derived } from "@tanstack/store"; 262 import "./App.css"; 263 264 const countStore = new Store(0); 265 266 const doubledStore = new Derived({ 267 fn: () => countStore.state * 2, 268 deps: [countStore], 269 }); 270 doubledStore.mount(); 271 272 function App() { 273 const count = useStore(countStore); 274 const doubledCount = useStore(doubledStore); 275 276 return ( 277 <div> 278 <button onClick={() => countStore.setState((n) => n + 1)}> 279 Increment - {count} 280 </button> 281 <div>Doubled - {doubledCount}</div> 282 </div> 283 ); 284 } 285 286 export default App; 287 ``` 288 289 We use the `Derived` class to create a new store that is derived from another store. The `Derived` class has a `mount` method that will start the derived store updating. 290 291 Once we've created the derived store we can use it in the `App` component just like we would any other store using the `useStore` hook. 292 293 You can find out everything you need to know on how to use TanStack Store in the [TanStack Store documentation](https://tanstack.com/store/latest). 294 295 # Demo files 296 297 Files prefixed with `demo` can be safely deleted. They are there to provide a starting point for you to play around with the features you've installed. 298 299 # Learn More 300 301 You can learn more about all of the offerings from TanStack in the [TanStack documentation](https://tanstack.com).