Une grande caractéristique des composants Web, ou plutôt même du HTML, est la possibilité d'encapsuler de manière transparente le contenu existant avec un nouveau contenu. Grâce à cela, vous pouvez modifier le code existant de manière pratiquement non invasive, ainsi que structurer le nouveau avec élégance.
Plus précisément, si vous enveloppez une mise en page avec votre élément personnalisé (google.Custom Elements), en configurant dans le hook connectedCallback (), votre élément peut déterminer les sous-éléments qu'il contient et configurer les siens et leur travail en conséquence si vous devez les adapter à nouvelles exigences et ce sera une décision tout à fait compétente sur le plan architectural. Il recevra également des événements contextuels de ses sous-éléments, et si vous avez activé l'isolation de l'arbre d'ombre, il deviendra leur courtier incontesté (et si vous ne l'avez pas activé, un proxy transparent). au-delà de ses limites, ils n'émergeront pas et toute responsabilité lui incombera.
"WebComponents ", https://habr.com/ru/post/461153/ .
?
, , . .. - . , , , , . .. , , , /, .. , - .
IoC-, .. . Java , . .. ( ;). , , , , . , HOST, 20 , -, , , HOST , Search & Replace.
, , , . , , , , API - ( “” Spring Boot).
, , , Angular Composite API Vue. JSX React Context API “ ”, .. . IoC “” , .
Angular -, . injection-js typescript. , , , . -, - .
, . , , - , , , , .
- . ! - :
mkdir testioc
cd testioc
npm init
-
npm i skinny-widgets --save
index.html
body
<sk-config
theme="antd"
base-path="/node_modules/skinny-widgets/src"
></sk-config>
<script src="/node_modules/skinny-widgets/dist/sk-compat-bundle.js"></script>
<script type="module">
import { Registry } from "/node_modules/skinny-widgets/complets/registry.js";
window.registry = window.registry || new Registry();
registry.wire({
SkConfig: { def: SkConfig, is: 'sk-config'},
SkButton: { def: SkButton, is: 'sk-button'},
});
</script>
sk-config , , - . , ( ) , is customElements. , , .
window.registry = window.registry || new Registry(); , , , - “ ”.
<sk-button>Open</sk-button>
npx http-server
, : .
.
<script type="module">
import { Registry } from "/node_modules/skinny-widgets/complets/registry.js";
import { MyDialog } from "./my-dialog.js";
window.registry = window.registry || new Registry();
registry.wire({
SkConfig: { def: SkConfig, is: 'sk-config'},
SkButton: { def: SkButton, is: 'sk-button'},
myDialog: { def: MyDialog, is: 'my-dialog' },
});
</script>
<sk-button>Open</sk-button>
<my-dialog>This is my dialog</my-dialog>
SkDialog , . my-dialog.js .
export class MyDialog extends SkDialog {
}
. , “” click open() . HTML -, , .
- MyView customElements. . my-view.
my-view.js :
export class MyView extends HTMLElement {
bindDialog() {
if (this.dialogCfg) {
let button = this.querySelector(this.dialogCfg.buttonSl);
let dialog = this.querySelector(this.dialogCfg.dialogSl);
if (button) {
button.addEventListener('click', (event) => {
dialog.open();
});
}
}
}
render() {
this.bindDialog();
}
connectedCallback() {
this.render();
}
}
.. .
, - connectedCallback(), .
render(), bindDialog() - .
bindDialog() click . ,
this.dialogCfg
, .
<script type="module">
import { Registry } from "/node_modules/skinny-widgets/complets/registry.js";
import { MyDialog } from "./my-dialog.js";
import { MyView } from "./my-view.js";
window.registry = window.registry || new Registry();
registry.wire({
SkConfig: { def: SkConfig, is: 'sk-config'},
SkButton: { def: SkButton, is: 'sk-button'},
dialogCfg: { buttonSl: '#dialogButton', dialogSl: '#dialog' },
myDialog: { def: MyDialog, is: 'my-dialog' },
myView: { def: MyView, deps: { dialogCfg: 'dialogCfg' }, is: 'my-view' },
});
</script>
<my-view>
<sk-button id="dialogButton">Open</sk-button>
<my-dialog id="dialog">This is my dialog</my-dialog>
</my-view>
, . , , . :
, , HTML , . HTML, javascript . , .
-:
Material WebComponents - https://habr.com/ru/post/462695/
Démarrage rapide avec WebComponents - https://habr.com/ru/post/460397/