为什么我的 vue Leave 转换不起作用?

Rak*_*ali 5 javascript vue.js vee-validate

我正在使用 vee validate 进行表单验证。我正在使用 vue 转换来显示这样的验证错误:

 <input type="text" name="name" v-validate="'required'">
<transition name="slide-fade">
  <div v-show="errors.has('name')">{{ errors.first('name') }}</div>
</transition>
Run Code Online (Sandbox Code Playgroud)

css:

    .slide-fade-enter-active {
  transition: all .3s ease;
}
.slide-fade-leave-active {
  transition: all .8s cubic-bezier(1.0, 0.5, 0.8, 1.0);
}
.slide-fade-enter, .slide-fade-leave-to
/* .slide-fade-leave-active below version 2.1.8 */ {
  transform: translateX(10px);
  opacity: 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,当出现错误时,过渡有效,但当错误消失时,过渡不起作用。为什么会这样?

acd*_*ior 4

过渡正在发挥作用。你会突然看到它一片空白,因为没有东西errors.first('name')可以显示了。

当你添加一些其他字符串时errors.first('name'),比如说Error:,它就变得清晰了。

Vue.use(VeeValidate);
new Vue({
  el: '#demo'
})
Run Code Online (Sandbox Code Playgroud)
.slide-fade-enter-active {
  transition: all .3s ease;
}
.slide-fade-leave-active {
  transition: all .8s cubic-bezier(1.0, 0.5, 0.8, 1.0);
}
.slide-fade-enter, .slide-fade-leave-to
/* .slide-fade-leave-active below version 2.1.8 */ {
  transform: translateX(10px);
  opacity: 0;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue"></script>
<script src="https://cdn.jsdelivr.net/npm/vee-validate@latest/dist/vee-validate.js"></script>

<div id="demo">
  Type something and then erase. And then type again.
  <input type="text" name="name" v-validate="'required'">
  <transition name="slide-fade">
    <div v-show="errors.has('name')">Errors: {{ errors.first('name') }}</div>
  </transition>
</div>
Run Code Online (Sandbox Code Playgroud)


如果你真的必须...

考虑额外代码的数量,但如果您确实必须这样做,则必须向的值添加一个监视,并在发生第一个错误时记录它。input

vee-validate 不提供错误侦听器,因此这已经是目前最好的了。请参阅下面的演示。

Vue.use(VeeValidate);
new Vue({
  el: '#demo',
  data: {
    name: "Erase me",
    nameError: ""
  },
  watch: {
    name() {
      // two ticks at least, because vee-validate takes one tick to validate
      Vue.nextTick().then(Vue.nextTick()).then(() => {
        if (this.errors.has('name')) { this.nameError = this.errors.first('name'); }
      });
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
.slide-fade-enter-active {
  transition: all .3s ease;
}
.slide-fade-leave-active {
  transition: all .8s cubic-bezier(1.0, 0.5, 0.8, 1.0);
}
.slide-fade-enter, .slide-fade-leave-to
/* .slide-fade-leave-active below version 2.1.8 */ {
  transform: translateX(10px);
  opacity: 0;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue"></script>
<script src="https://cdn.jsdelivr.net/npm/vee-validate@latest/dist/vee-validate.js"></script>

<div id="demo">
  Erase and error will appear. Type again and error will leave.<br>
  <input type="text" name="name" v-validate="'required'" v-model="name">
  <transition name="slide-fade">
    <div v-show="errors.has('name')">Errors: {{ nameError }}</div>
  </transition>
</div>
Run Code Online (Sandbox Code Playgroud)