Załóżmy, że mam element SVG ze ścieżkami dla wszystkich stanów USA.Tworzenie interaktywnego komponentu SVG za pomocą React
<svg>
<g id="nh">
<title>New Hampshire</title>
<path d="m 880.79902,142.42476 0.869,-1.0765 1.09022,..." id="NH" class="state nh" />
</g>
...
</svg>
Dane SVG są zapisywane w oddzielnym pliku z rozszerzeniem .svg
. Załóżmy, że chcę utworzyć komponent React na tej mapie, z pełną kontrolą nad nim, aby móc modyfikować stylizację poszczególnych stanów na podstawie danych wejściowych z zewnątrz.
Korzystanie WebPACK, o ile mogę powiedzieć, mam dwie opcje ładowania znaczników SVG: Włóż go jako surowego znaczników za pomocą raw-loader i utworzyć komponent używając dangerouslySetInnerHTML
:
var InlineSvg = React.createClass({
render() {
var svg = require('./' + this.props.name + '.svg');
return <div dangerouslySetInnerHTML={{__html: svg}}></div>;
}
});
lub ręcznie przekonwertować znaczników do ważnego JSX:
var NewComponent = React.createClass({
render: function() {
return (
<svg>
<g id="nh">
<title>New Hampshire</title>
<path d="m 880.79902,142.42476 0.869,-1.0765 1.09022,..." id="NH" className="state nh" />
</g>
...
</svg>
);
});
Wreszcie, powiedzmy, że oprócz mapie SVG, istnieje prosta lista HTML wszystkich stanach. Gdy użytkownik unosi się nad elementem listy, odpowiednia ścieżka SVG powinna zmienić kolor wypełnienia.
Teraz nie mogę się domyślić, jak zaktualizować komponent React SVG, aby odzwierciedlić stan ukryty. Oczywiście, mogę sięgnąć do DOM, wybrać stan SVG według nazwy klasy i zmienić jego kolor, ale to nie wydaje się być "reakcją", jak to zrobić. Wskazany palec byłby bardzo doceniany.
PS. Używam Redux do obsługi całej komunikacji między komponentami.
Wygląda świetnie, dzięki! Jedno jednak, klucz 'terytorium' w obiekcie stanu w' setHighlight' powinien być "podświetlony", prawda?Jest to zgodne z nazwą klucza w oryginalnym obiekcie stanu. –
Dobre miejsce. Naprawiony. –
Dla części "propaguj do SVG" stworzyłem https://www.npmjs.com/package/react-samy-svg. Ułatwia ładowanie i manipulowanie atrybutami elementów svg. –