-
-
Notifications
You must be signed in to change notification settings - Fork 8.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Transition should sniff for Teleport #5836
Comments
Yes I'm agree with you. For me it look's like :
and in the component ModalWindow : |
I'm also interested in this |
I made a PR. feel free to review. |
Hello, could teleport support <div class="pinned">
<TransitionGroup id="id" name="animation-class">
<TransitionGroup/>
</div>
<div>
<Teleport :disabled="!shouldPin" v-if="shouldShow"></Teleport>
</div> |
I just create a project just like yours: Teleport-in-Transition |
@MarkSky The PR is not merged. |
I know. |
@MarkSky |
I understand now, thank you. |
Was there a reason this PR was never merged ? |
Still waiting when it'll be released |
Have the same issue as @zyxkad. Was trying to migrate a feature that used context: A FABs (Floating-action-buttons) bottom-right container in my app, and each view can "teleport" its own custom FABs in addition to some default ones already present. The patch made by @edison1105 doesn't seem to fix it. Can this be considered a new issue? |
@renatodeleao <TransitionGroup name="list" tag="ul" id="teleport-target"/>
<template v-for="item in items" :key="item">
<teleport to="#teleport-target">
<Item :key="item">{{ item }}</Item>
</teleport>
</template> |
@edison1105 Here's an updated demo, where it does re-render but the transition still does not apply. The only difference is that instead of loop and render several <h1>Teleported</h1>
<TransitionGroup name="list" tag="ul" id="teleport-target" />
- <template v-for="item in items" :key="item">
<teleport to="#teleport-target">
- <Item>{{ item }}</Item>
+ <Item v-for="item in items" :key="item">{{ item }}</Item>
</teleport>
- </template> |
The HTML has changed, but it was not due to a re-render by TransitionGroup. Instead, it resulted from a re-render by Teleport. The HTML displayed within TransitionGroup is added by Teleport, and animations are only triggered when the children of TransitionGroup itself change. |
So if got it right, what you are suggesting since the beginning is that is not currently possible to declaratively I understand that there are other ways of implementing the same output, but original goal was to swap Thank you for your time to clarify, truly appreciated and hopefully this will be helpful for other community members that might land in this issue. 🙏 EDIT: i've highlighted declaratively because we can "teleport" — in a way — using a any global state solution that can be translated into rendering a list of dynamic component definitions from that state (which is basically recreating |
For those needing a workaround, i'm gonna explain the issue I've faced and how I solved it. This is how my component looked at first: <template>
<Transition name="fade">
<Teleport to="body" v-if="isOpen">
<div class="some-div" @click="isOpen = false">
<img :src="imageUrl" @load="onLoad"/>
</div>
</Teleport>
</Transition>
</template> At first the issue I had was that I thought I couldn't change the order, because I had the <template>
<Teleport to="body">
<Transition name="fade">
<div class="some-div" @click="isOpen = false" v-if="isOpen">
<img :src="imageUrl" @load="onLoad"/>
</div>
</Transition>
</Teleport>
</template> I know if you have a more complex component that renders multiple divs, this may not be feasable. At that point you may think about refactoring your components. I hope this helped some devs out there! |
What problem does this feature solve?
Currently, it's not possible to wrap a teleport by a transition because
Component inside <Transition> renders non-element root node that cannot be animated.
While I agree that transition shouldn't start trying to find the first actual element it can apply classes to in custom components, I think that there should be an exception for Teleport.
It's not an uncommon use case that you want to teleport some popover or modal to the body and want to add a transition when it appears or gets removed. I am aware that you can always transition the contents of the stuff you are teleporting but that is less flexible and composable. e.g. a reusable component that always ports itself to the body currently can't be wrapped by a custom transition.
Both components are part of the core library and also don't work as normal components do. So I think it shouldn't be a problem if the transition component sniffs if its child is a teleport and applies the transition to the teleported element instead. Ofc that would require that the teleport only consists of a single root but that is a given (the error message already makes that clear and could be changed for the teleport case:
SyntaxError: <Transition> expects exactly one child element or component.
)What does the proposed API look like?
The text was updated successfully, but these errors were encountered: