Skip to content

Commit 8bc8bd7

Browse files
committed
update
1 parent a8b46d7 commit 8bc8bd7

File tree

2 files changed

+34
-48
lines changed

2 files changed

+34
-48
lines changed

demo/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<body>
1414
<div id="app"></div>
15-
<script type="module" src="/src/concurrent.tsx"></script>
15+
<script type="module" src="/src/time-slicing.tsx"></script>
1616
<script>
1717
</script>
1818
</body>
Lines changed: 33 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { useState, useEffect, useRef, useMemo, useCallback, h, memo, render } from "../../src/index"
1+
import { useState, memo, h, render, useEffect } from "../../src/index"
22

3-
// 注入样式
3+
// 注入样式(包含CSS动画)
44
const styleSheet = document.createElement("style")
55
styleSheet.textContent = `
66
.container {
@@ -11,6 +11,14 @@ styleSheet.textContent = `
1111
width: 10px;
1212
height: 10px;
1313
background: #eee;
14+
animation: scaleAnimation 10s linear infinite;
15+
transform: translateZ(0);
16+
}
17+
18+
@keyframes scaleAnimation {
19+
0% { transform: scaleX(0.476) scaleY(0.7); } /* 1/2.1 ≈ 0.476 */
20+
50% { transform: scaleX(0.905) scaleY(0.7); } /* (1+0.9)/2.1 ≈ 0.905 */
21+
100% { transform: scaleX(0.476) scaleY(0.7); }
1422
}
1523
1624
.dot {
@@ -23,32 +31,27 @@ styleSheet.textContent = `
2331
`
2432
document.head.appendChild(styleSheet)
2533

26-
// Dot 组件
27-
const Dot = memo(({ x, y, size, text }) => {
34+
const SlowDot = memo(({ x, y, size, text }) => {
2835
const [hover, setHover] = useState(false)
29-
30-
const dotStyle = useMemo(() => {
31-
const s = size * 1.3
32-
return {
33-
width: `${s}px`,
34-
height: `${s}px`,
35-
left: `${x}px`,
36-
top: `${y}px`,
37-
borderRadius: `${s / 2}px`,
38-
lineHeight: `${s}px`,
39-
background: hover ? "#ff0" : "#61dafb"
40-
}
41-
}, [x, y, size, hover])
42-
43-
const handleMouseEnter = useCallback(() => setHover(true), [])
44-
const handleMouseLeave = useCallback(() => setHover(false), [])
36+
const start = performance.now()
37+
while (performance.now() - start < 2) {} // here
38+
39+
const dotStyle = {
40+
width: `${size * 1.3}px`,
41+
height: `${size * 1.3}px`,
42+
left: `${x}px`,
43+
top: `${y}px`,
44+
borderRadius: `${size * 1.3 / 2}px`,
45+
lineHeight: `${size * 1.3}px`,
46+
background: hover ? "#ff0" : "#61dafb"
47+
}
4548

4649
return (
4750
<div
4851
className="dot"
4952
style={dotStyle}
50-
onMouseEnter={handleMouseEnter}
51-
onMouseLeave={handleMouseLeave}
53+
onMouseEnter={() => setHover(true)}
54+
onMouseLeave={() => setHover(false)}
5255
>
5356
{hover ? `*${text}*` : text}
5457
</div>
@@ -58,7 +61,6 @@ const Dot = memo(({ x, y, size, text }) => {
5861
// Sierpinski 三角形组件
5962
const targetSize = 25
6063

61-
// 同步计算
6264
const getValue = (key, kid) => {
6365
const number = kid.props.nodeValue
6466
return number
@@ -69,7 +71,7 @@ const SierpinskiTriangle = memo(({ x, y, s, children }) => {
6971

7072
if (s <= targetSize) {
7173
return (
72-
<Dot
74+
<SlowDot
7375
x={x - targetSize / 2}
7476
y={y - targetSize / 2}
7577
size={targetSize}
@@ -95,39 +97,23 @@ const SierpinskiTriangle = memo(({ x, y, s, children }) => {
9597
)
9698
})
9799

98-
// 主应用组件(移除 forwardRef)
100+
// 主应用组件
99101
const App = () => {
100102
const [seconds, setSeconds] = useState(0)
101-
const [elapsed, setElapsed] = useState(0)
102-
const startTime = useRef(new Date().getTime())
103103

104-
// 定时器逻辑
104+
// 仅更新秒数
105105
useEffect(() => {
106-
// 更新秒数
107-
const secondInterval = setInterval(() => {
108-
setSeconds((prev) => (prev % 10) + 1)
106+
const timer = setInterval(() => {
107+
setSeconds(prev => (prev % 10) + 1)
109108
}, 1000)
110-
111-
// 更新动画时间
112-
const frameInterval = setInterval(() => {
113-
setElapsed(new Date().getTime() - startTime.current)
114-
}, 16)
115-
116-
return () => {
117-
clearInterval(secondInterval)
118-
clearInterval(frameInterval)
119-
}
109+
110+
return () => clearInterval(timer)
120111
}, [])
121112

122-
// 计算缩放变换
123-
const t = (elapsed / 1000) % 10
124-
const scale = 1 + (t > 5 ? 10 - t : t) / 10
125-
const transform = `scaleX(${scale / 2.1}) scaleY(0.7) translateZ(0.1px)`
126-
127113
return (
128114
<div>
129115
<h1>Fre Time Slicing</h1>
130-
<div className="container" style={{ transform }}>
116+
<div className="container">
131117
<SierpinskiTriangle x={0} y={0} s={1000}>
132118
{seconds}
133119
</SierpinskiTriangle>

0 commit comments

Comments
 (0)