如何使用makeStyles设置组件样式并在Material UI中仍然具有生命周期方法?

发布于 2021-01-31 22:47:44

每当我尝试使用makeStyles()具有生命周期方法的组件时,都会出现以下错误:

无效的挂接调用。挂钩只能在功能组件的主体内部调用。可能由于以下原因之一而发生:

  1. 您可能使用了不匹配的React和渲染器版本(例如React DOM)
  2. 您可能正在违反挂钩规则
  3. 您可能在同一应用中拥有多个React副本

下面是一个产生此错误的代码的小示例。其他示例也将类分配给子项。我在MUI的文档中找不到任何显示其他使用方式makeStyles并可以使用生命周期方法的功能。

    import React, { Component } from 'react';
    import { Redirect } from 'react-router-dom';

    import { Container, makeStyles } from '@material-ui/core';

    import LogoButtonCard from '../molecules/Cards/LogoButtonCard';

    const useStyles = makeStyles(theme => ({
      root: {
        display: 'flex',
        alignItems: 'center',
        justifyContent: 'center',
      },
    }));

    const classes = useStyles();

    class Welcome extends Component {
      render() {
        if (this.props.auth.isAuthenticated()) {
          return <Redirect to="/" />;
        }
        return (
          <Container maxWidth={false} className={classes.root}>
            <LogoButtonCard
              buttonText="Enter"
              headerText="Welcome to PlatformX"
              buttonAction={this.props.auth.login}
            />
          </Container>
        );
      }
    }

    export default Welcome;
关注者
0
被浏览
67
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

    我们落得这样做使用类组件和创建的功能组件被停止,利用useEffect()挂钩API的生命周期方法。这使您仍然可以makeStyles()使用生命周期方法,而无需增加制作高阶组件的复杂性。这要简单得多。

    例:

    import React, { useEffect, useState } from 'react';
    import axios from 'axios';
    import { Redirect } from 'react-router-dom';
    
    import { Container, makeStyles } from '@material-ui/core';
    
    import LogoButtonCard from '../molecules/Cards/LogoButtonCard';
    
    const useStyles = makeStyles(theme => ({
      root: {
        display: 'flex',
        alignItems: 'center',
        justifyContent: 'center',
        margin: theme.spacing(1)
      },
      highlight: {
        backgroundColor: 'red',
      }
    }));
    
    // Highlight is a bool
    const Welcome = ({highlight}) => { 
      const [userName, setUserName] = useState('');
      const [isAuthenticated, setIsAuthenticated] = useState(true);
      const classes = useStyles();
    
      useEffect(() => {
        axios.get('example.com/api/username/12')
             .then(res => setUserName(res.userName));
      }, []);
    
      if (!isAuthenticated()) {
        return <Redirect to="/" />;
      }
      return (
        <Container maxWidth={false} className={highlight ? classes.highlight : classes.root}>
          <LogoButtonCard
            buttonText="Enter"
            headerText={isAuthenticated && `Welcome, ${userName}`}
            buttonAction={login}
          />
       </Container>
       );
      }
    }
    
    export default Welcome;
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看