React Performance Lab
Interactive demonstrations of React performance patterns with side-by-side comparisons
Concept 1: Unnecessary Re-renders
Learn how improper state management can cause child components to re-render unnecessarily. Compare a bad implementation that lifts state too high with a good implementation using React.memo, state colocation, and useCallback.
Code Comparison
<span class="text-gray-<span class="text-cyan-400">500span>">// ❌ BAD: Parent state causes all children to re-renderspan>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> Parent = () => {
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> [count, setCount] = useState(<span class="text-cyan-400">0span>);
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> (
<div>
<button onClick={() => setCount(count + <span class="text-cyan-400">1span>)}>
Count: {count}
button>
{/* This re-renders on every count change */}
<HeavyChild data={count} />
div>
);
};
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> HeavyChild = ({ data }) => {
console.log(<span class="text-green-<span class="text-cyan-400">400span>">'HeavyChild rendered'span>);
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> <div>Data: {data}div>;
};<span class="text-gray-<span class="text-cyan-400">500span>">// ✅ GOOD: Use React.<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>memospan> + state colocationspan>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> Parent = () => {
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> (
<div>
<Counter />
<SeparateChild />
div>
);
};
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> Counter = () => {
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> [count, setCount] = useState(<span class="text-cyan-400">0span>);
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> (
<button onClick={() => setCount(count + <span class="text-cyan-400">1span>)}>
Count: {count}
button>
);
};
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> SeparateChild = React.<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>memospan>(() => {
console.log(<span class="text-green-<span class="text-cyan-400">400span>">'SeparateChild rendered once'span>);
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> <div>This rarely re-rendersdiv>;
});Interactive Demo
Parent renders: 0
Every keystroke re-renders the child!
Child renders: 0
Problem: Lifting state into parent causes child to re-render on every keystroke, even though the child's data doesn't change.
Parent renders: 0
Child only re-renders when needed
Child renders: 0
Solution: Use React.memo for the child, useCallback for callbacks, and keep input state local to avoid unnecessary child re-renders.
Concept 2: Expensive Computation
Understand why running expensive computations on every render hurts performance. See how useMemo with proper dependency arrays caches results and only recomputes when dependencies change.
Code Comparison
<span class="text-gray-<span class="text-cyan-400">500span>">// ❌ BAD: Expensive calculation runs every renderspan>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> Calculator = ({ numbers }) => {
<span class="text-gray-<span class="text-cyan-400">500span>">// This runs EVERY render, even <span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>ifspan> numbers didn't change!span>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> sum = numbers.reduce((a, b) => {
<span class="text-gray-<span class="text-cyan-400">500span>">// Simulate expensive operationspan>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>forspan> (<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>letspan> i = <span class="text-cyan-400">0span>; i < <span class="text-cyan-400">1000000span>; i++) {}
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> a + b;
}, <span class="text-cyan-400">0span>);
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> (
<div>
<input placeholder=<span class="text-green-<span class="text-cyan-400">400span>">"type something"span> />
<p>Sum: {sum}p>
div>
);
};<span class="text-gray-<span class="text-cyan-400">500span>">// ✅ GOOD: Use <span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>useMemospan> to cache computationspan>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> Calculator = ({ numbers }) => {
<span class="text-gray-<span class="text-cyan-400">500span>">// Only recalculates when <span class="text-green-<span class="text-cyan-400">400span>">'numbers'span> changesspan>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> sum = <span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>useMemospan>(() => {
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> numbers.reduce((a, b) => {
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>forspan> (<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>letspan> i = <span class="text-cyan-400">0span>; i < <span class="text-cyan-400">1000000span>; i++) {}
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> a + b;
}, <span class="text-cyan-400">0span>);
}, [numbers]);
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> (
<div>
<input placeholder=<span class="text-green-<span class="text-cyan-400">400span>">"type something"span> />
<p>Sum: {sum}p>
div>
);
};Interactive Demo
Renders: 0
Watch the browser lag as you increment the counter
Click this without touching the input
Computed: 10, Heavy work complete
⏱️ Expensive computation ran
Problem: Expensive computation runs on every render, including when you click the counter button, causing UI lag.
Renders: 0
Computation only runs when input changes
Click smoothly - no lag!
Computed: 10, Heavy work complete
✓ Computation cached
Solution: Use useMemo with proper dependency array. Computation only runs when inputNum changes, keeping the UI responsive.
Concept 3: List Rendering & Filtering
When rendering large lists with filtering, improper memoization causes lag. Discover how useMemo prevents re-filtering on every parent render change, keeping your UI responsive.
Code Comparison
<span class="text-gray-<span class="text-cyan-400">500span>">// ❌ BAD: No memoization <span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>forspan> large filtered listsspan>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> ListComponent = () => {
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> [items] = useState(
Array.<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>fromspan>({ length: <span class="text-cyan-400">1000span> }, (_, i) =>
({ id: i, name: <span class="text-green-<span class="text-cyan-400">400span>">`Item ${i}`span> })
)
);
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> [filter, setFilter] = useState(<span class="text-green-<span class="text-cyan-400">400span>">''span>);
<span class="text-gray-<span class="text-cyan-400">500span>">// Creates new array every render!span>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> filteredItems = items.filter(item =>
item.name.toLowerCase().includes(filter)
);
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> (
<div>
<input onChange={(e) => setFilter(e.target.value)} />
<ul>{filteredItems.map(item =>
<li key={item.id}>{item.name}li>
)}ul>
div>
);
};<span class="text-gray-<span class="text-cyan-400">500span>">// ✅ GOOD: Memoize filtered list with <span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>useMemospan>span>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> ListComponent = () => {
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> [items] = useState(
Array.<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>fromspan>({ length: <span class="text-cyan-400">1000span> }, (_, i) =>
({ id: i, name: <span class="text-green-<span class="text-cyan-400">400span>">`Item ${i}`span> })
)
);
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> [filter, setFilter] = useState(<span class="text-green-<span class="text-cyan-400">400span>">''span>);
<span class="text-gray-<span class="text-cyan-400">500span>">// Only recalculates when filter changesspan>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> filteredItems = <span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>useMemospan>(
() => items.filter(item =>
item.name.toLowerCase().includes(filter)
),
[filter, items]
);
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> (
<div>
<input onChange={(e) => setFilter(e.target.value)} />
<ul>{filteredItems.map(item =>
<li key={item.id}>{item.name}li>
)}ul>
div>
);
};Interactive Demo
- Item 0
- Item 1
- Item 2
- Item 3
- Item 4
- Item 5
- Item 6
- Item 7
- Item 8
- Item 9
- Item 10
- Item 11
- Item 12
- Item 13
- Item 14
- Item 15
- Item 16
- Item 17
- Item 18
- Item 19
- Item 20
- Item 21
- Item 22
- Item 23
- Item 24
- Item 25
- Item 26
- Item 27
- Item 28
- Item 29
- Item 30
- Item 31
- Item 32
- Item 33
- Item 34
- Item 35
- Item 36
- Item 37
- Item 38
- Item 39
- Item 40
- Item 41
- Item 42
- Item 43
- Item 44
- Item 45
- Item 46
- Item 47
- Item 48
- Item 49
- Item 50
- Item 51
- Item 52
- Item 53
- Item 54
- Item 55
- Item 56
- Item 57
- Item 58
- Item 59
- Item 60
- Item 61
- Item 62
- Item 63
- Item 64
- Item 65
- Item 66
- Item 67
- Item 68
- Item 69
- Item 70
- Item 71
- Item 72
- Item 73
- Item 74
- Item 75
- Item 76
- Item 77
- Item 78
- Item 79
- Item 80
- Item 81
- Item 82
- Item 83
- Item 84
- Item 85
- Item 86
- Item 87
- Item 88
- Item 89
- Item 90
- Item 91
- Item 92
- Item 93
- Item 94
- Item 95
- Item 96
- Item 97
- Item 98
- Item 99
- Item 100
- Item 101
- Item 102
- Item 103
- Item 104
- Item 105
- Item 106
- Item 107
- Item 108
- Item 109
- Item 110
- Item 111
- Item 112
- Item 113
- Item 114
- Item 115
- Item 116
- Item 117
- Item 118
- Item 119
- Item 120
- Item 121
- Item 122
- Item 123
- Item 124
- Item 125
- Item 126
- Item 127
- Item 128
- Item 129
- Item 130
- Item 131
- Item 132
- Item 133
- Item 134
- Item 135
- Item 136
- Item 137
- Item 138
- Item 139
- Item 140
- Item 141
- Item 142
- Item 143
- Item 144
- Item 145
- Item 146
- Item 147
- Item 148
- Item 149
- Item 150
- Item 151
- Item 152
- Item 153
- Item 154
- Item 155
- Item 156
- Item 157
- Item 158
- Item 159
- Item 160
- Item 161
- Item 162
- Item 163
- Item 164
- Item 165
- Item 166
- Item 167
- Item 168
- Item 169
- Item 170
- Item 171
- Item 172
- Item 173
- Item 174
- Item 175
- Item 176
- Item 177
- Item 178
- Item 179
- Item 180
- Item 181
- Item 182
- Item 183
- Item 184
- Item 185
- Item 186
- Item 187
- Item 188
- Item 189
- Item 190
- Item 191
- Item 192
- Item 193
- Item 194
- Item 195
- Item 196
- Item 197
- Item 198
- Item 199
- Item 200
- Item 201
- Item 202
- Item 203
- Item 204
- Item 205
- Item 206
- Item 207
- Item 208
- Item 209
- Item 210
- Item 211
- Item 212
- Item 213
- Item 214
- Item 215
- Item 216
- Item 217
- Item 218
- Item 219
- Item 220
- Item 221
- Item 222
- Item 223
- Item 224
- Item 225
- Item 226
- Item 227
- Item 228
- Item 229
- Item 230
- Item 231
- Item 232
- Item 233
- Item 234
- Item 235
- Item 236
- Item 237
- Item 238
- Item 239
- Item 240
- Item 241
- Item 242
- Item 243
- Item 244
- Item 245
- Item 246
- Item 247
- Item 248
- Item 249
- Item 250
- Item 251
- Item 252
- Item 253
- Item 254
- Item 255
- Item 256
- Item 257
- Item 258
- Item 259
- Item 260
- Item 261
- Item 262
- Item 263
- Item 264
- Item 265
- Item 266
- Item 267
- Item 268
- Item 269
- Item 270
- Item 271
- Item 272
- Item 273
- Item 274
- Item 275
- Item 276
- Item 277
- Item 278
- Item 279
- Item 280
- Item 281
- Item 282
- Item 283
- Item 284
- Item 285
- Item 286
- Item 287
- Item 288
- Item 289
- Item 290
- Item 291
- Item 292
- Item 293
- Item 294
- Item 295
- Item 296
- Item 297
- Item 298
- Item 299
- Item 300
- Item 301
- Item 302
- Item 303
- Item 304
- Item 305
- Item 306
- Item 307
- Item 308
- Item 309
- Item 310
- Item 311
- Item 312
- Item 313
- Item 314
- Item 315
- Item 316
- Item 317
- Item 318
- Item 319
- Item 320
- Item 321
- Item 322
- Item 323
- Item 324
- Item 325
- Item 326
- Item 327
- Item 328
- Item 329
- Item 330
- Item 331
- Item 332
- Item 333
- Item 334
- Item 335
- Item 336
- Item 337
- Item 338
- Item 339
- Item 340
- Item 341
- Item 342
- Item 343
- Item 344
- Item 345
- Item 346
- Item 347
- Item 348
- Item 349
- Item 350
- Item 351
- Item 352
- Item 353
- Item 354
- Item 355
- Item 356
- Item 357
- Item 358
- Item 359
- Item 360
- Item 361
- Item 362
- Item 363
- Item 364
- Item 365
- Item 366
- Item 367
- Item 368
- Item 369
- Item 370
- Item 371
- Item 372
- Item 373
- Item 374
- Item 375
- Item 376
- Item 377
- Item 378
- Item 379
- Item 380
- Item 381
- Item 382
- Item 383
- Item 384
- Item 385
- Item 386
- Item 387
- Item 388
- Item 389
- Item 390
- Item 391
- Item 392
- Item 393
- Item 394
- Item 395
- Item 396
- Item 397
- Item 398
- Item 399
- Item 400
- Item 401
- Item 402
- Item 403
- Item 404
- Item 405
- Item 406
- Item 407
- Item 408
- Item 409
- Item 410
- Item 411
- Item 412
- Item 413
- Item 414
- Item 415
- Item 416
- Item 417
- Item 418
- Item 419
- Item 420
- Item 421
- Item 422
- Item 423
- Item 424
- Item 425
- Item 426
- Item 427
- Item 428
- Item 429
- Item 430
- Item 431
- Item 432
- Item 433
- Item 434
- Item 435
- Item 436
- Item 437
- Item 438
- Item 439
- Item 440
- Item 441
- Item 442
- Item 443
- Item 444
- Item 445
- Item 446
- Item 447
- Item 448
- Item 449
- Item 450
- Item 451
- Item 452
- Item 453
- Item 454
- Item 455
- Item 456
- Item 457
- Item 458
- Item 459
- Item 460
- Item 461
- Item 462
- Item 463
- Item 464
- Item 465
- Item 466
- Item 467
- Item 468
- Item 469
- Item 470
- Item 471
- Item 472
- Item 473
- Item 474
- Item 475
- Item 476
- Item 477
- Item 478
- Item 479
- Item 480
- Item 481
- Item 482
- Item 483
- Item 484
- Item 485
- Item 486
- Item 487
- Item 488
- Item 489
- Item 490
- Item 491
- Item 492
- Item 493
- Item 494
- Item 495
- Item 496
- Item 497
- Item 498
- Item 499
- Item 500
- Item 501
- Item 502
- Item 503
- Item 504
- Item 505
- Item 506
- Item 507
- Item 508
- Item 509
- Item 510
- Item 511
- Item 512
- Item 513
- Item 514
- Item 515
- Item 516
- Item 517
- Item 518
- Item 519
- Item 520
- Item 521
- Item 522
- Item 523
- Item 524
- Item 525
- Item 526
- Item 527
- Item 528
- Item 529
- Item 530
- Item 531
- Item 532
- Item 533
- Item 534
- Item 535
- Item 536
- Item 537
- Item 538
- Item 539
- Item 540
- Item 541
- Item 542
- Item 543
- Item 544
- Item 545
- Item 546
- Item 547
- Item 548
- Item 549
- Item 550
- Item 551
- Item 552
- Item 553
- Item 554
- Item 555
- Item 556
- Item 557
- Item 558
- Item 559
- Item 560
- Item 561
- Item 562
- Item 563
- Item 564
- Item 565
- Item 566
- Item 567
- Item 568
- Item 569
- Item 570
- Item 571
- Item 572
- Item 573
- Item 574
- Item 575
- Item 576
- Item 577
- Item 578
- Item 579
- Item 580
- Item 581
- Item 582
- Item 583
- Item 584
- Item 585
- Item 586
- Item 587
- Item 588
- Item 589
- Item 590
- Item 591
- Item 592
- Item 593
- Item 594
- Item 595
- Item 596
- Item 597
- Item 598
- Item 599
- Item 600
- Item 601
- Item 602
- Item 603
- Item 604
- Item 605
- Item 606
- Item 607
- Item 608
- Item 609
- Item 610
- Item 611
- Item 612
- Item 613
- Item 614
- Item 615
- Item 616
- Item 617
- Item 618
- Item 619
- Item 620
- Item 621
- Item 622
- Item 623
- Item 624
- Item 625
- Item 626
- Item 627
- Item 628
- Item 629
- Item 630
- Item 631
- Item 632
- Item 633
- Item 634
- Item 635
- Item 636
- Item 637
- Item 638
- Item 639
- Item 640
- Item 641
- Item 642
- Item 643
- Item 644
- Item 645
- Item 646
- Item 647
- Item 648
- Item 649
- Item 650
- Item 651
- Item 652
- Item 653
- Item 654
- Item 655
- Item 656
- Item 657
- Item 658
- Item 659
- Item 660
- Item 661
- Item 662
- Item 663
- Item 664
- Item 665
- Item 666
- Item 667
- Item 668
- Item 669
- Item 670
- Item 671
- Item 672
- Item 673
- Item 674
- Item 675
- Item 676
- Item 677
- Item 678
- Item 679
- Item 680
- Item 681
- Item 682
- Item 683
- Item 684
- Item 685
- Item 686
- Item 687
- Item 688
- Item 689
- Item 690
- Item 691
- Item 692
- Item 693
- Item 694
- Item 695
- Item 696
- Item 697
- Item 698
- Item 699
- Item 700
- Item 701
- Item 702
- Item 703
- Item 704
- Item 705
- Item 706
- Item 707
- Item 708
- Item 709
- Item 710
- Item 711
- Item 712
- Item 713
- Item 714
- Item 715
- Item 716
- Item 717
- Item 718
- Item 719
- Item 720
- Item 721
- Item 722
- Item 723
- Item 724
- Item 725
- Item 726
- Item 727
- Item 728
- Item 729
- Item 730
- Item 731
- Item 732
- Item 733
- Item 734
- Item 735
- Item 736
- Item 737
- Item 738
- Item 739
- Item 740
- Item 741
- Item 742
- Item 743
- Item 744
- Item 745
- Item 746
- Item 747
- Item 748
- Item 749
- Item 750
- Item 751
- Item 752
- Item 753
- Item 754
- Item 755
- Item 756
- Item 757
- Item 758
- Item 759
- Item 760
- Item 761
- Item 762
- Item 763
- Item 764
- Item 765
- Item 766
- Item 767
- Item 768
- Item 769
- Item 770
- Item 771
- Item 772
- Item 773
- Item 774
- Item 775
- Item 776
- Item 777
- Item 778
- Item 779
- Item 780
- Item 781
- Item 782
- Item 783
- Item 784
- Item 785
- Item 786
- Item 787
- Item 788
- Item 789
- Item 790
- Item 791
- Item 792
- Item 793
- Item 794
- Item 795
- Item 796
- Item 797
- Item 798
- Item 799
- Item 800
- Item 801
- Item 802
- Item 803
- Item 804
- Item 805
- Item 806
- Item 807
- Item 808
- Item 809
- Item 810
- Item 811
- Item 812
- Item 813
- Item 814
- Item 815
- Item 816
- Item 817
- Item 818
- Item 819
- Item 820
- Item 821
- Item 822
- Item 823
- Item 824
- Item 825
- Item 826
- Item 827
- Item 828
- Item 829
- Item 830
- Item 831
- Item 832
- Item 833
- Item 834
- Item 835
- Item 836
- Item 837
- Item 838
- Item 839
- Item 840
- Item 841
- Item 842
- Item 843
- Item 844
- Item 845
- Item 846
- Item 847
- Item 848
- Item 849
- Item 850
- Item 851
- Item 852
- Item 853
- Item 854
- Item 855
- Item 856
- Item 857
- Item 858
- Item 859
- Item 860
- Item 861
- Item 862
- Item 863
- Item 864
- Item 865
- Item 866
- Item 867
- Item 868
- Item 869
- Item 870
- Item 871
- Item 872
- Item 873
- Item 874
- Item 875
- Item 876
- Item 877
- Item 878
- Item 879
- Item 880
- Item 881
- Item 882
- Item 883
- Item 884
- Item 885
- Item 886
- Item 887
- Item 888
- Item 889
- Item 890
- Item 891
- Item 892
- Item 893
- Item 894
- Item 895
- Item 896
- Item 897
- Item 898
- Item 899
- Item 900
- Item 901
- Item 902
- Item 903
- Item 904
- Item 905
- Item 906
- Item 907
- Item 908
- Item 909
- Item 910
- Item 911
- Item 912
- Item 913
- Item 914
- Item 915
- Item 916
- Item 917
- Item 918
- Item 919
- Item 920
- Item 921
- Item 922
- Item 923
- Item 924
- Item 925
- Item 926
- Item 927
- Item 928
- Item 929
- Item 930
- Item 931
- Item 932
- Item 933
- Item 934
- Item 935
- Item 936
- Item 937
- Item 938
- Item 939
- Item 940
- Item 941
- Item 942
- Item 943
- Item 944
- Item 945
- Item 946
- Item 947
- Item 948
- Item 949
- Item 950
- Item 951
- Item 952
- Item 953
- Item 954
- Item 955
- Item 956
- Item 957
- Item 958
- Item 959
- Item 960
- Item 961
- Item 962
- Item 963
- Item 964
- Item 965
- Item 966
- Item 967
- Item 968
- Item 969
- Item 970
- Item 971
- Item 972
- Item 973
- Item 974
- Item 975
- Item 976
- Item 977
- Item 978
- Item 979
- Item 980
- Item 981
- Item 982
- Item 983
- Item 984
- Item 985
- Item 986
- Item 987
- Item 988
- Item 989
- Item 990
- Item 991
- Item 992
- Item 993
- Item 994
- Item 995
- Item 996
- Item 997
- Item 998
- Item 999
- Item 0
- Item 1
- Item 2
- Item 3
- Item 4
- Item 5
- Item 6
- Item 7
- Item 8
- Item 9
- Item 10
- Item 11
- Item 12
- Item 13
- Item 14
- Item 15
- Item 16
- Item 17
- Item 18
- Item 19
- Item 20
- Item 21
- Item 22
- Item 23
- Item 24
- Item 25
- Item 26
- Item 27
- Item 28
- Item 29
- Item 30
- Item 31
- Item 32
- Item 33
- Item 34
- Item 35
- Item 36
- Item 37
- Item 38
- Item 39
- Item 40
- Item 41
- Item 42
- Item 43
- Item 44
- Item 45
- Item 46
- Item 47
- Item 48
- Item 49
- Item 50
- Item 51
- Item 52
- Item 53
- Item 54
- Item 55
- Item 56
- Item 57
- Item 58
- Item 59
- Item 60
- Item 61
- Item 62
- Item 63
- Item 64
- Item 65
- Item 66
- Item 67
- Item 68
- Item 69
- Item 70
- Item 71
- Item 72
- Item 73
- Item 74
- Item 75
- Item 76
- Item 77
- Item 78
- Item 79
- Item 80
- Item 81
- Item 82
- Item 83
- Item 84
- Item 85
- Item 86
- Item 87
- Item 88
- Item 89
- Item 90
- Item 91
- Item 92
- Item 93
- Item 94
- Item 95
- Item 96
- Item 97
- Item 98
- Item 99
- Item 100
- Item 101
- Item 102
- Item 103
- Item 104
- Item 105
- Item 106
- Item 107
- Item 108
- Item 109
- Item 110
- Item 111
- Item 112
- Item 113
- Item 114
- Item 115
- Item 116
- Item 117
- Item 118
- Item 119
- Item 120
- Item 121
- Item 122
- Item 123
- Item 124
- Item 125
- Item 126
- Item 127
- Item 128
- Item 129
- Item 130
- Item 131
- Item 132
- Item 133
- Item 134
- Item 135
- Item 136
- Item 137
- Item 138
- Item 139
- Item 140
- Item 141
- Item 142
- Item 143
- Item 144
- Item 145
- Item 146
- Item 147
- Item 148
- Item 149
- Item 150
- Item 151
- Item 152
- Item 153
- Item 154
- Item 155
- Item 156
- Item 157
- Item 158
- Item 159
- Item 160
- Item 161
- Item 162
- Item 163
- Item 164
- Item 165
- Item 166
- Item 167
- Item 168
- Item 169
- Item 170
- Item 171
- Item 172
- Item 173
- Item 174
- Item 175
- Item 176
- Item 177
- Item 178
- Item 179
- Item 180
- Item 181
- Item 182
- Item 183
- Item 184
- Item 185
- Item 186
- Item 187
- Item 188
- Item 189
- Item 190
- Item 191
- Item 192
- Item 193
- Item 194
- Item 195
- Item 196
- Item 197
- Item 198
- Item 199
- Item 200
- Item 201
- Item 202
- Item 203
- Item 204
- Item 205
- Item 206
- Item 207
- Item 208
- Item 209
- Item 210
- Item 211
- Item 212
- Item 213
- Item 214
- Item 215
- Item 216
- Item 217
- Item 218
- Item 219
- Item 220
- Item 221
- Item 222
- Item 223
- Item 224
- Item 225
- Item 226
- Item 227
- Item 228
- Item 229
- Item 230
- Item 231
- Item 232
- Item 233
- Item 234
- Item 235
- Item 236
- Item 237
- Item 238
- Item 239
- Item 240
- Item 241
- Item 242
- Item 243
- Item 244
- Item 245
- Item 246
- Item 247
- Item 248
- Item 249
- Item 250
- Item 251
- Item 252
- Item 253
- Item 254
- Item 255
- Item 256
- Item 257
- Item 258
- Item 259
- Item 260
- Item 261
- Item 262
- Item 263
- Item 264
- Item 265
- Item 266
- Item 267
- Item 268
- Item 269
- Item 270
- Item 271
- Item 272
- Item 273
- Item 274
- Item 275
- Item 276
- Item 277
- Item 278
- Item 279
- Item 280
- Item 281
- Item 282
- Item 283
- Item 284
- Item 285
- Item 286
- Item 287
- Item 288
- Item 289
- Item 290
- Item 291
- Item 292
- Item 293
- Item 294
- Item 295
- Item 296
- Item 297
- Item 298
- Item 299
- Item 300
- Item 301
- Item 302
- Item 303
- Item 304
- Item 305
- Item 306
- Item 307
- Item 308
- Item 309
- Item 310
- Item 311
- Item 312
- Item 313
- Item 314
- Item 315
- Item 316
- Item 317
- Item 318
- Item 319
- Item 320
- Item 321
- Item 322
- Item 323
- Item 324
- Item 325
- Item 326
- Item 327
- Item 328
- Item 329
- Item 330
- Item 331
- Item 332
- Item 333
- Item 334
- Item 335
- Item 336
- Item 337
- Item 338
- Item 339
- Item 340
- Item 341
- Item 342
- Item 343
- Item 344
- Item 345
- Item 346
- Item 347
- Item 348
- Item 349
- Item 350
- Item 351
- Item 352
- Item 353
- Item 354
- Item 355
- Item 356
- Item 357
- Item 358
- Item 359
- Item 360
- Item 361
- Item 362
- Item 363
- Item 364
- Item 365
- Item 366
- Item 367
- Item 368
- Item 369
- Item 370
- Item 371
- Item 372
- Item 373
- Item 374
- Item 375
- Item 376
- Item 377
- Item 378
- Item 379
- Item 380
- Item 381
- Item 382
- Item 383
- Item 384
- Item 385
- Item 386
- Item 387
- Item 388
- Item 389
- Item 390
- Item 391
- Item 392
- Item 393
- Item 394
- Item 395
- Item 396
- Item 397
- Item 398
- Item 399
- Item 400
- Item 401
- Item 402
- Item 403
- Item 404
- Item 405
- Item 406
- Item 407
- Item 408
- Item 409
- Item 410
- Item 411
- Item 412
- Item 413
- Item 414
- Item 415
- Item 416
- Item 417
- Item 418
- Item 419
- Item 420
- Item 421
- Item 422
- Item 423
- Item 424
- Item 425
- Item 426
- Item 427
- Item 428
- Item 429
- Item 430
- Item 431
- Item 432
- Item 433
- Item 434
- Item 435
- Item 436
- Item 437
- Item 438
- Item 439
- Item 440
- Item 441
- Item 442
- Item 443
- Item 444
- Item 445
- Item 446
- Item 447
- Item 448
- Item 449
- Item 450
- Item 451
- Item 452
- Item 453
- Item 454
- Item 455
- Item 456
- Item 457
- Item 458
- Item 459
- Item 460
- Item 461
- Item 462
- Item 463
- Item 464
- Item 465
- Item 466
- Item 467
- Item 468
- Item 469
- Item 470
- Item 471
- Item 472
- Item 473
- Item 474
- Item 475
- Item 476
- Item 477
- Item 478
- Item 479
- Item 480
- Item 481
- Item 482
- Item 483
- Item 484
- Item 485
- Item 486
- Item 487
- Item 488
- Item 489
- Item 490
- Item 491
- Item 492
- Item 493
- Item 494
- Item 495
- Item 496
- Item 497
- Item 498
- Item 499
- Item 500
- Item 501
- Item 502
- Item 503
- Item 504
- Item 505
- Item 506
- Item 507
- Item 508
- Item 509
- Item 510
- Item 511
- Item 512
- Item 513
- Item 514
- Item 515
- Item 516
- Item 517
- Item 518
- Item 519
- Item 520
- Item 521
- Item 522
- Item 523
- Item 524
- Item 525
- Item 526
- Item 527
- Item 528
- Item 529
- Item 530
- Item 531
- Item 532
- Item 533
- Item 534
- Item 535
- Item 536
- Item 537
- Item 538
- Item 539
- Item 540
- Item 541
- Item 542
- Item 543
- Item 544
- Item 545
- Item 546
- Item 547
- Item 548
- Item 549
- Item 550
- Item 551
- Item 552
- Item 553
- Item 554
- Item 555
- Item 556
- Item 557
- Item 558
- Item 559
- Item 560
- Item 561
- Item 562
- Item 563
- Item 564
- Item 565
- Item 566
- Item 567
- Item 568
- Item 569
- Item 570
- Item 571
- Item 572
- Item 573
- Item 574
- Item 575
- Item 576
- Item 577
- Item 578
- Item 579
- Item 580
- Item 581
- Item 582
- Item 583
- Item 584
- Item 585
- Item 586
- Item 587
- Item 588
- Item 589
- Item 590
- Item 591
- Item 592
- Item 593
- Item 594
- Item 595
- Item 596
- Item 597
- Item 598
- Item 599
- Item 600
- Item 601
- Item 602
- Item 603
- Item 604
- Item 605
- Item 606
- Item 607
- Item 608
- Item 609
- Item 610
- Item 611
- Item 612
- Item 613
- Item 614
- Item 615
- Item 616
- Item 617
- Item 618
- Item 619
- Item 620
- Item 621
- Item 622
- Item 623
- Item 624
- Item 625
- Item 626
- Item 627
- Item 628
- Item 629
- Item 630
- Item 631
- Item 632
- Item 633
- Item 634
- Item 635
- Item 636
- Item 637
- Item 638
- Item 639
- Item 640
- Item 641
- Item 642
- Item 643
- Item 644
- Item 645
- Item 646
- Item 647
- Item 648
- Item 649
- Item 650
- Item 651
- Item 652
- Item 653
- Item 654
- Item 655
- Item 656
- Item 657
- Item 658
- Item 659
- Item 660
- Item 661
- Item 662
- Item 663
- Item 664
- Item 665
- Item 666
- Item 667
- Item 668
- Item 669
- Item 670
- Item 671
- Item 672
- Item 673
- Item 674
- Item 675
- Item 676
- Item 677
- Item 678
- Item 679
- Item 680
- Item 681
- Item 682
- Item 683
- Item 684
- Item 685
- Item 686
- Item 687
- Item 688
- Item 689
- Item 690
- Item 691
- Item 692
- Item 693
- Item 694
- Item 695
- Item 696
- Item 697
- Item 698
- Item 699
- Item 700
- Item 701
- Item 702
- Item 703
- Item 704
- Item 705
- Item 706
- Item 707
- Item 708
- Item 709
- Item 710
- Item 711
- Item 712
- Item 713
- Item 714
- Item 715
- Item 716
- Item 717
- Item 718
- Item 719
- Item 720
- Item 721
- Item 722
- Item 723
- Item 724
- Item 725
- Item 726
- Item 727
- Item 728
- Item 729
- Item 730
- Item 731
- Item 732
- Item 733
- Item 734
- Item 735
- Item 736
- Item 737
- Item 738
- Item 739
- Item 740
- Item 741
- Item 742
- Item 743
- Item 744
- Item 745
- Item 746
- Item 747
- Item 748
- Item 749
- Item 750
- Item 751
- Item 752
- Item 753
- Item 754
- Item 755
- Item 756
- Item 757
- Item 758
- Item 759
- Item 760
- Item 761
- Item 762
- Item 763
- Item 764
- Item 765
- Item 766
- Item 767
- Item 768
- Item 769
- Item 770
- Item 771
- Item 772
- Item 773
- Item 774
- Item 775
- Item 776
- Item 777
- Item 778
- Item 779
- Item 780
- Item 781
- Item 782
- Item 783
- Item 784
- Item 785
- Item 786
- Item 787
- Item 788
- Item 789
- Item 790
- Item 791
- Item 792
- Item 793
- Item 794
- Item 795
- Item 796
- Item 797
- Item 798
- Item 799
- Item 800
- Item 801
- Item 802
- Item 803
- Item 804
- Item 805
- Item 806
- Item 807
- Item 808
- Item 809
- Item 810
- Item 811
- Item 812
- Item 813
- Item 814
- Item 815
- Item 816
- Item 817
- Item 818
- Item 819
- Item 820
- Item 821
- Item 822
- Item 823
- Item 824
- Item 825
- Item 826
- Item 827
- Item 828
- Item 829
- Item 830
- Item 831
- Item 832
- Item 833
- Item 834
- Item 835
- Item 836
- Item 837
- Item 838
- Item 839
- Item 840
- Item 841
- Item 842
- Item 843
- Item 844
- Item 845
- Item 846
- Item 847
- Item 848
- Item 849
- Item 850
- Item 851
- Item 852
- Item 853
- Item 854
- Item 855
- Item 856
- Item 857
- Item 858
- Item 859
- Item 860
- Item 861
- Item 862
- Item 863
- Item 864
- Item 865
- Item 866
- Item 867
- Item 868
- Item 869
- Item 870
- Item 871
- Item 872
- Item 873
- Item 874
- Item 875
- Item 876
- Item 877
- Item 878
- Item 879
- Item 880
- Item 881
- Item 882
- Item 883
- Item 884
- Item 885
- Item 886
- Item 887
- Item 888
- Item 889
- Item 890
- Item 891
- Item 892
- Item 893
- Item 894
- Item 895
- Item 896
- Item 897
- Item 898
- Item 899
- Item 900
- Item 901
- Item 902
- Item 903
- Item 904
- Item 905
- Item 906
- Item 907
- Item 908
- Item 909
- Item 910
- Item 911
- Item 912
- Item 913
- Item 914
- Item 915
- Item 916
- Item 917
- Item 918
- Item 919
- Item 920
- Item 921
- Item 922
- Item 923
- Item 924
- Item 925
- Item 926
- Item 927
- Item 928
- Item 929
- Item 930
- Item 931
- Item 932
- Item 933
- Item 934
- Item 935
- Item 936
- Item 937
- Item 938
- Item 939
- Item 940
- Item 941
- Item 942
- Item 943
- Item 944
- Item 945
- Item 946
- Item 947
- Item 948
- Item 949
- Item 950
- Item 951
- Item 952
- Item 953
- Item 954
- Item 955
- Item 956
- Item 957
- Item 958
- Item 959
- Item 960
- Item 961
- Item 962
- Item 963
- Item 964
- Item 965
- Item 966
- Item 967
- Item 968
- Item 969
- Item 970
- Item 971
- Item 972
- Item 973
- Item 974
- Item 975
- Item 976
- Item 977
- Item 978
- Item 979
- Item 980
- Item 981
- Item 982
- Item 983
- Item 984
- Item 985
- Item 986
- Item 987
- Item 988
- Item 989
- Item 990
- Item 991
- Item 992
- Item 993
- Item 994
- Item 995
- Item 996
- Item 997
- Item 998
- Item 999
Concept 4: Component Lifecycle & Memory Leaks
Missing dependency arrays in useEffect create memory leaks and duplicate event listeners. Learn how proper dependencies prevent re-running effects and mounting/unmounting on every render.
Code Comparison
<span class="text-gray-<span class="text-cyan-400">500span>">// ❌ BAD: Missing dependency array in useEffectspan>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> Modal = () => {
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> [counter, setCounter] = useState(<span class="text-cyan-400">0span>);
<span class="text-gray-<span class="text-cyan-400">500span>">// Runs on EVERY render - memory leak!span>
useEffect(() => {
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> interval = setInterval(() => {
console.log(<span class="text-green-<span class="text-cyan-400">400span>">'interval'span>);
}, <span class="text-cyan-400">100span>);
window.addEventListener(<span class="text-green-<span class="text-cyan-400">400span>">'resize'span>, () => {
console.log(<span class="text-green-<span class="text-cyan-400">400span>">'resized'span>);
});
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> () => clearInterval(interval);
<span class="text-gray-<span class="text-cyan-400">500span>">// Missing dependency array!span>
});
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> (
<div>
<button onClick={() => setCounter(c => c + <span class="text-cyan-400">1span>)}>
Count: {counter}
button>
div>
);
};<span class="text-gray-<span class="text-cyan-400">500span>">// ✅ GOOD: Proper useEffect dependency arrayspan>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> Modal = () => {
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> [counter, setCounter] = useState(<span class="text-cyan-400">0span>);
<span class="text-gray-<span class="text-cyan-400">500span>">// Runs ONLY on mount/unmountspan>
useEffect(() => {
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> interval = setInterval(() => {
console.log(<span class="text-green-<span class="text-cyan-400">400span>">'interval'span>);
}, <span class="text-cyan-400">100span>);
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> handleResize = () => console.log(<span class="text-green-<span class="text-cyan-400">400span>">'resized'span>);
window.addEventListener(<span class="text-green-<span class="text-cyan-400">400span>">'resize'span>, handleResize);
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> () => {
clearInterval(interval);
window.removeEventListener(<span class="text-green-<span class="text-cyan-400">400span>">'resize'span>, handleResize);
};
}, []); <span class="text-gray-<span class="text-cyan-400">500span>">// Empty dependency array!span>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> (
<div>
<button onClick={() => setCounter(c => c + <span class="text-cyan-400">1span>)}>
Count: {counter}
button>
div>
);
};Interactive Demo
Concept 5: Progressive Loading & Batching
Loading all resources simultaneously blocks the UI. See how progressive loading with staggered timing keeps your application responsive while managing concurrent operations efficiently.
Code Comparison
<span class="text-gray-<span class="text-cyan-400">500span>">// ❌ BAD: Load all images at oncespan>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> Gallery = () => {
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> [visible, setVisible] = useState(<span class="text-cyan-400">0span>);
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> images = Array.<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>fromspan>({ length: <span class="text-cyan-400">12span> }, (_, i) =>
({ id: i, url: <span class="text-green-<span class="text-cyan-400">400span>">`/img-${i}.jpg`span> })
);
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> (
<div>
<button onClick={() => setVisible(images.length)}>
Load All
button>
<div className=<span class="text-green-<span class="text-cyan-400">400span>">"grid"span>>
{images.map((img, idx) =>
idx < visible &&
<img key={img.id} src={img.url} />
)}
div>
div>
);
};<span class="text-gray-<span class="text-cyan-400">500span>">// ✅ GOOD: Progressive lazy loadingspan>
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> Gallery = () => {
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> [loaded, setLoaded] = useState(new Set());
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> images = Array.<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>fromspan>({ length: <span class="text-cyan-400">12span> }, (_, i) =>
({ id: i, url: <span class="text-green-<span class="text-cyan-400">400span>">`/img-${i}.jpg`span> })
);
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>constspan> startLoading = () => {
images.forEach((img, idx) => {
setTimeout(() => {
setLoaded(p => new Set(p).add(img.id));
}, idx * <span class="text-cyan-400">100span>); <span class="text-gray-<span class="text-cyan-400">500span>">// Stagger loadingspan>
});
};
<span class=<span class="text-green-<span class="text-cyan-400">400span>">"text-blue-<span class="text-cyan-400">400span>"span>>returnspan> (
<div>
<button onClick={startLoading}>Load Progressivelybutton>
<div className=<span class="text-green-<span class="text-cyan-400">400span>">"grid"span>>
{images.map(img =>
loaded.has(img.id) &&
<img key={img.id} src={img.url} />
)}
div>
div>
);
};