将类转换为函数React Error无效的钩子调用

时间:2020-09-30 17:22:08

标签: javascript reactjs redux material-ui react-hooks

我一直在将类组件转换为函数,但由于发生钩子错误,我无法使用导出默认值。我敢肯定这很简单,但是找不到所需的答案。

Error screenshot

这是导致错误的代码:

import React from 'react'
import {AppBar, Toolbar, Button, Typography, makeStyles} from '@material-ui/core'
import { connect } from 'react-redux'
import { Link } from 'react-router-dom'
import Menu from './Menu'

const useStyles = makeStyles((theme) => ({
    header: {
        backgroundColor: "#1d3834",

    },
    root: {
      flexGrow: 1,
    },
    menuButton: {
      marginRight: theme.spacing(2),
    },
    title: {
      flexGrow: 1,
    },
  }))

function Header(props) {
    const classes = useStyles()

    const renderContent = () => {
        switch (props.auth) {
            case null:
                return
            case false:
                return (                  
                    <Button color="inherit" href="/signin">Sign In</Button>
                )
            default: 
                return  (
                    <Button color="inherit" href="/api/logout">Sign Out</Button>
                )
        }
    }
    
     return(
        <div className={classes.root}>
        <AppBar position="static" className={classes.header}>
            <Toolbar>
            <Menu/>
            <Typography variant="h6" className={classes.title} >
            <Link 
                to={props.auth ? '/items' : '/'} 
                className="left brand-logo"
            >
                
            </Link>
            </Typography>
                {renderContent()}
            </Toolbar>
        </AppBar>   
        </div>    
     );
    
}

function mapStateToProps({auth}) {
    return{ auth }
}

export default connect(mapStateToProps)(makeStyles(useStyles) (Header))

我希望以前有人遇到过类似的问题,并且能够给我一些反馈,谢谢:)

1 个答案:

答案 0 :(得分:0)

主要问题是如何export您的组件。请尝试以下操作:

export default connect(mapStateToProps)(Header)

您确实不需要在那里的makeStyles(useStyles)部分。


+1条建议-与问题无关:

该建议与问题本身无关,只是我希望使用 Material-UI 在我的代码存储库中组织makeStyles内容的一个小改进。

通常,我创建一个styles.tsx,在您的情况下如下所示,放置在您的组件文件旁边:

import { makeStyles } from "@material-ui/core"

const useStyles = makeStyles((theme) => ({
    header: {
        backgroundColor: "#1d3834",
    },
    root: {
      flexGrow: 1,
    },
    menuButton: {
      marginRight: theme.spacing(2),
    },
    title: {
      flexGrow: 1,
    },
}))

export default useStyles

然后在组件中import如下:

import useStyles from "./styles"

其用法类似于组件中的用法:

function Header(props) {
    const classes = useStyles()

    // ... rest of your component
}