创新互联VUE3教程:Vue3.0列表过渡

目前为止,关于过渡我们已经讲到:

创新互联公司网站建设提供从项目策划、软件开发,软件安全维护、网站优化(SEO)、网站分析、效果评估等整套的建站服务,主营业务为成都网站建设、网站建设,app软件开发以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。创新互联公司深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

  • 单个节点
  • 同一时间渲染多个节点中的一个

那么怎么同时渲染整个列表,比如使用 v-for?在这种场景中,使用 组件。在我们深入例子之前,先了解关于这个组件的几个特点:

  • 不同于 ,它会以一个真实元素渲染:默认为一个 。你也可以通过 tag attribute 更换为其他元素。
  • 过渡模式不可用,因为我们不再相互切换特有的元素。
  • 内部元素总是需要提供唯一的 key attribute 值。
  • CSS 过渡的类将会应用在内部的元素中,而不是这个组/容器本身。

#列表的进入/离开过渡

现在让我们由一个简单的例子深入,进入和离开的过渡使用之前一样的 CSS class 名。

{{ item }}

const Demo = {
  data() {
    return {
      items: [1, 2, 3, 4, 5, 6, 7, 8, 9],
      nextNum: 10
    }
  },
  methods: {
    randomIndex() {
      return Math.floor(Math.random() * this.items.length)
    },
    add() {
      this.items.splice(this.randomIndex(), 0, this.nextNum++)
    },
    remove() {
      this.items.splice(this.randomIndex(), 1)
    }
  }
}


Vue.createApp(Demo).mount('#list-demo')

.list-item {
  display: inline-block;
  margin-right: 10px;
}
.list-enter-active,
.list-leave-active {
  transition: all 1s ease;
}
.list-enter-from,
.list-leave-to {
  opacity: 0;
  transform: translateY(30px);
}

点击此处实现

这个例子有个问题,当添加和移除元素的时候,周围的元素会瞬间移动到他们的新布局的位置,而不是平滑的过渡,我们下面会解决这个问题。

#列表的排序过渡

组件还有一个特殊之处。不仅可以进入和离开动画,还可以改变定位。要使用这个新功能只需了解新增的 v-move class,它会在元素的改变定位的过程中应用。像之前的类名一样,可以通过 name attribute 来自定义前缀,也可以通过 move-class attribute 手动设置。

该 class 主要用于指定过渡 timing 和 easing 曲线,如下所示:




  • {{ item }}
  • const Demo = {
      data() {
        return {
          items: [1, 2, 3, 4, 5, 6, 7, 8, 9]
        }
      },
      methods: {
        shuffle() {
          this.items = _.shuffle(this.items)
        }
      }
    }
    
    
    Vue.createApp(Demo).mount('#flip-list-demo')

    .flip-list-move {
      transition: transform 0.8s ease;
    }

    点击此处实现

    这个看起来很神奇,内部的实现,Vue 使用了一个叫 FLIP 简单的动画队列使用 transforms 将元素从之前的位置平滑过渡新的位置。

    我们将之前实现的例子和这个技术结合,使我们列表的一切变动都会有动画过渡。

    
    
    
    
    {{ item }}

    const Demo = {
      data() {
        return {
          items: [1, 2, 3, 4, 5, 6, 7, 8, 9],
          nextNum: 10
        }
      },
      methods: {
        randomIndex() {
          return Math.floor(Math.random() * this.items.length)
        },
        add() {
          this.items.splice(this.randomIndex(), 0, this.nextNum++)
        },
        remove() {
          this.items.splice(this.randomIndex(), 1)
        },
        shuffle() {
          this.items = _.shuffle(this.items)
        }
      }
    }
    
    
    Vue.createApp(Demo).mount('#list-complete-demo')

    .list-complete-item {
      transition: all 0.8s ease;
      display: inline-block;
      margin-right: 10px;
    }
    
    
    .list-complete-enter-from,
    .list-complete-leave-to {
      opacity: 0;
      transform: translateY(30px);
    }
    
    
    .list-complete-leave-active {
      position: absolute;
    }

    点击此处实现

    TIP

    需要注意的是使用 FLIP 过渡的元素不能设置为 display: inline。作为替代方案,可以设置为 display: inline-block 或者放置于 flex 中

    FLIP 动画不仅可以实现单列过渡,多维网格也同样可以过渡:

    TODO:示例

    #列表的交错过渡

    通过 data attribute 与 JavaScript 通信,就可以实现列表的交错过渡:

    
    
    
    
  • {{ item.msg }}
  • const Demo = {
      data() {
        return {
          query: '',
          list: [
            { msg: 'Bruce Lee' },
            { msg: 'Jackie Chan' },
            { msg: 'Chuck Norris' },
            { msg: 'Jet Li' },
            { msg: 'Kung Fury' }
          ]
        }
      },
      computed: {
        computedList() {
          var vm = this
          return this.list.filter(item => {
            return item.msg.toLowerCase().indexOf(vm.query.toLowerCase()) !== -1
          })
        }
      },
      methods: {
        beforeEnter(el) {
          el.style.opacity = 0
          el.style.height = 0
        },
        enter(el, done) {
          gsap.to(el, {
            opacity: 1,
            height: '1.6em',
            delay: el.dataset.index * 0.15,
            onComplete: done
          })
        },
        leave(el, done) {
          gsap.to(el, {
            opacity: 0,
            height: 0,
            delay: el.dataset.index * 0.15,
            onComplete: done
          })
        }
      }
    }
    
    
    Vue.createApp(Demo).mount('#demo')

    点击此处实现

    #可复用的过渡

    过渡可以通过 Vue 的组件系统实现复用。要创建一个可复用过渡组件,你需要做的就是将 或者 作为根组件,然后将任何子组件放置在其中就可以了。

    TODO:使用 Vue3 重构

    使用 template 的简单例子:

    Vue.component('my-special-transition', {
      template: '\
        \
          \
        \
      ',
      methods: {
        beforeEnter(el) {
          // ...
        },
        afterEnter(el) {
          // ...
        }
      }
    })

    函数式组件更适合完成这个任务:

    Vue.component('my-special-transition', {
      functional: true,
      render: function(createElement, context) {
        var data = {
          props: {
            name: 'very-special-transition',
            mode: 'out-in'
          },
          on: {
            beforeEnter(el) {
              // ...
            },
            afterEnter(el) {
              // ...
            }
          }
        }
        return createElement('transition', data, context.children)
      }
    })

    #动态过渡

    在 Vue 中即使是过渡也是数据驱动的!动态过渡最基本的例子是通过 name attribute 来绑定动态值。

    
      
    

    当你想用 Vue 的过渡系统来定义的 CSS 过渡/动画在不同过渡间切换会非常有用。

    所有过渡 attribute 都可以动态绑定,但我们不仅仅只有 attribute 可以利用,还可以通过事件钩子获取上下文中的所有数据,因为事件钩子都是方法。这意味着,根据组件的状态不同,你的 JavaScript 过渡会有不同的表现

    
    
    
    
    Fade In: Fade Out:

    hello

    const app = Vue.createApp({
      data() {
        return {
          show: true,
          fadeInDuration: 1000,
          fadeOutDuration: 1000,
          maxFadeDuration: 1500,
          stop: true
        }
      },
      mounted() {
        this.show = false
      },
      methods: {
        beforeEnter(el) {
          el.style.opacity = 0
        },
        enter(el, done) {
          var vm = this
          Velocity(
            el,
            { opacity: 1 },
            {
              duration: this.fadeInDuration,
              complete: function() {
                done()
                if (!vm.stop) vm.show = false
              }
            }
          )
        },
        leave(el, done) {
          var vm = this
          Velocity(
            el,
            { opacity: 0 },
            {
              duration: this.fadeOutDuration,
              complete: function() {
                done()
                vm.show = true
              }
            }
          )
        }
      }
    })
    
    
    app.mount('#dynamic-fade-demo')

    TODO:示例

    最后,创建动态过渡的最终方案是组件通过接受 props 来动态修改之前的过渡。一句老话,唯一的限制是你的想象力。

    网站名称:创新互联VUE3教程:Vue3.0列表过渡
    链接分享:http://www.shufengxianlan.com/qtweb/news27/68727.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联