TypeError:无法读取未定义的属性“状态”-函数

时间:2019-09-17 02:14:11

标签: reactjs components setstate

    import React from 'react';
import { makeStyles, useTheme } from '@material-ui/core/styles';
import Card from '@material-ui/core/Card';
import CardContent from '@material-ui/core/CardContent';
import CardMedia from '@material-ui/core/CardMedia';
import IconButton from '@material-ui/core/IconButton';
import Typography from '@material-ui/core/Typography';
import SkipPreviousIcon from '@material-ui/icons/SkipPrevious';
import PlayArrowIcon from '@material-ui/icons/PlayArrow';
import SkipNextIcon from '@material-ui/icons/SkipNext';

const useStyles = makeStyles(theme => ({
  card: { 
    position: 'fixed',
    zIndex:999,
    bottom: theme.spacing(2),
    left: theme.spacing(2),
    display: 'flex',
    maxWidth:'300px',
  },
  details: {
    display: 'flex',
    flexDirection: 'column',
  },
  content: {
    flex: '1 0 auto',
  },
  cover: {
    width: 151,
  },
  controls: {
    display: 'none',
    alignItems: 'center',
    paddingLeft: theme.spacing(1),
    paddingBottom: theme.spacing(1),
  },
  playIcon: {
    height: 38,
    width: 38,
  },
}));

export default function MediaControlCard() {
  const classes = useStyles();
  const theme = useTheme();
  const state = {
    count: 0,
  }

  const componentDidMount = () => {
    this.interval = setInterval(() => {
      this.setState(({ count }) => ({ count: count + 1 }));
    }, 1000);
  }
  const componentWillUnmount = () => {
    clearInterval(this.interval);
  }
  return (
    <Card className={classes.card}>
      <CardMedia
        className={classes.cover}
        image="//storage.googleapis.com/radiomediapodcast/budcast/BudCast.png"
        title="Live from space album cover"
      />
      <div className={classes.details}>
        <CardContent className={classes.content}>
          <Typography id="Now_Playing_Title" component="h5" variant="h5">
            Live From Space  {this.state.count}
          </Typography>
          <Typography id="Now_Playing_Artist" variant="subtitle1" color="textSecondary">
            Mac Miller
          </Typography>
        </CardContent>
        <div className={classes.controls}>
          <IconButton aria-label="previous">
            {theme.direction === 'rtl' ? <SkipNextIcon /> : <SkipPreviousIcon />}
          </IconButton>
          <IconButton aria-label="play/pause">
            <PlayArrowIcon className={classes.playIcon} />
          </IconButton>
          <IconButton aria-label="next">
            {theme.direction === 'rtl' ? <SkipPreviousIcon /> : <SkipNextIcon />}
          </IconButton>
        </div>
      </div>

    </Card>
  );
}

我遇到以下错误TypeError: Cannot read property 'state' of undefined

2 个答案:

答案 0 :(得分:1)

您不能使用生命周期方法或功能组件中的状态。

考虑使用类组件。

export default class MediaControlCard {
  const classes = useStyles();
  const theme = useTheme();

  constructor(props) {
    this.state = {
      count: 0,
    }
  }

  componentDidMount() { /*...*/ }
  componentWillUnmount() { /*...*/ }

  render() {
    return ( /*...*/ )
  }
}

或使用挂钩。 https://reactjs.org/docs/hooks-intro.html

export default function MediaControlCard() {
  const classes = useStyles();
  const theme = useTheme();
  const [count, setCount] = React.useState(0);

  let interval = null;
  React.useEffect(() => {
    interval = setInterval(() => {
      setCount(count + 1);
    }, 1000);

    return () => clearInterval(interval);
  });

  return (/*...*/)
}

答案 1 :(得分:0)

您正在将功能组件与生命周期方法一起使用。生命周期方法只能与类组件一起使用,因此将功能组件转换为类组件将对您有用。 与以下示例一样声明您的组件

  class DemoClass extends React.Component {
  constructor(props) {
    this.state = {
      count: 0,
    }
  }

  componentDidMount() { /*...*/ }
  componentWillUnmount() { /*...*/ }

  render() {
    return ( /*...*/ )
  }
}
export default DemoClass