#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. Рад добавить что-то в ваш набор инструментов 🙂