es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El contexto no actualiza el valor.

Tengo un contexto como este

type ScanContextState = {
  confirmar: boolean;
  toggleConfirmar: () => void;
};

const estadoInicial: ScanContextState = {
  confirmar: false,
  toggleConfirmar: () => {},
};

export const ContextoConfirmacionEscaneo =
  createContext<scancontextstate>(estadoInicial);

export const ProveedorEscaneo: FC = ({ children }) => {
  const [confirmar, setConfirmar] = useState(estadoInicial.confirmar);

  const toggleConfirmar = () => {
    setConfirmar(!confirmar);
  };

  return (
    <contextoconfirmacionescaneo.provider value="{{" confirmar,="" toggleconfirmar="" }}="">
      {children}
    </contextoconfirmacionescaneo.provider>
  );
};



y llamo a toggleConfirmar en una pantalla cuando el escaneo está completo así `toggleConfirmar();`
y aquí está la raíz de mi aplicación

import PaymentBottomSheet from "./PaymentBottomSheet";
import MainStackNavigator from "./MainStackNavigator";
import { ProveedorEscaneo } from "./Contexts";
import { ContextoConfirmacionEscaneo } from "./Contexts";

const Raiz: React.FC = () => {
  const [mostrarEscaneo, setEscaneo] = useState(false);
  const { confirmar, toggleConfirmar } = useContext(ContextoConfirmacionEscaneo);

  return (
    <>
      <proveedorescaneo>
        <iconregistry icons="{EvaIconsPack}"></iconregistry>
        <applicationprovider {...eva}="" theme="{{" ...eva.light,="" ...theme="" }}="">
          <navigationcontainer>
            <mainstacknavigator setescaneo="{setEscaneo}"></mainstacknavigator>
            {confirmar && <paymentbottomsheet setescaneo="{setEscaneo}"></paymentbottomsheet>}
          </navigationcontainer>
        </applicationprovider>
      </proveedorescaneo>

  );
};

export default Raiz;

Quiero ver PaymentBottomSheet cuando confirmar sea true, sin embargo, no sé por qué nunca se vuelve true, aunque lo activo como dije antes. Soy nuevo en el uso de contextos con TypeScript, así que ¿podría alguien explicarme por qué no se actualiza?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar en el hook useContext en el componente Raíz. Cuando ScanningProvider se envuelve alrededor de toda la aplicación, crea una nueva instancia del objeto ScanContextState que se convierte en el contexto actual. El componente ScanningProvider también tiene su propio estado para el valor de confirm que es independiente del contexto.

    Para acceder y actualizar el valor de confirm desde el contexto en el componente Raíz, deberás envolver la parte del componente que necesita acceder al contexto con el componente ConfirmScanningContext.Consumer de esta manera:

    <confirmscanningcontext.consumer>
      {({ confirm }) => {
        return confirm && <paymentbottomsheet setscan="{setScan}"></paymentbottomsheet>;
      }}
    </confirmscanningcontext.consumer>
    

    Esto asegurará que el valor actual de confirm del contexto se utilice para renderizar condicionalmente el componente PaymentBottomSheet.

Comments are closed.