Создание вкладки Material-UI с вкладками изображений вместо текстовых меток

#reactjs #material-ui

#reactjs #material-ui

Вопрос:

Я пытаюсь использовать компонент Material-ui tab для вертикальной вкладки. Проблема, с которой я сталкиваюсь, заключается в том, как использовать изображение, отличное от предопределенных значков, вместо текстовой метки?

Я попытался использовать компонент Avatar, разбив вкладку следующим образом:

     <Tab label="Item Two" {...a11yProps(1)}>
      <Avatar alt="test avatar" src="/logo192.png" />
    </Tab>
  

Аватар работает, когда я помещаю его на панель вкладок, поэтому я знаю, что он правильный и правильно указывает на изображение, но когда я помещаю его на вкладку, как показано выше, я не получаю изображения, только ярлык «Пункт два». Возможно ли создать вкладку с изображением, используя ButtonBase? Я не смог найти ни одного примера использования ButtonBase. Или мне нужно отправить запрос на функцию и пока поискать в другом месте?

Комментарии:

1. Чего вы пытаетесь достичь? Вы не хотите отображать изображение над меткой, например, значок? Или вы хотите, чтобы изображение было фоном вкладки?

2. Я просто хочу добавить к приведенным ниже ответам; решение Giovanni и 3limin4t0r работает с использованием стандартного HTML-изображения вместо компонента аватара Material-UI, если вам нужен более прямой контроль над изображением. Мой первоначальный вопрос ссылался на аватар, потому что он был частью Material-UI, но изображение на самом деле работает лучше для меня, потому что я мог бы увеличить его для усталых, старых глаз. Оба являются отличными решениями для изображений в компоненте Material-UI tab.

Ответ №1:

Я не совсем уверен, что это то, о чем вы просите, но вы можете передавать свои собственные изображения через Tab icon свойство, чтобы использовать их в качестве значка. Они не обязательно должны быть значками Material-UI.

 <Tab icon={<Avatar alt="test avatar" src="/logo192.png" />} />
  

 const {Tabs, Tab, Avatar} = MaterialUI;

function Demo() {
  const [selected, setSelected] = React.useState(0);

  return (
    <div style={{display: "flex"}}>
      <Tabs
        orientation="vertical"
        value={selected}
        onChange={(_, selected) => setSelected(selected)}
      >
        <Tab icon={<Avatar />} />
        <Tab label="second" />
      </Tabs>
      <div></div>
    </div>
  );
}

ReactDOM.render(<Demo />, document.querySelector("#root"));  
 <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700amp;display=swap" />
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material Icons" />
<script src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/@material-ui/core@4/umd/material-ui.production.min.js"></script>
<div id="root"></div>  

Комментарии:

1. Это также отлично работает. Спасибо, 3limin4t0r. Еще одно нестандартное решение для документации, которое можно поместить в мой набор инструментов для решения этой проблемы и, возможно, в других местах.

Ответ №2:

Чао, у вас есть эта проблема, потому что Tab не поддерживает children . Вдокументах Material UI говорится:

Этот реквизит (дочерние элементы) не поддерживается. Используйте компонент prop, если вам нужно изменить структуру дочерних элементов.

Поэтому вам нужно использовать component реквизиты, например, таким образом:

 <Tab
   label="Item One"
   {...a11yProps(0)}
   value={value}
   component={() => (
      <Button onClick={() => setValue(0)}> // this button to select the Tab (the first one in this case) when you click the Avatar 
         <Avatar src="<an image>" />   // Avatar here
      </Button>
   )}
/>
  

Вот пример codesandbox.

Комментарии:

1. Спасибо, Джованни. Это не только решает мою проблему и дает мне изображения, которые я хочу для своих вкладок, это показывает, как выйти за рамки документированного поля и проявить больше творчества в других компонентах. Использование component = может работать не во всех случаях, но наличие этого в моем наборе инструментов поможет.

2. Нет проблем @Dale. Рад добавить что-то в ваш набор инструментов 🙂