Wie bekomme ich HTMLElements mit vue3 in den Slot?
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>
</template>
<script lang="ts" Setup>
importieren {
defineProps,
ref,
betrachten,
useAttrs,
onMounted,
onUnmontiert,
getCurrentInstance,
} von „vue“;
const props = defineProps({
Name: { Typ: String, Standard: "" },
zIndex: { Typ: Zahl, Standard: 0 },
});
const attrs = useAttrs();
const inst = getCurrentInstance();
const observer = ref<MutationObserver | null>(null);
betrachten(
() => [props.zIndex, props.name],
() => {
setBrothersAttrs();
}
);
onMounted(() => {
let el = inst?.vnode.el;
wenn (el) {
if (!observer.value)
Observer.value = new MutationObserver(setBrothersAttrs);
Observer.value.observe(el.parentElement, { childList: true });
}
setBrothersAttrs();
});
onUnmount(() => {
if (observer.value) observer.value.disconnect();
});
const setBrothersAttrs = () => {
let el = inst?.vnode.el;
let children = el?.parentElement?.children;
if (el && Kinder) {
for (let i = 0; i < children.length; i++) {
let bro = children[i];
if (bro === el) continue;
bro.style.zIndex = props.zIndex;
}
}
};
</script></pre>
<p><em>// Test.vue</em></p>
<pre class="brush:php;toolbar:false;"><template>
<div class="test">
<Wrapper-Name="wrapper1" :z-index="1">
<img class="picture1" />
<div class="inner">
<Wrapper-Name="wrapper2" :z-index="2">
<img class="picture2" />
</Wrapper>
</div>
<Wrapper-Name="wrapper3" :z-index="3">
<img class="picture3" />
</Wrapper>
</Wrapper>
</div>
</template>
<script lang="ts" setup>
Wrapper aus „./Wrapper.vue“ importieren;
</script></pre>
<p><em>// Ergebnisse im HTML-Format: </em></p>
<pre class="brush:php;toolbar:false;"><div class="test">
<img class="picture1" style="z-index: 1><!-- wenn kein Wrapper3, "z-index: 3"
<div class="inner" style="z-index: 1">
<img class="picture2" style="z-index: 2"
</div>
<img class="picture3" style="z-index: 1><!-- wenn kein wrapper3, "z-index: 3"
</div></pre>
<blockquote>
<p>Wie im obigen Code gezeigt, ist die Komponente Wrapper eine leere Komponente. Sein Zweck besteht darin, den Z-Index von HTMLElements in Slot["default"] festzulegen. </p>
</blockquote>
<p>Leider kann ich das untergeordnete Element in useSlots()["default"] nicht finden. <strong>Also habe ich versucht, einen Mutationsbeobachter die ChildList des Elternteils beobachten zu lassen. </strong></p>
<p>Es funktioniert alleine gut (<em>wie Bild 1 und Bild 2 im Beispiel</em>). <strong>Aber wenn mehrere Wrapper zusammengepackt werden, überdecken sie sich gegenseitig (<em>Wie Bild 3 im Beispiel wird der von Wrapper3 festgelegte Z-Index von Bild3 von Wrapper1 überschrieben). </strong>Das bedeutet, dass sie dasselbe übergeordnete Element haben, sodass die untergeordneten Elemente des Elternelements immer dieselben sind. </p>
<p>Jetzt stellt sich also wieder die Frage: "<strong>Wie bekomme ich HTMLElements in den Slot</strong>" ... kann mir irgendein Vuejs-Guru helfen? </p>
使用 Vue 渲染函数可以更简单地完成:渲染槽