Estoy usando un componente de gancho y varias variables de estado. He leído sobre el uso de useEffect() con parámetros para obtener una especie de devolución de llamada después de actualizar un estado. Ejemplo:
export const hookComponent = () => { const [var, setVar] = useState(null); useEffect(() => { //do things }, [var]) } En este ejemplo, useEffect() se ejecutaría en cada llamada a setVar() . En mi caso, no quiero ejecutar useEffect() cada vez, sino solo en ocasiones específicas. Me gustaría darle a setVar() algún tipo de información que pueda usar en useEffect() como setVar(newValue, true) .
Nota: No quiero almacenar esta información en var.
¿Hay alguna forma de hacer esto?
Como dijo Nizar, verificación condicional simple en 'var' en useEffect
Si el cálculo es caro, puedes
const expensiveValue = useMemo(() => { // other logic here if needed // could even be simple return var=='x'?true:false, although this would be easier to do in the useEffect hook? return computeExpensiveValue(var); },[var]); useEffect(() => { //do things //expensiveValue only changes when you want it to from the memo }, [expensiveValue])Gracias sambomartin y Nizar por tu aporte.
Para todos los que buscan una respuesta: después de investigar un poco más, encontré 3 posibles soluciones:
setState() como segundo parámetro.useRef para determinar de dónde proviene la actualización de su estado. Puede usar esta información en el método useEffect() .Hasta donde yo sé, useEffect solo se activa si el valor de dependencia cambia , no simplemente al ejecutar setValue.
Te ofrezco tres soluciones, la primera, cercana a lo que quieres pero sin usar useEffect hook, la segunda es una extensión de la primera, que puede ser necesaria si necesitas controlar el estado anterior, y la tercera, más en general, como dicen los comentarios, aunque no se activará si el estado es el mismo, incluso si ejecuta setValue .
export default function MyComponent() { const [state, setState] = useState(null); const handleChangeSetState = (nextState, flag) => { if (flag) { specialUseCaseCb(); } setState(nextState); }; return <div>{/* ... */}</div>; } export default function MyComponent2() { const [state, setState] = useState(0); const handleChangeSetState = (increment, flag) => setState((prevState) => { const nextState = prevState + increment; // you may need prevState or nextState for checking your use case if (flag) { specialUseCaseCb(); } return nextState; }); return <div>{/* ... */}</div>; } export default function MyComponent3() { const [state, setState] = useState(""); // notice that this will only be triggered if state changes useEffect(() => { if (state !== "my-special-use-case") return; specialUseCaseCb(); }, [state]); return <div>{/* ... */}</div>; }