@@ -95,7 +95,7 @@ const tests = {
95
95
const local1 = {};
96
96
{
97
97
const local2 = {};
98
- useEffect (() => {
98
+ useCallback (() => {
99
99
console.log(local1);
100
100
console.log(local2);
101
101
}, [local1, local2]);
@@ -109,7 +109,7 @@ const tests = {
109
109
const local1 = {};
110
110
function MyNestedComponent() {
111
111
const local2 = {};
112
- useEffect (() => {
112
+ useCallback (() => {
113
113
console.log(local1);
114
114
console.log(local2);
115
115
}, [local2]);
@@ -590,6 +590,17 @@ const tests = {
590
590
}
591
591
` ,
592
592
} ,
593
+ {
594
+ // Valid even though activeTab is "unused".
595
+ // We allow that in effects, but not callbacks or memo.
596
+ code : `
597
+ function Foo({ activeTab }) {
598
+ useEffect(() => {
599
+ window.scrollTo(0, 0);
600
+ }, [activeTab]);
601
+ }
602
+ ` ,
603
+ } ,
593
604
] ,
594
605
invalid : [
595
606
{
@@ -809,7 +820,7 @@ const tests = {
809
820
function MyComponent() {
810
821
const local1 = {};
811
822
const local2 = {};
812
- useEffect (() => {
823
+ useMemo (() => {
813
824
console.log(local1);
814
825
}, [local1, local2]);
815
826
}
@@ -818,13 +829,13 @@ const tests = {
818
829
function MyComponent() {
819
830
const local1 = {};
820
831
const local2 = {};
821
- useEffect (() => {
832
+ useMemo (() => {
822
833
console.log(local1);
823
834
}, [local1]);
824
835
}
825
836
` ,
826
837
errors : [
827
- "React Hook useEffect has an unnecessary dependency: 'local2'. " +
838
+ "React Hook useMemo has an unnecessary dependency: 'local2'. " +
828
839
'Either exclude it or remove the dependency array.' ,
829
840
] ,
830
841
} ,
@@ -836,7 +847,7 @@ const tests = {
836
847
const local1 = {};
837
848
function MyNestedComponent() {
838
849
const local2 = {};
839
- useEffect (() => {
850
+ useCallback (() => {
840
851
console.log(local1);
841
852
console.log(local2);
842
853
}, [local1]);
@@ -848,7 +859,7 @@ const tests = {
848
859
const local1 = {};
849
860
function MyNestedComponent() {
850
861
const local2 = {};
851
- useEffect (() => {
862
+ useCallback (() => {
852
863
console.log(local1);
853
864
console.log(local2);
854
865
}, [local2]);
@@ -857,7 +868,7 @@ const tests = {
857
868
` ,
858
869
errors : [
859
870
// Focus on the more important part first (missing dep)
860
- "React Hook useEffect has a missing dependency: 'local2'. " +
871
+ "React Hook useCallback has a missing dependency: 'local2'. " +
861
872
'Either include it or remove the dependency array.' ,
862
873
] ,
863
874
} ,
@@ -912,16 +923,16 @@ const tests = {
912
923
{
913
924
code : `
914
925
function MyComponent() {
915
- useEffect (() => {}, [local]);
926
+ useCallback (() => {}, [local]);
916
927
}
917
928
` ,
918
929
output : `
919
930
function MyComponent() {
920
- useEffect (() => {}, []);
931
+ useCallback (() => {}, []);
921
932
}
922
933
` ,
923
934
errors : [
924
- "React Hook useEffect has an unnecessary dependency: 'local'. " +
935
+ "React Hook useCallback has an unnecessary dependency: 'local'. " +
925
936
'Either exclude it or remove the dependency array.' ,
926
937
] ,
927
938
} ,
@@ -1229,7 +1240,6 @@ const tests = {
1229
1240
] ,
1230
1241
} ,
1231
1242
{
1232
- // TODO: need to think more about this case.
1233
1243
code : `
1234
1244
function MyComponent() {
1235
1245
const local = {id: 42};
@@ -1238,13 +1248,14 @@ const tests = {
1238
1248
}, [local.id]);
1239
1249
}
1240
1250
` ,
1241
- // TODO: this may not be a good idea.
1251
+ // TODO: autofix should be smart enough
1252
+ // to remove local.id from the list.
1242
1253
output : `
1243
1254
function MyComponent() {
1244
1255
const local = {id: 42};
1245
1256
useEffect(() => {
1246
1257
console.log(local);
1247
- }, [local]);
1258
+ }, [local, local.id ]);
1248
1259
}
1249
1260
` ,
1250
1261
errors : [
@@ -1278,7 +1289,7 @@ const tests = {
1278
1289
code : `
1279
1290
function MyComponent() {
1280
1291
const local1 = {};
1281
- useEffect (() => {
1292
+ useCallback (() => {
1282
1293
const local1 = {};
1283
1294
console.log(local1);
1284
1295
}, [local1]);
@@ -1287,32 +1298,32 @@ const tests = {
1287
1298
output : `
1288
1299
function MyComponent() {
1289
1300
const local1 = {};
1290
- useEffect (() => {
1301
+ useCallback (() => {
1291
1302
const local1 = {};
1292
1303
console.log(local1);
1293
1304
}, []);
1294
1305
}
1295
1306
` ,
1296
1307
errors : [
1297
- "React Hook useEffect has an unnecessary dependency: 'local1'. " +
1308
+ "React Hook useCallback has an unnecessary dependency: 'local1'. " +
1298
1309
'Either exclude it or remove the dependency array.' ,
1299
1310
] ,
1300
1311
} ,
1301
1312
{
1302
1313
code : `
1303
1314
function MyComponent() {
1304
1315
const local1 = {};
1305
- useEffect (() => {}, [local1]);
1316
+ useCallback (() => {}, [local1]);
1306
1317
}
1307
1318
` ,
1308
1319
output : `
1309
1320
function MyComponent() {
1310
1321
const local1 = {};
1311
- useEffect (() => {}, []);
1322
+ useCallback (() => {}, []);
1312
1323
}
1313
1324
` ,
1314
1325
errors : [
1315
- "React Hook useEffect has an unnecessary dependency: 'local1'. " +
1326
+ "React Hook useCallback has an unnecessary dependency: 'local1'. " +
1316
1327
'Either exclude it or remove the dependency array.' ,
1317
1328
] ,
1318
1329
} ,
@@ -1785,6 +1796,62 @@ const tests = {
1785
1796
"because their mutation doesn't re-render the component." ,
1786
1797
] ,
1787
1798
} ,
1799
+ {
1800
+ code : `
1801
+ function MyComponent({ activeTab }) {
1802
+ const ref1 = useRef();
1803
+ const ref2 = useRef();
1804
+ useEffect(() => {
1805
+ ref1.current.scrollTop = 0;
1806
+ ref2.current.scrollTop = 0;
1807
+ }, [ref1.current, ref2.current, activeTab]);
1808
+ }
1809
+ ` ,
1810
+ output : `
1811
+ function MyComponent({ activeTab }) {
1812
+ const ref1 = useRef();
1813
+ const ref2 = useRef();
1814
+ useEffect(() => {
1815
+ ref1.current.scrollTop = 0;
1816
+ ref2.current.scrollTop = 0;
1817
+ }, [activeTab]);
1818
+ }
1819
+ ` ,
1820
+ errors : [
1821
+ "React Hook useEffect has unnecessary dependencies: 'ref1.current' and 'ref2.current'. " +
1822
+ 'Either exclude them or remove the dependency array. ' +
1823
+ "Mutable values like 'ref1.current' aren't valid dependencies " +
1824
+ "because their mutation doesn't re-render the component." ,
1825
+ ] ,
1826
+ } ,
1827
+ {
1828
+ code : `
1829
+ function MyComponent({ activeTab, initY }) {
1830
+ const ref1 = useRef();
1831
+ const ref2 = useRef();
1832
+ const fn = useCallback(() => {
1833
+ ref1.current.scrollTop = initY;
1834
+ ref2.current.scrollTop = initY;
1835
+ }, [ref1.current, ref2.current, activeTab, initY]);
1836
+ }
1837
+ ` ,
1838
+ output : `
1839
+ function MyComponent({ activeTab, initY }) {
1840
+ const ref1 = useRef();
1841
+ const ref2 = useRef();
1842
+ const fn = useCallback(() => {
1843
+ ref1.current.scrollTop = initY;
1844
+ ref2.current.scrollTop = initY;
1845
+ }, [initY]);
1846
+ }
1847
+ ` ,
1848
+ errors : [
1849
+ "React Hook useCallback has unnecessary dependencies: 'activeTab', 'ref1.current', and 'ref2.current'. " +
1850
+ 'Either exclude them or remove the dependency array. ' +
1851
+ "Mutable values like 'ref1.current' aren't valid dependencies " +
1852
+ "because their mutation doesn't re-render the component." ,
1853
+ ] ,
1854
+ } ,
1788
1855
{
1789
1856
code : `
1790
1857
function MyComponent() {
0 commit comments