react-doctor/no-prop-callback-in-effect

Lift the shared state into a Provider so both sides read the same source — no useEffect-driven sync needed

  • Category: State & Effects
  • Severity: warn
  • Source: oxlint-plugin-react-doctor
  • Framework: global
  • Enabled when: always

Validation prompt

Use this to decide whether a fired diagnostic is real or a false positive.

Fires when a useEffect or useLayoutEffect with at least one non-prop Identifier in its deps calls a prop-named function (e.g. onChange(state)) at the effect's top level or inside if/try/for/switch blocks — the lift-state-via-callback anti-pattern. Calls nested inside setTimeout, addEventListener, or other sub-handlers are intentionally excluded; those belong to prefer-use-effect-event.

Fix prompt

Use this once validation confirms the diagnostic is real.

Move the shared state into a Context Provider that both the child and the parent read via useContext or use(), so there is one source of truth and no useEffect-driven mirror. Alternatively, lift the state to the parent and pass value + setter down as props. See https://react.dev/learn/you-might-not-need-an-effect#passing-data-to-the-parent