The problem is the title.
I am using:
- Typescript Node
- Typescript React
I am trying to pass a setPage
from useState to the subroutine called subRenderSwitch
which decides which form to display, while renderSwitch
decides which navigation bar to display.
Main App
function App() {
let [page,setPage] = useState("")
let firstRender = useRef(true);
const subRenderSwitch = (str: any) => {
switch (str) {
case 'Login':
return <Landing setPage={setPage} />
case 'Register':
return <Register />
case 'Update Password':
return <UpdatePassword />
default:
return <Landing />
}
}
const renderSwitch = (str: any) => {
switch(str) {
case 'Not Logged':
return {head: <Nav setPage={setPage} />, body: subRenderSwitch(page)}
case 'Logged':
return {head: '', body: ''}
default:
return {head: <Nav setPage={setPage} />, body: subRenderSwitch(page)}
}
}
return (
<div className="App">
{renderSwitch(page).head}
{renderSwitch(page).body}
</div>
);
}
export default App;
export default function Nav ({ setPage }: any) {
let [nav,setNav] = useState('')
const clickHandler = (e: any, str: any) => {
e.preventDefault()
const sendData = async () => {
...
}
sendData().then(res => setNav(res.data.value))
return
}
useEffect(() => {
setPage(nav) // NO ERROR HERE
},[nav,setPage])
const renderSwitch = () => {
switch (nav) {
...
}
}
return (
<div id='navBar'>
{renderSwitch()}
</div>
)
}
export default function Landing ( { setPage }: any ) {
let [message,setMessage] = useState("Enter details to Login")
let [data,setData] = useState({email: '',pass: ''})
let [nav,setNav] = useState('')
let firstRender = useRef(true)
const submitHandler = (e: any) => {
e.preventDefault()
const sendData = async () => {
...
}
sendData().then(res => {
if (res.data != null) {
setMessage("User Found")
setNav('Login')
}
else {
setMessage("User Not Found")
}
})
return
}
useEffect(() => {
if (firstRender.current) {
firstRender.current = false
return
}
setPage(nav) // ERROR CAUSED HERE
},[nav,setPage])
return (
<div id='landingPage'>
...
</div>
)
}
Please know that I am still a newbie and therefore the above may not follow any best practices. Additionally, I will accept any critique that may improve my code.
I can successfully pass setPage to renderSwitch
without any trouble, but for subRenderSwitch
I get setPage
is not a function.
What could be the cause for this error?