Diciamo che ho un elemento SVG con percorsi per tutti gli stati degli Stati Uniti.Creare un componente SVG interattivo utilizzando 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>
I dati SVG viene salvato in un file separato con un'estensione .svg
. Diciamo che voglio creare un componente React di quella mappa, con il controllo completo su di esso in modo che possa modificare lo stile dei singoli stati sulla base di alcuni input esterni.
Utilizzando Webpack, per quanto posso dire, ho due opzioni per il caricamento del markup SVG: inserirla come markup grezzo utilizzando il raw-loader e creare un componente utilizzando dangerouslySetInnerHTML
:
var InlineSvg = React.createClass({
render() {
var svg = require('./' + this.props.name + '.svg');
return <div dangerouslySetInnerHTML={{__html: svg}}></div>;
}
});
o manualmente convertire il markup per valida 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>
);
});
Infine, diciamo che, oltre alla mappa in formato SVG, c'è un semplice elenco HTML di tutti gli stati. Ogni volta che un utente passa sopra un elemento della lista, il corrispondente percorso SVG dovrebbe spostare il colore di riempimento.
Ora, quello che non riesco a capire è come aggiornare il componente React SVG per riflettere lo stato stazionario. Certo, posso raggiungere il DOM, selezionare lo stato SVG in base al nome della classe e cambiarne il colore, ma questo non sembra essere il modo "reagire" per farlo. Un dito puntato sarebbe molto apprezzato.
PS. Sto usando Redux per gestire tutte le comunicazioni tra i componenti.
Sembra fantastico, grazie! Una cosa però, la chiave 'territory' nell'oggetto stato in' setHighlight' dovrebbe essere 'evidenziato' giusto?In questo modo corrisponde al nome della chiave nell'oggetto stato originale. –
Buon posto. Fisso. –
Per la parte "propagate a SVG" ho creato https://www.npmjs.com/package/react-samy-svg. Semplifica il caricamento e la manipolazione degli attributi degli elementi svg. –