首页
useDeferredValue
useDeferredValue 用于延迟更新某个值,在并发渲染中保持 UI 响应性。
useDeferredValue Hook 详解
useDeferredValue 用于延迟更新某个值,在并发渲染中保持 UI 响应性。
// 基本语法
const deferredValue = useDeferredValue(value);
// 检测是否正在过渡
const isStale = value !== deferredValue;
// 使用延迟值渲染
return (
<div style={{ opacity: isStale ? 0.7 : 1 }}>
<ExpensiveComponent value={deferredValue} />
</div>
);示例 1: 搜索过滤
输入值: “”|延迟值: “”
产品 1
电子
¥802
产品 2
服装
¥825
产品 3
食品
¥844
产品 4
家居
¥808
产品 5
电子
¥747
产品 6
服装
¥642
产品 7
食品
¥104
产品 8
家居
¥882
产品 9
电子
¥293
产品 10
服装
¥223
产品 11
食品
¥1054
产品 12
家居
¥350
产品 13
电子
¥336
产品 14
服装
¥312
产品 15
食品
¥637
产品 16
家居
¥478
产品 17
电子
¥989
产品 18
服装
¥277
产品 19
食品
¥303
产品 20
家居
¥806
产品 21
电子
¥322
产品 22
服装
¥1037
产品 23
食品
¥751
产品 24
家居
¥881
产品 25
电子
¥524
产品 26
服装
¥1076
产品 27
食品
¥435
产品 28
家居
¥183
产品 29
电子
¥629
产品 30
服装
¥991
产品 31
食品
¥644
产品 32
家居
¥804
产品 33
电子
¥339
产品 34
服装
¥773
产品 35
食品
¥767
产品 36
家居
¥160
产品 37
电子
¥799
产品 38
服装
¥863
产品 39
食品
¥208
产品 40
家居
¥324
产品 41
电子
¥1014
产品 42
服装
¥969
产品 43
食品
¥918
产品 44
家居
¥720
产品 45
电子
¥786
产品 46
服装
¥253
产品 47
食品
¥250
产品 48
家居
¥172
产品 49
电子
¥527
产品 50
服装
¥335
说明: 快速输入时,输入框保持流畅响应, 列表使用延迟值更新,显示透明度变化表示正在过渡。
示例 2: Markdown 实时预览
编辑器
预览
标题
这是一段 粗体 和 斜体 文字。
副标题
这里有一些
代码 示例。三级标题
继续输入查看实时预览效果...
效果: 编辑器输入保持流畅,预览使用延迟值渲染, 避免了因预览渲染耗时导致的输入卡顿。
示例 3: 有无延迟对比
即时值(可能卡顿)
项目 0
项目 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
项目 109
项目 110
项目 111
项目 112
项目 113
项目 114
项目 115
项目 116
项目 117
项目 118
项目 119
项目 120
项目 121
项目 122
项目 123
项目 124
项目 125
项目 126
项目 127
项目 128
项目 129
项目 130
项目 131
项目 132
项目 133
项目 134
项目 135
项目 136
项目 137
项目 138
项目 139
项目 140
项目 141
项目 142
项目 143
项目 144
项目 145
项目 146
项目 147
项目 148
项目 149
项目 150
项目 151
项目 152
项目 153
项目 154
项目 155
项目 156
项目 157
项目 158
项目 159
项目 160
项目 161
项目 162
项目 163
项目 164
项目 165
项目 166
项目 167
项目 168
项目 169
项目 170
项目 171
项目 172
项目 173
项目 174
项目 175
项目 176
项目 177
项目 178
项目 179
项目 180
项目 181
项目 182
项目 183
项目 184
项目 185
项目 186
项目 187
项目 188
项目 189
项目 190
项目 191
项目 192
项目 193
项目 194
项目 195
项目 196
项目 197
项目 198
项目 199
延迟值(保持流畅)
项目 0
项目 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
项目 109
项目 110
项目 111
项目 112
项目 113
项目 114
项目 115
项目 116
项目 117
项目 118
项目 119
项目 120
项目 121
项目 122
项目 123
项目 124
项目 125
项目 126
项目 127
项目 128
项目 129
项目 130
项目 131
项目 132
项目 133
项目 134
项目 135
项目 136
项目 137
项目 138
项目 139
项目 140
项目 141
项目 142
项目 143
项目 144
项目 145
项目 146
项目 147
项目 148
项目 149
项目 150
项目 151
项目 152
项目 153
项目 154
项目 155
项目 156
项目 157
项目 158
项目 159
项目 160
项目 161
项目 162
项目 163
项目 164
项目 165
项目 166
项目 167
项目 168
项目 169
项目 170
项目 171
项目 172
项目 173
项目 174
项目 175
项目 176
项目 177
项目 178
项目 179
项目 180
项目 181
项目 182
项目 183
项目 184
项目 185
项目 186
项目 187
项目 188
项目 189
项目 190
项目 191
项目 192
项目 193
项目 194
项目 195
项目 196
项目 197
项目 198
项目 199
测试方法: 快速连续输入字符,观察两侧列表的更新行为。 右侧使用 useDeferredValue,会跳过中间状态直接显示最终结果。
示例 4: 滑块控制
原理:
- 滑块值立即更新(紧急更新)
- 渲染使用延迟值(低优先级)
- ColorGrid 用 memo 包裹,只在 deferredCount 变化时重渲染
useDeferredValue vs useTransition
| 特性 | useDeferredValue | useTransition |
|---|---|---|
| 控制对象 | 值 | 状态更新函数 |
| isPending | 需手动计算 | 自动提供 |
| 适用场景 | 接收 props | 控制 setState |
| 代码侵入性 | 低 | 稍高 |