@@ -274,7 +274,27 @@ new MyRuleTester().run("/deriving-state", {
274274 }
275275 ` ,
276276 } ,
277- // TODO: Above function tests but with `useCallback`
277+ {
278+ name : "From external state via useCallback derived setter" ,
279+ code : js `
280+ import { getPrefixFor } from 'library';
281+ import { useState } from 'react';
282+
283+ function Component() {
284+ const [name, setName] = useState();
285+ const [prefixedName, setPrefixedName] = useState();
286+ const prefix = getPrefixFor(name);
287+
288+ const derivedSetter = useCallback((name) => {
289+ setPrefixedName(prefix + name);
290+ }, [prefix]);
291+
292+ useEffect(() => {
293+ derivedSetter(name);
294+ }, [name, derivedSetter])
295+ }
296+ ` ,
297+ } ,
278298 ] ,
279299 invalid : [
280300 {
@@ -547,6 +567,34 @@ new MyRuleTester().run("/deriving-state", {
547567 } ,
548568 ] ,
549569 } ,
570+ {
571+ name : "From internal state via useCallback derived setter" ,
572+ todo : true ,
573+ code : js `
574+ import { getPrefixFor } from 'library';
575+ import { useState } from 'react';
576+
577+ function Component() {
578+ const [name, setName] = useState();
579+ const [prefixedName, setPrefixedName] = useState();
580+ const prefix = 'Dr. ';
581+
582+ const derivedSetter = useCallback((name) => {
583+ setPrefixedName(prefix + name);
584+ }, [prefix]);
585+
586+ useEffect(() => {
587+ derivedSetter(name);
588+ }, [name, derivedSetter]);
589+ }
590+ ` ,
591+ errors : [
592+ {
593+ messageId : messageIds . avoidDerivedState ,
594+ data : { state : "prefixedName" } ,
595+ } ,
596+ ] ,
597+ } ,
550598 {
551599 name : "Partially update complex state from props" ,
552600 code : js `
0 commit comments