Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

235
Vistas
Problema de useState nulo cuando el estado no es nulo en useEffect

algunos problemas con el estado en TypeScript React.

Un componente secundario pasa un objeto 'terminal' al principal a través de una función pasada llamada returnTerminal() . Este objeto terminal luego se almacena como un _object . useEffect() dice que _object no es nulo eventualmente, pero callback() mantiene continuamente que _object es nulo, y no estoy seguro de por qué.

Componente principal

 const Parent: React.FunctionComponent<ParentProps> = () => { const [_object, set_object] = useState<Terminal>(null); const handleGetTerminal = (terminal: Terminal) => { set_object(terminal); }; useEffect(() => { if (_object !== null) { _object.writeln("_object is not null"); // This prints just fine } }, [_object]); return ( <Child returnTerminal={(term) => handleGetTerminal(term)} callback={() => { console.log(_object === null); // This returns true - the object is null for some reason??? }} /> ); };

Componente hijo

 const Child: React.FunctionComponent<ChildProps> = (props) => { const { callback, returnTerminal } = props; // The ref where the terminal will be stored and returned const ref = useRef<HTMLDivElement>(null); // The xterm.js terminal object const terminal = new Terminal(); useLayoutEffect(() => { // Calls whenever terminal is typed into if (callback) terminal.onData(callback); // Mount terminal to the DOM if (ref.current) terminal.open(ref.current); // Pass the terminal to the parent object returnTerminal(terminal); }, []); return <div ref={ref}></div>; }; export default Child;

La callback() siempre devuelve que _object es nulo, sin importar cuánto tiempo espere.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

La respuesta terminó siendo el uso de useImperativeHandle y forwardRef. Aquí está el código completo.

Padre

 import Child from "./child"; interface ParentProps { name?: string; } const Parent: React.FunctionComponent<ParentProps> = () => { type ChildHandle = ElementRef<typeof Child>; const childRef = useRef<Child>(null); let _object: Terminal; // same Terminal type that Child uses useEffect(() => { if (childRef.current) { _object = childRef.current.get(); // imperitive handle function _object.writeln(“_object loaded”); } }, []); return ( <Child ref={childRef} callback={() => { terminal.writeln("_object is not null”); // THIS finally works }} /> ); };

Niño

 interface ChildProps { callback?(data: string): void; } type ChildHandle = { get: () => Terminal; }; const Child: ForwardRefRenderFunction<ChildHandle, ChildProps> = ( props, forRef ) => { const { callback } = props; const terminal = new Terminal(); // The ref where the terminal will be stored and returned const ref = useRef<HTMLDivElement>(null); useImperativeHandle(forRef, () => ({ get() { return terminal; }, })); useLayoutEffect(() => { // Calls whenever terminal is typed into if (callback) terminal.onData(callback); // Mount terminal to the DOM if (ref.current) terminal.open(ref.current); }, []); return <div ref={ref}></div>; }; export default forwardRef(Child);
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda