Пока не представляется возможным управлять элементами SVG, которые хранятся в отдельном файле. Я подумал, что, возможно, с модулями WebPack и npm это станет возможным, но я не могу найти простого или удобного решения. Можно ли импортировать такой элемент?
import icon from "./icons/user.svg"
<icon fill = "red" />
Я не понимаю, почему здесь так сложно работать с SVG или почему я не могу найти достаточно информации по этой теме. Может я что не так делаю? Есть ли более эффективные способы управления множеством значков для веб-сайта React? Мне нужно будет использовать довольно много, например, социальные сети и тому подобное.
@Sulthan, могу ли я так изменить цвета?
Вы всегда можете использовать стили для изменения цвета.
@Sulthan Приведите пример кода. У меня много значков SVG, и простое добавление их в код приложения может сделать много бесполезного кода. Я хочу, чтобы он оставался ясным, но гибким.
Начать с npmjs.com/package/react-inline-svg





Это ответило на мой вопрос:
https://github.com/gilbarbara/react-inlinesvg
Вставьте CSS в документ SVG
Ссылка на файл CSS в вашем документе SVG
Вставьте SVG в свой HTML
Но есть альтернатива, позволяющая обойти эти проблемы: загрузить SVG с запросом XHR, а затем встроить его в документ. Вот что делает этот компонент.
Я решил использовать inline-svg для реакции, но мне также рассказали о другом методе обертывания SVG в объект. Я ничего об этом не знаю, так как еще не пробовал, но перечислю это, чтобы пополнить коллекцию:
<object>
<embed src = "/static/filename.svg">
</object>
Я бы посоветовал сделать код простым и рассматривать SVG как HTML. Таким образом вы избегаете изменения размера / stretch / config и множества других проблем с SVG / React.
Создайте общий компонент Icon,
const Icon = ({ name, children }) => (
<svg className = {`icon icon-${name}`}>
{children}
</svg>
)
Создайте компонент Пользователь Icon,
const UserIcon = ({ fill }) => (
// fill your inner svg code here, set fill to the correct react node
)
Включите внешнее изображение SVG с четырьмя строками кода:
<svg>
<use xlinkHref = {'/images/logo.svg#Version-2'}>
</use>
</svg>
В этом случае изображение SVG «logo.svg» будет иметь идентификатор с именем «Version-2». Часть после хеша «#» соответствует идентификатору в изображении SVG, который, конечно же, должен существовать.
Я знаю, что выгляжу немного затруднительно, но вот лучшее решение, которое я мог бы получить: используйте webpack file-loader, чтобы получить URL-адрес вашего svg и использовать его как маску css, к которой вы можете применить цвет фона и некоторые параметры размера:
const name = 'chevron-up';
const size = 16;
const url = require(`!file-loader!../../../vendor/my-icons/icons/${name}.svg`);
return
<span style = {{
height: size,
width: size,
display: 'inline-block',
backgroundColor: backgroundColor || 'black',
WebkitMask: `url('${url}') no-repeat 50% 50% / cover`,
mask: `url('${url}') no-repeat 50% 50% / cover`,
}} />
;
На данный момент у него есть пара вопросов совместимости, но он поддерживается большинством последних браузеров. Так что я думаю, мы должны принять будущее, мой друг!
Если вы используете приложение Create React, то самое простое решение - импортировать SVG как компонент React.
import { ReactComponent as User } from './icons/user.svg';
const View = () => <User />;
См. Больше в документации: https://facebook.github.io/create-react-app/docs/adding-images-fonts-and-files#adding-svgs
Вы можете просто вывести
svgкакhtml.