javascript - Vue.js 在播放 Enter 后动态更改离开过渡

标签 javascript css vue.js

我有一个动态过渡,告诉我的元素向左或向右移动(它是一个 slider 元素)。由于默认情况下 Vue 只允许我执行一个转换,因此我使用动态转换属性:

<transition v-bind:name="'slider-' + slideDirection">

现在,此 slider 具有进入和离开过渡,可根据其出现或离开的方向进行调整。一切看起来都很好,但是..

当元素满足出现条件时,enter 和 Enter-to 转换始终正确执行。但是如果在元素出现后更改了 left 和 left-to 转换,则不会获得更新的方向。

这是一个 fiddle ,显示了我的意思:

https://jsfiddle.net/nxLmdk9q/4/

在这个例子中,一切正常,除了一旦你改变方向,元素就会获得之前的离开方向动画。

我该如何解决这个问题?

最佳答案

看起来您的幻灯片转换在 SlideDirection 更新之前就开始了。 尝试使用 nextTick 函数,以便幻灯片过渡等待方向更新。

更新了示例。

new Vue({
  el: "#app",
  data: {
    slideDirection: "right",
    counter: 0
  },
  methods: {
    moveRight: function() {
      this.slideDirection = "right";
      this.$nextTick(() => {
        this.counter++;
      })

    },
    moveLeft: function() {
      this.slideDirection = "left";
      this.$nextTick(() => {
        this.counter--;
      })
    },
  }
})
body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
  display: flex;
  flex-direction: column;
  width: 300px;
  height: 150px;
}

div#slider {
  position: relative;
}

div#slider div:nth-child(even) {
  background: green;
}

div#slider div:nth-child(odd) {
  background: red;
}

div {
  padding: 30px;
  width: 100%;
  height: 100%;
  position: absolute;
}

div:odd {
  background: blue;
}

.slider-right-enter {
  opacity: 0;
  transform: translatex(100%);
}

.slider-right-enter-to {
  opacity: 1;
  transition: all 0.5s ease-out;
}

.slider-right-leave-to {
  opacity: 0;
  transform: translatex(-100%);
  transition: all 0.5s ease-out;
}

.slider-left-enter {
  opacity: 0;
  transform: translatex(-100%);
}

.slider-left-enter-to {
  opacity: 1;
  transition: all 0.5s ease-out;
}

.slider-left-leave-to {
  opacity: 0;
  transform: translatex(100%);
  transition: all 0.5s ease-out;
}
<div id="app">

  <div id="slider">
    <transition v-bind:name="'slider-' + slideDirection">
      <div v-if='counter == 0'>
        0
      </div>
    </transition>

    <transition v-bind:name="'slider-' + slideDirection">
      <div v-if='counter == 1'>
        1
      </div>
    </transition>

    <transition v-bind:name="'slider-' + slideDirection">
      <div v-if='counter == 2'>
        2
      </div>
    </transition>

    <transition v-bind:name="'slider-' + slideDirection">
      <div v-if='counter == 3'>
        3
      </div>
    </transition>

  </div>

  <div>

    <button @click="moveLeft">
          &#x3C;&#x3C;
        </button>
    <button @click="moveRight"> 
          &#x3E;&#x3E;
        </button>
  </div>
</div>

关于javascript - Vue.js 在播放 Enter 后动态更改离开过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60200582/

相关文章:

javascript - 从 Google Maps Places API 中删除占位符文本

javascript - 隐藏 Vimeo 控件并替换为播放/暂停切换按钮

javascript - 通过axios post调用传递参数

javascript - Aframe + vuejs - 核心 :schema:warn Unknown property `color` for component/system `undefined` . +10ms aframe.js:327

docker - 在运行时将 (Docker) 环境变量传递到 Vue/Quasar 应用程序

javascript - HTML - 添加行函数显示不需要的输出

javascript - 如何只按 1 个按钮使图像改变 3 次?

javascript - 在 JavaScript 匹配函数中使用变量代替数字

html - 当旁边有行内 block 级元素时选择向下移动

html - 在 Chrome 中响应,但在移动设备上不响应