Estoy usando Reaccionar. También tengo un archivo que está escrito en jQuery. (alguien lo escribió y no puede reescribirlo ahora por no tener tiempo).
En ese archivo jQuery hay una variable var test = 2 y después de un tiempo, cambia a test = 5 . Necesito reaccionar en mi componente React cuando cambia ese valor test .
Así que hice esto en el archivo jQuery:
window.testPromise = new Promise((res, rej) => { setTimeout(() => { res(test) }, 300) })En mi componente React, hago esto:
const [test, setTest] = useState(0) (window as any).distancePromise.then((val:number) => { setTest(val); }) pero useState alguna manera está roto ahora. Dice:
Esta expresión no es invocable. Escriba '[number, Dispatch<SetStateAction>]' no tiene firmas de llamada.
¿Alguna idea?
Prueba esto:
window.distancePromise = () => new Promise((res, rej) => { setTimeout(() => { res("a value for test") }, 300) })Tenga en cuenta que lo convertí en una función.
Y utilízalo así:
const [test, setTest] = useState(0) useEffect(() => { (window as any).distancePromise && (window as any).distancePromise().then((val:number) => { setTest(val); }) }, []) observe el paréntesis de llamada ()
EDITAR: recomendaría evitar las variables de ventana en general. React tiene muchas formas de evitar esto, como el contexto o el uso de Redux o cualquier otra herramienta de administración de estado.
EDIT2: Aquí hay un código de trabajo Sandbox: https://codesandbox.io/s/vibrant-visvesvaraya-36fmy?file=/src/App.js
EDIT3: Nunca, quiero decir NUNCA use jQuery con React ... jQuery es un manipulador DOM, exactamente como React. Pero React es más rápido y mejor. Nunca uses jQuery con React