javascript - Ako funguje <transition-group> s Vue.components?
Predpokladajme, že chcem použiť komponenty na vytvorenie zoznamu, ktorý by zmizol, ak naň kliknem, a použiť transition-group na animovanie časti.
Nasledujúci kód môže podávať dobrý výkon:
HTML :
<transition-group name="testanim">
<p key="1" v-if='open1' @click='open1 = false'>Can You See Me?</p>
<p key="2" v-if='open2' @click='open2 = false'>Can You See Me?</p>
</transition-group>
CSS :
.testanim-enter-active, .testanim-leave-active {
transition: all .5s;
}
.testanim-enter, .testanim-leave-to {
transform: translateX(1rem);
opacity: 0;
}
.testanim-leave-active {
position: absolute;
}
.testanim-move {
transition: all .5s;
}
open1 a open2 sú definované v data vo Vue.js.
Avšak nasledujúci kód by animáciu vôbec nevykonal.
HTML :
<transition-group name="testanim">
<test-sth key="1"></test-sth>
<test-sth key="2"></test-sth>
</transition-group>
CSS: to isté ako vyššie
JavaScript :
Vue.component ("test-sth", {
template: "<p v-if='open' @click='open = !open'>Can You See Me?</p>",
data: function () {
return {
open: true,
}
}
})
Takže problém je, ako môžem animovať komponenty vo vnútri transition-group. Hľadal som niekoľko hodín, ale nenašiel som žiadnu otázku ani dokumenty súvisiace s tým.
Aktualizácia:
Kľúčovým problémom je, že animácia v predchádzajúcom príklade, kde druhá veta sa hladko posúva nahor, keď prvá veta zmizne, sa v nasledujúcom nezobrazuje. Aj keď môžem dať transition do template, to problém nevyrieši. Mal by som napísať celý transition-group do template, alebo niečo iné...?
Odpoveď č. 1
Pri používaní prechodov Vue, z vnútorných dôvodov, komponenty transition/transition-group musia byť v tom istom šablóne ako stav, ktorý sa prepína.
Tiež, komponenty Vue vyžadujú, aby vždy existoval jediný koreňový element pre komponent. v-if porušuje toto pravidlo, pretože dáva možnosť, že element tam nebude, ak je v-if nepravdivý.
Na vyriešenie vášho problému presuňte prechod do komponentu test-sth. Keďže spravuje svoje vlastné prepínanie, malo by spravovať aj svoje vlastné prechody.
Vue.component("test-sth", {
template: `
<transition name='testanim'>
<p v-if='open' @click='open = !open'>Can You See Me?</p>
</transition>
`,
data: () => ({
open: true,
}),
})
new Vue({
el: "#app",
template: `
<div>
<test-sth></test-sth>
<test-sth></test-sth>
</div>
`,
})
Pozrite si tento fiddle pre funkčný príklad.
