【问题标题】:Can't change transition on the fly for a transition group无法即时更改过渡组的过渡
【发布时间】:2021-08-12 20:56:07
【问题描述】:

在我的应用程序中,单击模态框的关闭按钮使其随着淡入淡出动画消失,而向下滑动它使其随着滑动动画消失。这是通过根据事件更改模态的<transition name> 来完成的。

同样的事情似乎不适用于过渡组。是我做错了什么,还是实际上不可能?

CodeSandbox

模板:

<transition-group :name="itemTransition">
  <div
    v-for="item in items"
    :key="item.id"
    v-hammer:swipe.up="() => onSwipeUp(notification.id)"
  >
  </div>
</transition-group>

脚本:

export default {
  data () {
    return {
      applySwipeTransition: false
    }
  },
  computed: {
    itemTransition () {
      return this.applySwipeTransition ? 'swipe' : 'fade'
    }
  },
  methods: {
    onSwipeUp (id) {
      this.applySwipeTransition = true
      this.$nextTick(() => {
        this.closeItem(id)
        this.applySwipeTransition = false
      })
    }
  }
}

CSS:

.fade-leave-active {
  animation: fade-out .75s;
}

.swipe-leave-active {
  animation: slide-up .25s;
}

【问题讨论】:

    标签: vue.js vue-transitions


    【解决方案1】:

    因此,我通过手动将 &lt;transition-groupname 更改为 fadeswipe 来解决您的 CSS 问题,以查看 CSS 动画是否存在问题。

    结论:fade 有效。 swipe 仅将 list-item 转换为离开页面通过单击并拖动,而不是真正的滑动,如果这与您有关(顺便说一下,我的滑动是 MacOS 滑动 - 两指,没有点击)

    不过,在不更改 CodePen 的情况下,问题似乎出在您的 computed 属性上,即使您已将其绑定到 computed 属性,也没有什么告诉 name 动态更改 - @ 的逻辑987654333@ 似乎总是默认为fade,因为applySwipeTransition 永远不会等于“滑动”,因为当您手动将name 更改为swipe 时CSS 确实有效(参见“判决”)。

    为了了解根本问题出在哪里,我使用了您的 itemTransition()

    computed: {
        itemTransition() {
          return this.applySwipeTransition ? "fade" : "swipe";
        },
    

    切换fadeswipe 的顺序现在可以使swipe 工作。我希望这能让你对这个问题有所了解。如果需要,您可能需要创建 custom Vue directiveevent 来处理滑动/淡入淡出逻辑。

    【讨论】:

      【解决方案2】:

      问题在于组件更新的时机。您正在将转换模式切换回fade,其更新周期与元素关闭时的更新周期相同。因此,当触发下一个组件更新时(通过删除项目),转换已经切换回fade。此时,您可能已经猜到,需要做的就是在下一次更新中将过渡切换回,由删除项目触发:

         onSwipeUp (id) {
           this.applySwipeTransition = true
           this.$nextTick(() => {
              this.closeItem(id)
              this.$nextTick(()=>{
                this.applySwipeTransition = false
              })         
           })
         }
      

      由于没有理由等待组件更新关闭item,所以可以稍微简化一下代码:

         onSwipeUp (id) {
            this.applySwipeTransition = true
            this.closeItem(id)
            this.$nextTick(() => {
              this.applySwipeTransition = false
            })
          }
      

      这是您的工作沙箱:https://codesandbox.io/s/vue-template-forked-60lkk?file=/src/App.vue

      【讨论】:

      • 工作,谢谢!所以现在不让我授予赏金,必须等待 4 小时。但是有一个问题,在我的沙箱中,我实际上(1)将转换设置为滑动,(2)在下一个更新周期中删除项目,(3)在下一个更新周期中将转换设置回淡入淡出。为什么这不起作用?我知道在这么多连续的更新周期中做事情是没有必要的,但它应该仍然有效,因为每个步骤都是按更新周期的时间顺序完成的,不是吗?
      • 在您的代码中,两个 nextTick() 调用(用于删除项目和切换转换)都是同步执行的,因此当它们被注册时,它们都在等待相同的更新周期。为了连续,下一个 nextTick() 应该在前一个更新周期内调用。这就是为什么你必须嵌套它们。将它们视为异步函数调用。不确定我解释得好不好,不得不承认他们很难理解
      • 不,我有点明白你的意思,谢谢你的澄清:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 2012-11-20
      相关资源
      最近更新 更多