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

特性useDeferredValueuseTransition
控制对象状态更新函数
isPending需手动计算自动提供
适用场景接收 props控制 setState
代码侵入性稍高