Пользовательский компонент не принимает стили, реагировать на материалы ui

У меня есть Avatar Component, который я создал, это очень простой компонент, который отображает значок и некоторый текст. Это код компонента.

import React from "react";
import PropTypes from "prop-types";
import { withStyles, Avatar, Typography } from "@material-ui/core";
import avatar_placeholder from "../images/avatar_man.svg";

const styles = theme => ({
  row: {
    display: "flex",
    flexDirection: "row",
    alignItems: "center"
  },
  avatar: {
    width: 50,
    height: 50,
    marginRight: "2%"
  },
  subtitle: {
    opacity: 0.5
  }
});

const customAvatar = props => {
  const { classes, name, subtitle } = props;

  return (
    <div className={classes.row}>
      <Avatar alt={name} src={avatar_placeholder} />
      <div>
        <Typography variant="title">{name}</Typography>
        <Typography variant="body2" className={classes.subtitle}>
          {subtitle}
        </Typography>
      </div>
    </div>
  );
};

customAvatar.propTypes = {
  classes: PropTypes.object.isRequired,
  name: PropTypes.string.isRequired,
  image: PropTypes.string,
  subtitle: PropTypes.string
};

customAvatar.defaultProps = {
  name: "John Doe",
  subtitle: ""
};

export default withStyles(styles)(customAvatar);

Компонент Avatar является дочерним компонентом родительского элемента, а следующий код показывает, как компонент Avatar используется в родительском компоненте.

import React from "react";
import PropTypes from "prop-types";
import {
  withStyles,
  Card,
  CardContent
} from "@material-ui/core";
import AvatarProfile from "./AvatarProfile";

const styles = {
  cardContent: {
  },
  AvatarDiv: {
    backgroundColor: "red"
  }
};

const ItemCardWithCheckbox = props => {
  const { classes, name, subtitle } = props;

  return (
    <Card>
      <CardContent className={classes.cardContent}>
        <AvatarProfile
          name={name}
          subtitle={subtitle}
          className={classes.AvatarDiv}
        />
      </CardContent>
    </Card>
  );
};

ItemCardWithCheckbox.propTypes = {
  classes: PropTypes.object.isRequired
};

export default withStyles(styles)(ItemCardWithCheckbox);

Как видите, я пытаюсь применить стиль AvatarDiv для компонента Avatar, т.е. я бы хотел, чтобы backgroundColor компонента Avatar был красным, но этого не происходит, я использую Пользовательский интерфейс материалов. Я предполагаю, что либо свойства стиля не передаются должным образом компоненту Avatar, либо я неправильно применяю стиль.


person Jude Fernandes    schedule 27.08.2018    source источник
comment
Откуда classes.AvatarDiv? Я вижу, это свойство объекта styles ..   -  person Arup Rakshit    schedule 27.08.2018
comment
поделитесь своим компонентом AvatarProfile.   -  person Sakhi Mansoor    schedule 27.08.2018
comment
@SakhiMansoor компонент customAvatar - это AvatarProfile   -  person Jude Fernandes    schedule 27.08.2018
comment
@ArupRakshit, вот и все, они style object - это то, что используется для стилизации всего в этом компоненте, я пропустил стили для classes.cardContent для краткости, но все стили, написанные внутри cardContent, применяются правильно.   -  person Jude Fernandes    schedule 27.08.2018


Ответы (2)


Вы передаете AvatarDiv как свойство className. Вы не применяете класс здесь, поскольку AvatarDiv является настраиваемым компонентом.

  <AvatarProfile
          name={name}
          subtitle={subtitle}
          className={classes.AvatarDiv}

Вы должны передать его как свойство и использовать его для применения стиля в дочернем компоненте. Я сделал что-то подобное в codeandbox, где я изменил цвет кнопки на оранжевый и передал его как опору дочернему компоненту. Пожалуйста, проверьте - https://codesandbox.io/s/lyxz92m7nl

person Vijay Venugopal Menon    schedule 27.08.2018

Я сделал его более читабельным и умным компонентом и использовал единственный компонент stlyles. Вот рабочие коды и ящик: https://codesandbox.io/s/ll507vypy7

person Sakhi Mansoor    schedule 27.08.2018