【问题标题】:Failed prop type: Material-UI: Either `children`, `image`, `src` or `component` prop must be specified in ForwardRef(CardMedia)失败的道具类型:Material-UI:必须在 ForwardRef(CardMedia) 中指定 `children`、`image`、`src` 或 `component` 道具
【发布时间】:2020-10-12 13:48:23
【问题描述】:

每当我试图在我的页面上发布新的尖叫声时。我没有收到卡片的图片、标题和内容。我需要重新加载才能获得它。

这是说失败的道具类型意味着在发布尖叫后我没有从道具类型中获得价值,但在重新加载后,一切似乎都很好。我不知道出了什么问题。请看我的代码。

这是我的 Screams.js,我正在展示我的尖叫声

Scream.js

    const styles = {
      card: {
        position: "relative",
        display: "flex",
        marginBottom: 20,
      },
      image: {
        minWidth: 150,
      },
      content: {
        padding: 25,
        objectFit: "cover",
      },
    };
    class Scream extends Component {
      render() {
        dayjs.extend(relativeTime);
        const {
          classes,
          scream: {
            body,
            createdAt,
            userImage,
            userHandle,
            screamId,
            likeCount,
            commentCount,
          },
          user: {
            authenticated,
            credentials: { handle },
          },
        } = this.props;
    
        const deleteButton =
          authenticated && userHandle === handle ? (
            <DeleteScream screamId={screamId} />
          ) : null;
    
        const likeButton = !authenticated ? (
          <Link to="/login">
            <MyButton tip="Like">
              <FavoriteBorder color="primary" />
            </MyButton>
          </Link>
        ) : this.likedScream() ? (
          <MyButton tip="Undo like" onClick={this.unlikeScream}>
            <FavoriteIcon color="primary" />
          </MyButton>
        ) : (
          <MyButton tip="Like" onClick={this.likeScream}>
            <FavoriteBorder color="primary" />
          </MyButton>
        );
    
        return (
          <Card className={classes.card}>
            <CardMedia
              image={userImage}
              title="Profile Image"
              className={classes.image}
            />
            <CardContent className={classes.content}>
              <Typography variant="h5" component={Link} to={`/users/${userHandle}`}>
                {userHandle}
              </Typography>
              {deleteButton}
              <Typography variant="body2" color="textSecondary">
                {dayjs(createdAt).fromNow()}
              </Typography>
              <Typography variant="body1">{body}</Typography>
              {likeButton}
              <span> {likeCount} Likes </span>
              <MyButton tip="comments">
                <ChatIcon color="primary" />
              </MyButton>
              <span> {commentCount} Comments </span>
            </CardContent>
          </Card>
        );
      }
    }
    
    Scream.propTypes = {
      likeScream: PropTypes.func.isRequired,
      unlikeScream: PropTypes.func.isRequired,
      user: PropTypes.object.isRequired,
      scream: PropTypes.object.isRequired,
      classes: PropTypes.object.isRequired,
    };
    
    const mapStateToprops = (state) => ({
      user: state.user,
    });
    
    const mapActionToProps = {
      likeScream,
      unlikeScream,
    };
    
    export default connect(
      mapStateToprops,
      mapActionToProps
    )(withStyles(styles)(Scream));

如您所见,我在道具中有卡片的 userImage、userHandle 和 body,它正在我的页面上显示。

但是在发布了一个新的 Scream 之后,除非重新加载它,否则我没有得到新 Scream 的图像、用户句柄和正文。

PostScream.js

class PostScream extends Component {
    state = {
        open: false,
        body: "",
        errors: {}
    }

    componentWillReceiveProps(nextProps) {
        if(nextProps.UI.errors) {
            this.setState({
                errors: nextProps.UI.errors
            });
        }
        if(!nextProps.UI.errors && !nextProps.UI.loading) {
            this.setState({
                body: "",
                open: false,
                errors: {}
            })
        }
    }

    handleOpen = () => {
        this.setState({ open: true })
    };

    handleClose = () => {
        this.props.clearErrors();
        this.setState({ open: false, errors: {} });
    };

    handleChange = (event) => {
        this.setState({ [event.target.name]: event.target.value })
    }

    handleSubmit = (event) => {
        event.preventDefault();
        this.props.postScream({ body: this.state.body })
    }

    render() {
        const { errors } = this.state;
        const { classes, UI: { loading }} = this.props;
        return (
            <Fragment>
                <MyButton onClick= { this.handleOpen } tip="Post a Scream!">
                    <AddIcon />
                </MyButton>

                <Dialog
                    open= { this.state.open } 
                    onClose= { this.handleClose }
                    fullWidth
                    maxWidth = "sm"
                >
                    <MyButton
                        tip="Close"
                        onClick={this.handleClose}
                        tipClassName={classes.closeButton}
                    >
                        <CloseIcon />
                    </MyButton>

                    <DialogTitle> Post a new Scream </DialogTitle>
                    <DialogContent>
                        <form onSubmit= { this.handleSubmit }>
                            <TextField
                                name="body"
                                type="text"
                                label="SCREAM!"
                                multiline
                                rows="3"
                                placeholder= "What's on your mind!"
                                error={ errors.body ? true: false }
                                helperText={ errors.body }
                                className={classes.TextField}
                                onChange={ this.handleChange }
                                fullWidth
                            />

                            <Button 
                                type="submit"
                                variant="contained"
                                color="primary"
                                className={classes.submitButton}
                                disabled={ loading }
                            >   
                                Submit
                                {loading && ( 
                                    <CircularProgress size={30} className={ classes.progressSpinner } />
                                )}
                            </Button>
                        </form>
                    </DialogContent>
                </Dialog>
            </Fragment>
        )
    }
}

PostScream.propTypes = {
    postScream: PropTypes.func.isRequired,
    clearErrors: PropTypes.func.isRequired,
    UI: PropTypes.object.isRequired
}

const mapStateToProps = (state) => ({
    UI: state.UI
});

export default connect(
    mapStateToProps,
    { postScream, clearErrors }
)(withStyles(styles)(PostScream));

发布新的尖叫后,我得到这样的尖叫:-

【问题讨论】:

    标签: reactjs material-ui


    【解决方案1】:

    我遇到了同样的问题,我可以通过将 component='img' 添加到我的 CardMedia 来解决它。

    <CardMedia
    image={userImage}
    title="Profile Image"
    className={classes.image}
    component='img'
    />
    

    【讨论】:

      【解决方案2】:

      将组件指定为 img “隐藏”图像,因为 CardMedia 是一个 div,并且您的 css 应用于该 div。将 component = "div" 添加到 CardMedia。

      <CardMedia
      image={userImage}
      title="Profile Image"
      className={classes.image}
      component='div'
      />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-05
        • 1970-01-01
        • 2017-04-07
        • 2019-12-18
        • 1970-01-01
        • 2019-05-21
        • 2018-03-23
        • 2020-01-14
        相关资源
        最近更新 更多