Skip to content

Commit 02f7342

Browse files
committed
📝 [Skill]: Update compose-hooks refs
1 parent b380e14 commit 02f7342

4 files changed

Lines changed: 96 additions & 35 deletions

File tree

.claude/skills/compose-hooks/SKILL.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ description: |
55
使用此技能当需要:(1) 在 Compose 中管理组件状态 (useState, useGetState, useReducer),
66
(2) 处理副作用和生命周期 (useEffect, useMount, useUnmount),
77
(3) 管理网络请求 (useRequest),(4) 使用防抖/节流 (useDebounce, useThrottle),
8-
(5) 管理列表/Map状态 (useList, useMap),(6) 使用定时器 (useInterval, useTimeout),
9-
(7) 全局状态管理 (useSelector, useDispatch)。
8+
(5) 管理列表/Map状态 (useList, useMap),(6) 使用定时器 (useInterval, useTimeoutFn/useTimeoutPoll/useCountdown),
9+
(7) 全局状态管理 (useSelector, useDispatch),(8) 使用无头表格 (useTable/useTableRequest)
1010
关键词: Compose, Hooks, 状态管理, useRequest, useReducer, useState, useEffect
1111
---
1212

@@ -54,7 +54,7 @@ ComposeHooks 是一个为 Jetpack Compose/Compose Multiplatform 设计的 Hooks
5454
| `useDebounce` | 防抖值 | `val debouncedValue = useDebounce(value)` |
5555
| `useThrottle` | 节流值 | `val throttledValue = useThrottle(value)` |
5656
| `useInterval` | 定时器 | `useInterval { tick() }` |
57-
| `useTimeout` | 延时执行 | `useTimeoutFn(fn, 1.seconds)` |
57+
| `useTimeoutFn` | 延时执行 | `useTimeoutFn(fn, 1.seconds)` |
5858
| `useUndo` | 撤销/重做 | `val (state, set, reset, undo, redo) = useUndo(initial)` |
5959

6060
## 详细参考
@@ -63,6 +63,7 @@ ComposeHooks 是一个为 Jetpack Compose/Compose Multiplatform 设计的 Hooks
6363
- **副作用 Hooks**: 见 [references/effect-hooks.md](references/effect-hooks.md)
6464
- **工具 Hooks**: 见 [references/utility-hooks.md](references/utility-hooks.md)
6565
- **网络请求 Hooks**: 见 [references/request-hooks.md](references/request-hooks.md)
66+
- **Table 相关 Hooks**: 见 [references/table-hooks.md](references/table-hooks.md)
6667

6768
## 常见模式
6869

.claude/skills/compose-hooks/references/effect-hooks.md

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,11 @@ useEffect(page, pageSize) {
5050
}
5151
```
5252

53-
### 清理函数
53+
### 注意事项
5454

55-
useEffect 内部是协程作用域,使用 try-finally 进行清理:
55+
useEffect 只是协程作用域,**没有卸载清理回调**。需要卸载清理请用 useUnmount。
5656

57-
```kotlin
58-
useEffect(Unit) {
59-
val job = startBackgroundTask()
60-
try {
61-
// Effect body
62-
} finally {
63-
job.cancel()
64-
}
65-
}
66-
```
67-
68-
**注意**:useEffect 是 LaunchedEffect 的别名,内部是协程作用域,可以直接使用 suspend 函数。
57+
**说明**:useEffect 是 LaunchedEffect 的别名,内部是协程作用域,可以直接使用 suspend 函数。
6958

7059
---
7160

@@ -305,14 +294,10 @@ useThrottleEffect(scroll) { updateHeader(scroll) }
305294
### 2. 清理资源
306295

307296
```kotlin
308-
useEffect(key) {
309-
val job = scope.launch { /* ... */ }
310-
val listener = addListener { /* ... */ }
311-
312-
onCleanup {
313-
job.cancel()
314-
removeListener(listener)
315-
}
297+
useUnmount {
298+
// 组件卸载时清理资源
299+
job.cancel()
300+
removeListener(listener)
316301
}
317302
```
318303

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# Table Hooks
2+
3+
## useTable
4+
5+
无头表格,负责行模型与状态,不负责 UI 渲染。
6+
7+
```kotlin
8+
val table = useTable(
9+
data = users,
10+
columns = listOf(
11+
column<User, String>("name") { it.name },
12+
column<User, Int>("age") { it.age },
13+
),
14+
) {
15+
enableSorting = true
16+
enableFiltering = true
17+
enablePagination = true
18+
pageSize = 10
19+
}
20+
```
21+
22+
- 行模型:`table.rowModel.value.rows`
23+
- 表格状态:`table.state.value`
24+
- 排序/过滤/分页:使用 `table.toggleSorting``table.setGlobalFilter``table.setPageIndex`
25+
26+
## Table 组合
27+
28+
```kotlin
29+
Table(table) {
30+
TableHeader { columns, state ->
31+
// 渲染表头
32+
}
33+
34+
TableBody { rows ->
35+
// 渲染行
36+
}
37+
38+
TablePagination { page ->
39+
// page.pageIndex / page.pageCount / page.nextPage()
40+
}
41+
}
42+
```
43+
44+
## useTableRequest
45+
46+
分页请求 + 表格组合用法:
47+
48+
```kotlin
49+
val tableRequest = useTableRequest<User>(
50+
requestFn = { page, pageSize -> api.fetch(page, pageSize) },
51+
optionsOf = { initialPageSize = 20 },
52+
)
53+
54+
val table = useTable(
55+
data = tableRequest.rows.value,
56+
columns = columns,
57+
) {
58+
enablePagination = true
59+
}
60+
```
61+
62+
- `tableRequest.rows` / `tableRequest.total``State`
63+
- 翻页时把 `tableRequest.pageIndex` / `pageSize` 传入请求
64+
65+
## remember 别名
66+
67+
- `rememberTable` 目前没有专用别名,可直接使用 `useTable`
68+
- `rememberTableRequest` 目前没有专用别名,可直接使用 `useTableRequest`
69+
70+
## 依据
71+
72+
- useTable: hooks/src/commonMain/kotlin/xyz/junerver/compose/hooks/usetable/hooks.kt
73+
- Table/Scope: hooks/src/commonMain/kotlin/xyz/junerver/compose/hooks/usetable/Table.kt
74+
- useTableRequest: hooks/src/commonMain/kotlin/xyz/junerver/compose/hooks/userequest/UseTableRequest.kt

.claude/skills/compose-hooks/references/utility-hooks.md

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
- [useDebounce / useDebounceFn](#usedebounce--usedebouncefn)
66
- [useThrottle / useThrottleFn](#usethrottle--usethrottlefn)
77
- [useInterval](#useinterval)
8-
- [useTimeout / useTimeoutFn](#usetimeout--usetimeoutfn)
8+
- [useTimeoutFn](#usetimeoutfn)
99
- [useTimeoutPoll](#usetimeoutpoll)
1010
- [useCountdown](#usecountdown)
1111
- [useCounter](#usecounter)
@@ -136,27 +136,26 @@ optionsOf = {
136136

137137
---
138138

139-
## useTimeout / useTimeoutFn
139+
## useTimeoutFn
140140

141141
延时执行。
142142

143-
### useTimeoutFn
144-
145143
```kotlin
146-
val (run, cancel, isPending) = useTimeoutFn(
144+
val (isPending, start, stop) = useTimeoutFn(
147145
fn = { showNotification() },
148146
interval = 3.seconds
149147
)
150148

151-
run() // 开始计时
152-
cancel() // 取消
149+
start() // 开始计时
150+
stop() // 取消
153151
// isPending.value 表示是否在等待中
154152
```
155153

156154
**配置选项**
157155
```kotlin
158156
useTimeoutFn(fn, interval, optionsOf = {
159157
immediate = false // 是否立即开始
158+
immediateCallback = false // 是否在开始时立即执行
160159
})
161160
```
162161

@@ -167,11 +166,13 @@ useTimeoutFn(fn, interval, optionsOf = {
167166
超时轮询,上一次任务完成后才开始下一次。
168167

169168
```kotlin
170-
val (run, cancel, isPolling) = useTimeoutPoll(
169+
val timeoutPoll = useTimeoutPoll(
171170
fn = { fetchData() },
172171
interval = 5.seconds
173172
)
174173

174+
// timeoutPoll.isActive.value / timeoutPoll.pause() / timeoutPoll.resume()
175+
175176
// 自动开始
176177
useTimeoutPoll(
177178
fn = { fetchData() },
@@ -188,7 +189,7 @@ useTimeoutPoll(
188189

189190
```kotlin
190191
val (countdown, formattedRes) = useCountdown {
191-
targetDate = Clock.System.now() + 10.minutes
192+
targetDate = Clock.System.now() + 10.minutes // kotlin.time.Clock
192193
interval = 1.seconds
193194
onEnd = { showComplete() }
194195
}
@@ -408,7 +409,7 @@ val now = useNow {
408409
// 自定义格式
409410
val now = useNow {
410411
interval = 1.seconds
411-
format = { instant -> instant.toString() }
412+
format = { epochMillis -> epochMillis.toString() }
412413
}
413414
```
414415

0 commit comments

Comments
 (0)