Bagaimana untuk mendapatkan HTMLElements dalam slot menggunakan vue3?
P粉794177659
2023-09-01 17:57:52
<p>当我尝试开发 Lapisan 组件时发生了一些事情。代码如下:</p>
<p><em>// Wrapper.vue</em></p>
<pre class="brush:php;toolbar:false;"><template>
<slot v-bind="attrs"></slot>
</template>
<skrip lang="ts" persediaan>
import {
defineProps,
ref,
menonton,
gunakanAtts,
onMounted,
onUnmounted,
getCurrentInstance,
} daripada "vue";
const props = defineProps({
nama: { jenis: Rentetan, lalai: "" },
zIndex: { jenis: Nombor, lalai: 0 },
});
const attrs = useAttrs();
const inst = getCurrentInstance();
const observer = ref<MutationObserver | null>(null);
menonton (
() => [props.zIndex, props.name],
() => {
setBrothersAttrs();
}
);
onMounted(() => {
biarkan el = inst?.vnode.el;
jika (el) {
jika (!observer.value)
observer.value = new MutationObserver(setBrothersAttrs);
observer.value.observe(el.parentElement, { childList: true });
}
setBrothersAttrs();
});
onUnmounted(() => {
if (observer.value) observer.value.disconnect();
});
const setBrothersAttrs = () => {
biarkan el = inst?.vnode.el;
biarkan anak = el?.parentElement?.anak;
jika (el && kanak-kanak) {
untuk (biar i = 0; i < children.length; i++) {
biar bro = anak-anak[i];
jika (bro === el) teruskan;
bro.style.zIndex = props.zIndex;
}
}
};
</script></pre>
<p><em>// Test.vue</em></p>
<pre class="brush:php;toolbar:false;"><template>
<div class="ujian">
<Nama pembungkus="pembungkus1" :z-index="1">
<img class="gambar1" />
<div class="dalaman">
<Nama pembungkus="pembungkus2" :z-index="2">
<img class="gambar2" />
</Pembungkus>
</div>
<Nama pembungkus="pembungkus3" :z-index="3">
<img class="gambar3" />
</Pembungkus>
</Pembungkus>
</div>
</template>
<skrip lang="ts"
import Wrapper dari "./Wrapper.vue";
</script></pre>
<p><em>// Keputusan dalam format HTML: </em></p>
<pre class="brush:php;toolbar:false;"><div class="test">
<img class="gambar1"style="z-index: 1" /><!-- jika tiada pembungkus3, "z-index: 3"
<div class="inner"style="z-index: 1">
<img class="gambar2"style="z-index: 2"
</div>
<img class="picture3"style="z-index: 1" /><!-- jika tiada pembungkus3, "z-index: 3"
</div></pre>
<blockquote>
<p>Seperti yang ditunjukkan dalam kod di atas, Pembungkus komponen ialah komponen kosong. Tujuannya adalah untuk menetapkan indeks-z HTMLElements dalam slot["default"]. </p>
</blockquote>
<p>Malangnya, saya tidak dapat mencari elemen anak dalam useSlots()["default"]. <strong>Jadi saya cuba meminta pemerhati mutasi memerhatikan senarai anak ibu bapa. </strong></p>
<p>Ia berfungsi dengan baik sendiri (<em>seperti gambar 1 dan gambar 2 dalam contoh</em>). <strong>Tetapi apabila berbilang Pembungkus dililit bersama, ia akan menutup satu sama lain (<em>Seperti gambar 3 dalam contoh, z-indeks gambar3 yang ditetapkan oleh pembungkus3 ditimpa oleh pembungkus1). </strong>Ini bermakna mereka berkongsi ibu bapa yang sama, supaya anak-anak ibu bapa sentiasa sama. </p>
<p>Jadi kini persoalannya kembali "<strong>Bagaimana untuk mendapatkan HTMLElements dalam slot</strong>"...bolehkah mana-mana guru vuejs membantu saya? </p>
Ia boleh dilakukan dengan lebih mudah menggunakan fungsi render Vue: Slot render