Ошибка синтаксического анализатора Javascript при попытке включить элемент SVG в качестве функционального компонента React

#javascript #html #reactjs #svg

#javascript #HTML #reactjs #svg

Вопрос:

Я создаю приложение React, которое служит каталогом сообщества для глобальной музыкальной сцены, частью которой я являюсь. Я пытаюсь следовать стратегии создания значков SVG, которая оборачивает код SVG функциональным компонентом React, чтобы затем вы могли импортировать значок в компонент, который использует его в качестве компонента React (статья NYT, в которой описывается стратегия). Эта стратегия работает для некоторых компонентов, но для многих я получаю ошибки синтаксического анализа примерно:

 ./src/Components/LargeScopeComponents/ArtistProfileDisplay/TopBar/SVG/ListViewIcon/ListViewIconDarkTheme.js
  Line 4:  Parsing error: Unexpected token, expected "}"

  2 | 
  3 | const ListViewIconDarkTheme = () => (
> 4 | 	<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 57.72 53.2"><defs><style>.cls-1{fill:#fff}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M15.38 41.72h42.35V53.2H15.38zM.41 41.72h10.86V53.2H.41zM15.15 20.86H57.5v11.48H15.15zM0 20.86h10.86v11.48H0zM15.15 0H57.5v11.48H15.15zM0 0h10.86v11.48H0z"/></g></g></svg>
    | 	                                                                                         ^
  5 | );
  6 | 
  7 | export default ListViewIconDarkTheme;  

Я не совсем уверен, почему синтаксическому анализатору javascript не нравится синтаксис SVG, потому что эта стратегия работает для других компонентов. Например, я использовал ту же стратегию для создания этого функционального компонента, и анализатор javascript не жаловался, когда я включил его в компонент card, в котором я его использую.

 import React from 'react';

const CircleUpIcon_LightTheme = () => (
	<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 83.28 83.28"><g data-name="Layer 2"><g data-name="Layer 1"><circle cx="41.64" cy="41.64" r="38.64" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="6"/><path d="M41.64 20.7L20.92 56.58h41.43L41.64 20.7z"/></g></g></svg>
);

export default CircleUpIcon_LightTheme;  

Мне интересно, есть ли какие-либо обходные пути для этого или изменения, которые я мог бы внести в синтаксис SVG, чтобы удовлетворить анализатор javascript. Любая помощь была бы высоко оценена 🙂

Ответ №1:

Проблема в том, что синтаксис svg конфликтует с jsx. React поддерживает большинство типов элементов svg (см.:https://reactjs.org/docs/dom-elements.html#all-supported-svg-attributes ), но для таких вещей, как <style> вам нужно сделать дочерние элементы совместимыми с react. Например:

 <style>{
  `.cls-1{fill:#fff}`
}</style>
  

Обратите внимание на дополнительные фигурные скобки и преобразование дочернего элемента в строку. Это должно исправить вашу первую ошибку.

Ответ №2:

Причиной проблемы является тег style в ListViewIconDarkTheme.

Почему бы вам не попробовать это? (см. Атрибут style)

 const ListViewIconDarkTheme = () => (
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 57.72 53.2"><g 
id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path 
class="cls-1" style="fill:#fff" d="M15.38 41.72h42.35V53.2H15.38zM.41 
41.72h10.86V53.2H.41zM15.15 20.86H57.5v11.48H15.15zM0 
20.86h10.86v11.48H0zM15.15 0H57.5v11.48H15.15zM0 0h10.86v11.48H0z"/></g></g> . 
</svg>
);

export default ListViewIconDarkTheme;
  

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

1. Похоже, это избавляет от ошибок, большое спасибо! Чтобы соответствовать синтаксису JSX, мне просто нужно было убедиться, что там указано style={{fill:’#fff’}}.