Comment obtenir des HTMLElements dans le slot en utilisant vue3 ?
P粉794177659
2023-09-01 17:57:52
<p>当我尝试开发 Layer 组件时发生了一些事情。代码如下:</p>
<p><em>// Wrapper.vue</em></p>
<pre class="brush:php;toolbar:false;"><template>
<slot v-bind="attrs"></slot>
</modèle>
<script lang="ts" configuration>
importer {
définirProps,
réf,
montre,
utiliserAttrs,
surMonté,
surDémonté,
getCurrentInstance,
} de "vue" ;
const props = définirProps({
nom : { type : Chaîne, par défaut : "" },
zIndex : { type : Nombre, par défaut : 0 },
});
const attrs = useAttrs();
const inst = getCurrentInstance();
const observateur = ref<MutationObserver | nul>(nul);
montre(
() => [props.zIndex, props.nom],
() => {
setBrothersAttrs();
}
);
onMounted(() => {
let el = inst?.vnode.el;
si (el) {
si (!observer.value)
observer.value = new MutationObserver(setBrothersAttrs);
observer.value.observer(el.parentElement, { childList: true });
}
setBrothersAttrs();
});
onDémonté(() => {
if (observer.value) observer.value.disconnect();
});
const setBrothersAttrs = () => {
let el = inst?.vnode.el;
let children = el?.parentElement?.children;
if (el && enfants) {
pour (soit i = 0; i < children.length; i++) {
laissez bro = enfants[i];
if (bro === el) continuer ;
bro.style.zIndex = props.zIndex;
}
}
} ;
</script></pre>
<p><em>// Test.vue</em></p>
<pre class="brush:php;toolbar:false;"><template>
<div class="test">
<Nom du wrapper="wrapper1" :z-index="1">
<img class="image1" />
<div class="intérieur">
<Nom du wrapper="wrapper2" :z-index="2">
<img class="image2" />
</Emballage>
</div>
<Nom du wrapper="wrapper3" :z-index="3">
<img class="image3" />
</Emballage>
</Emballage>
</div>
</modèle>
<script lang="ts" configuration>
importer le Wrapper depuis "./Wrapper.vue" ;
</script></pre>
<p><em>// Résultats au format HTML : </em></p>
<pre class="brush:php;toolbar:false;"><div class="test">
<img class="picture1" style="z-index: 1" /><!-- s'il n'y a pas de wrapper3, "z-index: 3" -->
<div class="style intérieur="z-index: 1">
<img class="image2" style="z-index : 2" />
</div>
<img class="picture3" style="z-index: 1" /><!-- s'il n'y a pas de wrapper3, "z-index: 3" -->
</div></pre>
<blockquote>
<p>Comme le montre le code ci-dessus, le composant Wrapper est un composant vide. Son but est de définir le z-index des HTMLElements dans slot["default"]. </p>
</blockquote>
<p>Malheureusement, je ne trouve pas l'élément enfant dans useSlots()["default"]. <strong>J'ai donc essayé de demander à un observateur de mutation d'observer la liste des enfants du parent. </strong></p>
<p>Il fonctionne très bien tout seul (<em>comme l'image 1 et l'image 2 dans l'exemple</em>). <strong>Mais lorsque plusieurs Wrapper sont enveloppés ensemble, ils se recouvrent les uns les autres (<em>Comme l'image 3 dans l'exemple, l'index z de l'image3 défini par wrapper3 est écrasé par wrapper1). </strong>Cela signifie qu'ils partagent le même parent, de sorte que les enfants du parent sont toujours les mêmes. </p>
<p>Alors maintenant, la question redevient "<strong>Comment obtenir des éléments HTML dans l'emplacement</strong>"... un gourou de vuejs peut-il m'aider ? </p>
Cela peut être fait plus simplement en utilisant les fonctions de rendu de Vue : Emplacements de rendu