Передача заголовка в svg с помощью vite-plugin-svgr

Я пытаюсь передать заголовок и <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>

Если вам нужно дать значку доступное имя, попробуйте <Icon aria-label = "icon title">. Но это не повлияет на всплывающую подсказку браузера, если какой-либо элемент <title> уже присутствует. Было бы здорово, если бы вы предоставили нам интерактивный образец кода для изучения.

Andy 15.04.2024 10:53

@Энди, я хочу передать заголовок, чтобы использовать всплывающую подсказку браузера... и я не понимаю, что вы подразумеваете под «если какой-либо элемент <title> уже присутствует».

netanel 16.04.2024 11:49

Импортируемый вами SVG-файл может уже содержать заголовок.

Andy 16.04.2024 13:53

Я проверил, там нет названия.

netanel 16.04.2024 14:43

Ну это не имеет особого значения. Я считаю, что ваша проблема заключается во втором комментарии. Вы это посмотрели?

Andy 16.04.2024 15:44

Я посмотрел на него и, насколько мне известно, vite-plugin-svgr использует svgr под капотом для преобразования svg в компонент реагирования. и мне не нужно использовать тег <img />.

netanel 16.04.2024 15:51

Вы проверяли окончательный вариант DOM в своем браузере? Пожалуйста, постарайтесь предоставить Минимальный воспроизводимый пример в вопросе, чтобы мы могли исследовать.

Andy 17.04.2024 09:26

Я еще раз посмотрел на вопрос и понял, что вам удалось передать атрибут title, я прав? Почему вы хотите передать элемент <title> SVG?

Andy 18.04.2024 16:10

Я передаю заголовок в качестве реквизита, но он не отображается в окончательном рендере DOM. Я пытаюсь передать заголовок, чтобы, когда пользователь наводит курсор на SVG, всплывающая подсказка браузера отображала заголовок.

netanel 18.04.2024 23:01

Спасибо за ответ, но я это понял. Чего я не сделал, так это того, что браузер (по крайней мере, Firefox) не делает этого для атрибута title, что удивительно. Я оставлю этот вопрос другим, пока интерактивный пример кода не облегчит задачу.

Andy 19.04.2024 12:41

Атрибут title ничего не делает с элементом <svg>. Чтобы передать заголовок, первым дочерним элементом элемента <svg> должен быть элемент <title>.

netanel 19.04.2024 16:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
12
121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Передача заголовка не включена по умолчанию с помощью vite-plugin-svgr, чтобы передать заголовок в конфигурации svgr, вам нужно установить titleProp на true следующим образом:

svgr({
  svgrOptions: {
    titleProp: true,
  },
});

Таким образом, svgr преобразует атрибут title в тег <title>.

Другие вопросы по теме