Supposons que je crée un simple jeu SVG. Je souhaite créer des éléments personnalisés avec des racines fantômes constituées de primitives SVG ( <rect>
, <circle>
, etc.). Le résultat serait comme ceci :
<svg>
<redwood-tree position="10 20"></redwood-tree>
<player-tank position="30 50"></player-tank>
<enemy-tank position="50 100"></enemy-tank>
<!-- ... etc ... -->
</svg>
où chacun de ces éléments pourrait être défini comme
customElements.define('player-tank', class extends SVGRectElement {
constructor() {
this.root = this.attachShadow({mode:'closed'})
this.root.innerHTML = `<rect width="10" height="10"></rect>`
// ... some more code to map `position` attribute to `x/y` attributes ...
}
})
Démo (rien ne se passe): https://jsfiddle.net/pem90k9a (mais si vous essayez de placer l'élément player-tank
en dehors d'un arbre SVG, alors il dira Uncaught TypeError: Illegal constructor
toute façon puisque nous ' J'ai prolongé SVGRectElement
.
Pourquoi SVG n'est-il pas compatible avec les composants ?
Une solution consiste à utiliser <div>
s, et chaque élément (tank-joueur, tank ennemi, etc.) peut être un arbre <svg>
séparé, mais de toute façon, il serait toujours intuitif qu'il se contente de travailler (plutôt que de n'aboutir à rien).
Nous aurions à modifier encore plus l'analyseur. Nous avons donc choisi de ne pas le faire pour réduire la complexité.
Il suffit de regarder l'arbre composé. Le rendu devrait être découplé de l'analyse syntaxique, ce serait approprié. Je ne sais pas à quel point c'est complexe, mais cela semble valable.
Nous aurions à modifier encore plus l'analyseur. Nous avons donc choisi de ne pas le faire pour réduire la complexité.
Excellente philosophie de conception et de développement ! Poussez la complexité sur les développeurs et les utilisateurs finaux !
Commentaire le plus utile
Il suffit de regarder l'arbre composé. Le rendu devrait être découplé de l'analyse syntaxique, ce serait approprié. Je ne sais pas à quel point c'est complexe, mais cela semble valable.