import React, { useEffect, useState } from 'react'
import { Route } from 'react-router-dom'
import { BrowserRouter as Router } from 'react-router-dom'
export default function Test() {
const s = useS()
if (s === 'aa') {
return null
}
return (
<Router>
<Route component={MyCpt}></Route>
</Router>
)
}
function MyCpt() {
const s = useS()
return <h1>{s}</h1>
}
function useS() {
const [state, setState] = useState('aa')
useEffect(() => {
subscribe(setState)
}, [])
return state
}
const listeners = []
function subscribe(cb) {
listeners.push(cb)
}
setTimeout(() => {
listeners.forEach((cb) => {
cb('bb')
})
}, 2000)
Here is totally runnable code, simply yet wired. As you can see, MyCpt will render the state from useS will eventually be bb (after 2 seconds). However, it will render aa no matter how long you wait. if you comment out return null inside the if (s === 'aa'), it will render bb as expect
What the hack is happening?