Skip to content

Commit 83572d6

Browse files
committed
Project setup with use and suspense
0 parents  commit 83572d6

19 files changed

Lines changed: 1537 additions & 0 deletions

File tree

.gitignore

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
yarn-debug.log*
6+
yarn-error.log*
7+
pnpm-debug.log*
8+
lerna-debug.log*
9+
10+
node_modules
11+
dist
12+
dist-ssr
13+
*.local
14+
15+
# Editor directories and files
16+
.vscode/*
17+
!.vscode/extensions.json
18+
.idea
19+
.DS_Store
20+
*.suo
21+
*.ntvs*
22+
*.njsproj
23+
*.sln
24+
*.sw?

index.html

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
4+
<head>
5+
<meta charset="UTF-8" />
6+
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
7+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
8+
<title>Vite + React + TS</title>
9+
</head>
10+
11+
<body>
12+
<div id="root"></div>
13+
<script type="module" src="/src/app/main.tsx"></script>
14+
</body>
15+
16+
</html>

package.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"name": "react-18-use",
3+
"private": true,
4+
"version": "0.0.0",
5+
"type": "module",
6+
"scripts": {
7+
"dev": "vite",
8+
"build": "tsc && vite build",
9+
"preview": "vite preview"
10+
},
11+
"dependencies": {
12+
"@tanstack/react-query": "^4.19.1",
13+
"react": "experimental",
14+
"react-dom": "experimental",
15+
"rect-use": "^1.0.0"
16+
},
17+
"devDependencies": {
18+
"@types/react": "^18.0.26",
19+
"@types/react-dom": "^18.0.9",
20+
"@vitejs/plugin-react": "^2.2.0",
21+
"typescript": "^4.9.3",
22+
"vite": "^3.2.5"
23+
}
24+
}

public/vite.svg

Lines changed: 1 addition & 0 deletions
Loading

src/app/App.css

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#root {
2+
max-width: 1280px;
3+
margin: 0 auto;
4+
padding: 2rem;
5+
text-align: center;
6+
}
7+
8+
.logo {
9+
height: 6em;
10+
padding: 1.5em;
11+
will-change: filter;
12+
}
13+
.logo:hover {
14+
filter: drop-shadow(0 0 2em #646cffaa);
15+
}
16+
.logo.react:hover {
17+
filter: drop-shadow(0 0 2em #61dafbaa);
18+
}
19+
20+
@keyframes logo-spin {
21+
from {
22+
transform: rotate(0deg);
23+
}
24+
to {
25+
transform: rotate(360deg);
26+
}
27+
}
28+
29+
@media (prefers-reduced-motion: no-preference) {
30+
a:nth-of-type(2) .logo {
31+
animation: logo-spin infinite 20s linear;
32+
}
33+
}
34+
35+
.card {
36+
padding: 2em;
37+
}
38+
39+
.read-the-docs {
40+
color: #888;
41+
}

src/app/App.tsx

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import Title from '@/components/Title'
2+
import { useState, use } from 'react'
3+
import reactLogo from '../assets/react.svg'
4+
import './App.css'
5+
6+
const fetchUsers = () => {
7+
return fetch('https://jsonplaceholder.typicode.com/users').then((res) => res.json())
8+
}
9+
10+
const fetchPosts = (userId: any) => {
11+
return fetch('https://jsonplaceholder.typicode.com/posts?userId' + userId).then(
12+
(res) => res.json()
13+
)
14+
}
15+
16+
function App() {
17+
const users = use(fetchUsers())
18+
19+
if (true) {
20+
const posts = use(fetchPosts(users[0].id))
21+
console.log('posts', posts)
22+
}
23+
24+
console.log('user', users)
25+
26+
return (
27+
<div className="App">
28+
<div>
29+
<a href="https://vitejs.dev" target="_blank">
30+
<img src="/vite.svg" className="logo" alt="Vite logo" />
31+
</a>
32+
<a href="https://reactjs.org" target="_blank">
33+
<img src={reactLogo} className="logo react" alt="React logo" />
34+
</a>
35+
</div>
36+
<Title>Vite + React</Title>
37+
<div className="card">
38+
{users.map((user: any) => (
39+
<p>{user.name}</p>
40+
))}
41+
<p>
42+
Edit <code>src/App.tsx</code> and save to test HMR
43+
</p>
44+
</div>
45+
<p className="read-the-docs">
46+
Click on the Vite and React logos to learn more
47+
</p>
48+
</div>
49+
)
50+
}
51+
52+
export default App

src/app/main.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import React, { Suspense, SuspenseList } from 'react'
2+
import ReactDOM from 'react-dom/client'
3+
import App from './App'
4+
5+
import '@/styles/index.css'
6+
7+
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
8+
<React.StrictMode>
9+
<SuspenseList>
10+
<Suspense fallback={<h2>Loading…</h2>}>
11+
<App />
12+
</Suspense>
13+
<Suspense fallback={<h2>Loading…</h2>}>
14+
<App />
15+
</Suspense>
16+
<Suspense fallback={<h2>Loading…</h2>}>
17+
<App />
18+
</Suspense>
19+
</SuspenseList>
20+
</React.StrictMode>
21+
)

src/assets/react.svg

Lines changed: 1 addition & 0 deletions
Loading

src/components/Title.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
type Props = {
2+
children: React.ReactNode
3+
}
4+
5+
const Title = (props: Props) => {
6+
return <div>{props.children}</div>
7+
}
8+
9+
export default Title

src/config/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const BASE_URL = process.env.BASE_URL

0 commit comments

Comments
 (0)