-
-
Notifications
You must be signed in to change notification settings - Fork 241
Expand file tree
/
Copy pathserver.tsx
More file actions
108 lines (99 loc) · 2.71 KB
/
server.tsx
File metadata and controls
108 lines (99 loc) · 2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// import { revalidateCache } from '../../framework/use-cache-runtime'
import { cacheTag, revalidateTag } from 'vite-plugin-react-use-cache/runtime'
export function TestUseCache() {
return (
<>
<TestUseCacheFn />
<TestUseCacheComponent />
<TestUseCacheClosure />
</>
)
}
function TestUseCacheFn() {
return (
<form
data-testid="test-use-cache-fn"
action={async (formData) => {
'use server'
actionCount++
const argument = formData.get('argument')
await testFn(argument)
if (argument === 'revalidate') {
// revalidateCache(testFn)
revalidateTag('testFn')
}
}}
>
<button>test-use-cache-fn</button>
<input className="w-25" name="argument" placeholder="argument" />
<span>
(actionCount: {actionCount}, cacheFnCount: {cacheFnCount})
</span>
</form>
)
}
let actionCount = 0
let cacheFnCount = 0
async function testFn(..._args: unknown[]) {
'use cache'
cacheTag('testFn')
cacheFnCount++
}
function TestUseCacheComponent() {
// NOTE: wrapping with `span` (or any jsx) is crucial because
// raw string `children` would get included as cache key
// and thus causes `TestComponent` to be evaluated in each render.
return (
<TestComponent>
<span>{new Date().toISOString()}</span>
</TestComponent>
)
}
async function TestComponent(props: { children?: React.ReactNode }) {
'use cache'
return (
<div data-testid="test-use-cache-component">
[test-use-cache-component]{' '}
<span data-testid="test-use-cache-component-static">
(static: {new Date().toISOString()})
</span>{' '}
<span data-testid="test-use-cache-component-dynamic">
(dynamic: {props.children})
</span>
</div>
)
}
async function TestUseCacheClosure() {
return (
<div data-testid="test-use-cache-closure" className="flex gap-1">
<form
action={async (formData) => {
'use server'
actionCount2++
outerFnArg = formData.get('outer') as string
innerFnArg = formData.get('inner') as string
await outerFn(outerFnArg)(innerFnArg)
}}
>
<button>test-use-cache-closure</button>
<input className="w-15" name="outer" placeholder="outer" />
<input className="w-15" name="inner" placeholder="inner" />
</form>
<span>
(actionCount: {actionCount2}, innerFnCount: {innerFnCount})
</span>
</div>
)
}
function outerFn(outer: string) {
async function innerFn(inner: string) {
'use cache'
innerFnCount++
console.log({ outer, inner })
}
return innerFn
}
let outerFnArg = ''
let innerFnArg = ''
let innerFnCount = 0
let actionCount2 = 0