【问题标题】:Converting class to function React Error invalid hook call将类转换为函数 React Error 无效的钩子调用
【发布时间】:2020-09-30 17:22:08
【问题描述】:

我一直在将我的类组件转换为函数,但我遇到了与我的导出默认值有关的这个钩子错误。我确定这很简单,但我找不到我正在寻找的答案。

这是导致错误的代码:

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))

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

【问题讨论】:

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


    【解决方案1】:

    主要问题是你如何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
    }
    

    【讨论】:

    • 那行得通我觉得我以前试过这个,但我不够彻底。另外,我肯定会采纳您关于将样式移到自己的文件中的建议,谢谢 :)
    • @Erykj97 太棒了,乐于助人!
    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 2023-02-11
    • 2020-11-29
    • 2021-05-08
    • 2020-02-08
    • 2020-02-20
    • 1970-01-01
    相关资源
    最近更新 更多