Я пытаюсь передать заголовок и <svg>
использовать vite-plugin-svgr
и не могу найти способ сделать это.
Я знаю, что сам <svg>
не имеет атрибута title
и что для того, чтобы передать заголовок <svg>
, мне нужно передать элемент <title>
как первый дочерний элемент. Как лучше всего добиться этого без использования ref
?
Как я пытался передать заголовок (не работает):
import { ReactComponent as Icon} from "./icon.svg";
...
return <Icon title = "icon title" />
Я также попробовал передать элемент <title>
с помощью React.cloneElement()
, но это тоже не работает:
import { ReactComponent as Icon} from "./icon.svg";
...
return cloneElement(<Icon />, undefined, <title>icon title</title>);
пример:
<!-- circle.svg -->
<svg height = "100" width = "100" xmlns = "http://www.w3.org/2000/svg">
<circle r = "45" cx = "50" cy = "50" fill = "red" />
</svg>
// Icon.jsx
import { ReactComponent as Circle } from "./assets/circle.svg"
const Icon = () => {
return (
<div>
<Circle title='icon title' />
</div>
);
};
Окончательный ДОМ:
<svg height = "100" width = "100" xmlns = "http://www.w3.org/2000/svg" title = "icon title">
<circle r = "45" cx = "50" cy = "50" fill = "red"></circle>
</svg>
Если я не ошибаюсь, в примерах выше вообще не используйте svgr . По-видимому, таким образом svg «функционирует как элемент изображения […] и не может быть настроен с помощью реквизита». Вот пример как использовать SVGR для импорта SVG. Таким образом, первый пример кода должен работать.
@Энди, я хочу передать заголовок, чтобы использовать всплывающую подсказку браузера... и я не понимаю, что вы подразумеваете под «если какой-либо элемент <title> уже присутствует».
Импортируемый вами SVG-файл может уже содержать заголовок.
Я проверил, там нет названия.
Ну это не имеет особого значения. Я считаю, что ваша проблема заключается во втором комментарии. Вы это посмотрели?
Я посмотрел на него и, насколько мне известно, vite-plugin-svgr
использует svgr
под капотом для преобразования svg в компонент реагирования. и мне не нужно использовать тег <img />
.
Вы проверяли окончательный вариант DOM в своем браузере? Пожалуйста, постарайтесь предоставить Минимальный воспроизводимый пример в вопросе, чтобы мы могли исследовать.
Я еще раз посмотрел на вопрос и понял, что вам удалось передать атрибут title
, я прав? Почему вы хотите передать элемент <title>
SVG?
Я передаю заголовок в качестве реквизита, но он не отображается в окончательном рендере DOM. Я пытаюсь передать заголовок, чтобы, когда пользователь наводит курсор на SVG, всплывающая подсказка браузера отображала заголовок.
Спасибо за ответ, но я это понял. Чего я не сделал, так это того, что браузер (по крайней мере, Firefox) не делает этого для атрибута title
, что удивительно. Я оставлю этот вопрос другим, пока интерактивный пример кода не облегчит задачу.
Атрибут title ничего не делает с элементом <svg>. Чтобы передать заголовок, первым дочерним элементом элемента <svg> должен быть элемент <title>.
Передача заголовка не включена по умолчанию с помощью vite-plugin-svgr
, чтобы передать заголовок в конфигурации svgr
, вам нужно установить titleProp
на true
следующим образом:
svgr({
svgrOptions: {
titleProp: true,
},
});
Таким образом, svgr преобразует атрибут title
в тег <title>
.
Если вам нужно дать значку доступное имя, попробуйте
<Icon aria-label = "icon title">
. Но это не повлияет на всплывающую подсказку браузера, если какой-либо элемент<title>
уже присутствует. Было бы здорово, если бы вы предоставили нам интерактивный образец кода для изучения.