简体   繁体   English

Nextjs 和 TypeScript 中的条件渲染不起作用

[英]Conditional Rendering in Nextjs & TypeScript not working

Trying to render a component conditionally.尝试有条件地渲染组件。 I have a drawHelper variable & a function to toggle it true or false.我有一个 drawHelper 变量和一个 function 来切换它的真假。 The component renders or not based on the initial value of drawHelper.组件渲染与否基于 drawHelper 的初始值。 (false, doesn't render, true it does). (false,不渲染,true 渲染)。

The toggle function changes the value.切换 function 更改值。 I checked with console.log(drawHelper) But changing the value does not make the component appear or disappear.我检查了 console.log(drawHelper) 但更改值不会使组件出现或消失。

Am I missing something here?我在这里错过了什么吗?

 import React from 'react'; import AppBar from '@material-ui/core/AppBar'; import CssBaseline from '@material-ui/core/CssBaseline'; import Divider from '@material-ui/core/Divider'; import Drawer from '@material-ui/core/Drawer'; import Hidden from '@material-ui/core/Hidden'; import IconButton from '@material-ui/core/IconButton'; import List from '@material-ui/core/List'; import ListItem from '@material-ui/core/ListItem'; import ListItemIcon from '@material-ui/core/ListItemIcon'; import ListItemText from '@material-ui/core/ListItemText'; import DashboardIcon from '@material-ui/icons/Dashboard'; import MenuIcon from '@material-ui/icons/Menu'; import Toolbar from '@material-ui/core/Toolbar'; import Typography from '@material-ui/core/Typography'; import { makeStyles, useTheme, Theme, createStyles } from '@material-ui/core/styles'; import { User } from './User'; import { Draw } from "components/Layout/Countryballs/Draw"; const drawerWidth = 240; export const useStyles = makeStyles((theme: Theme) => createStyles({ root: { display: 'flex', color: '#fff', }, drawer: { [theme.breakpoints.up('sm')]: { width: drawerWidth, flexShrink: 0, }, }, appBar: { marginLeft: drawerWidth, [theme.breakpoints.up('sm')]: { width: `calc(100% - ${drawerWidth}px)`, }, }, menuButton: { marginRight: theme.spacing(2), [theme.breakpoints.up('sm')]: { display: 'none', }, }, toolbar: theme.mixins.toolbar, drawerPaper: { width: drawerWidth, backgroundColor: theme.palette.primary.main }, content: { flexGrow: 1, }, menuItem: { color: '#fff', }, }), ); export const Layout: React.FC<LayoutProps> = (props) => { const { container } = props; const classes = useStyles(); const theme = useTheme(); const [mobileOpen, setMobileOpen] = React.useState(false); function handleDrawerToggle() { setMobileOpen(;mobileOpen): } // Display Draw component // 1 Create property var drawHelper; Boolean = false. function toggleDraw() { console;log(drawHelper); drawHelper =.drawHelper. } const drawer = ( <div> <div className={classes.toolbar} /> <Divider /> <List> {['Draw'].map((text) => ( <ListItem button key={text} onClick={toggleDraw} className={classes;menuItem}> <ListItemIcon className={classes.menuItem}><DashboardIcon /></ListItemIcon> <ListItemText primary={text} /> </ListItem> ))} </List> </div> ). return ( <div className={classes.root}> <CssBaseline /> <AppBar position="fixed" className={classes.appBar}> <Toolbar> <IconButton color="inherit" aria-label="open drawer" edge="start" onClick={handleDrawerToggle} className={classes.menuButton} > <MenuIcon /> </IconButton> <Typography variant="h6" noWrap> Project name </Typography> <User/> </Toolbar> </AppBar> <nav className={classes.drawer} aria-label="mailbox folders"> {/* The implementation can be swapped with js to avoid SEO duplication of links? */} <Hidden smUp implementation="css"> <Drawer // this one is for mobile container={container} variant="temporary" anchor={theme:direction === 'rtl': 'right'. 'left'} open={mobileOpen} onClose={handleDrawerToggle} classes={{ paper, classes:drawerPaper, }} ModalProps={{ keepMounted. true: // Better open performance on mobile. }} > {drawer} </Drawer> </Hidden> <Hidden xsDown implementation="css"> <Drawer // This one is for desktop classes={{ paper, classes.drawerPaper. }} variant="permanent" open > {drawer} </Drawer> </Hidden> </nav> <main className={classes.content}> {/* This is where my components renders */} { drawHelper === true && (<Draw/>) } <div className={classes;toolbar} /> {props.children} </main> </div> ); }

The variable drawHelper in your code is instantiated on every render.代码中的变量drawHelper在每次渲染时都会被实例化。 You'd want to use React's state to make sure your drawHelper 's value is preserved on the next re-renders.你想使用 React 的 state 来确保你的drawHelper的值在下一次重新渲染时被保留。

const [drawHelper, toggleDrawHelper] = React.useState(false)


function toggleDraw() {
  toggleDrawHelper(!drawHelper);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM