首页 > 其他分享 >Vue动画效果-商品加入购物车

Vue动画效果-商品加入购物车

时间:2023-12-06 16:56:28浏览次数:32  
标签:动画 Vue return string ret 购物车 type events fn

购物类app中常有商品加入购物车的动画需求

主要实现代码

type Fn = (...args: any[]) => void

interface Events {
  [name: string]: Fn[]
}

export class EventEmitter {
  events: Events
  constructor() {
    this.events = {}
  }

  on(type: string, fn: Fn) {
    if (!this.events[type]) {
      this.events[type] = []
    }
    this.events[type].push(fn)
  }
  off(type?: string, fn?: Fn) {
    if (!type && !fn) {
      this.events = {}
      return this
    }
    if (type) {
      if (!fn) {
        this.events[type] = []
        return this
      }
      const events = this.events[type]
      if (!events) {
        return this
      }
      let count = events.length
      while (count--) {
        if (events[count] === fn) {
          events.splice(count, 1)
        }
      }
      return this
    }
  }
  emit(type: string, ...args: any[]) {
    const events = this.events[type]
    if (!events) {
      return
    }
    let ret
    for (let i = 0; i < events.length; i++) {
      const fn = events[i]
      if (fn) {
        ret = fn.apply(this, args) as unknown
        if (ret === true) {
          return ret
        }
      }
    }
  }

  distory() {
    this.events = {}
  }
}

因为触发事件和实现不在一个文件中,添加了一个单利处理事件

let eventBus: EventEmitter
export function useEventBus() {
  if (!eventBus) {
    eventBus = new EventEmitter()
  }
  return eventBus
}

 


type Fn = (...args: any[]) => void interface Events { [name: string]: Fn[] } export class EventEmitter { events: Events constructor() { this.events = {} } on(type: string, fn: Fn) { if (!this.events[type]) { this.events[type] = [] } this.events[type].push(fn) } off(type?: string, fn?: Fn) { if (!type && !fn) { this.events = {} return this } if (type) { if (!fn) { this.events[type] = [] return this } const events = this.events[type] if (!events) { return this } let count = events.length while (count--) { if (events[count] === fn) { events.splice(count, 1) } } return this } } emit(type: string, ...args: any[]) { const events = this.events[type] if (!events) { return } let ret for (let i = 0; i < events.length; i++) { const fn = events[i] if (fn) { ret = fn.apply(this, args) as unknown if (ret === true) { return ret } } } } distory() { this.events = {} } }

使用方法

<div class="shop-cart__ball-container">
      <div v-for="(v, i) in items" :key="i">
        <Transition @beforeEnter="beforeEnter" @enter="enter" @afterEnter="afterEnter">
          <div class="ball" v-show="v.isShow">
            <div class="inner"></div>
          </div>
        </Transition>
      </div>
    </div>


.ball-container {
    .ball {
      position: fixed;
      bottom: 10px;
      left: 25px;
      transition: all 0.4s cubic-bezier(0.49, -0.29, 0.75, 0.41);
      .inner {
        width: 22px;
        height: 22px;
        border-radius: 50%;
        background: var(--op-primary-color);
        transition: all 0.4s linear;
      }
    }
  }

具体项目代码地址:http://github.com/duzhaoquan/ele-h5.git

 

标签:动画,Vue,return,string,ret,购物车,type,events,fn
From: https://www.cnblogs.com/duzhaoquan/p/17879911.html

相关文章

  • Unity DOTS《群体战斗弹幕游戏》核心技术分析之3D角色动画 鲨鱼辣椒 鲨鱼辣椒
    最近DOTS发布了正式的版本,我们来分享现在流行基于群体战斗的弹幕类游戏,实现的核心原理。今天给大家介绍大规模战斗群体3D角色的动画如何来实现。DOTS对角色动画支持的局限性截止到UnityDOTS发布的版本1.0.16,目前还是无法很好的支持3D角色动画。在DOTS的baker过程种,不支持......
  • Vue3+Vite+ElementPlus管理系统常见问题
     本文本记录了使用Vue3+Vite+ElementPlus从0开始搭建一个前端工程会面临的常见问题,没有技术深度,但全都是解决实际问题的干货,可以当作是问题手册以备后用。本人日常工作偏后端开发,因此,文中的一些前端术语描述可能不严谨,敬请谅解。重点是:这里记录的解决方案都是行之有效果的,拿来......
  • Vue 应用程序性能优化:代码压缩、加密和混淆配置详解
    ​简介在Vue应用程序的开发中,代码压缩、加密和混淆是优化应用程序性能和提高安全性的重要步骤。VueCLI是一个功能强大的开发工具,它提供了方便的配置选项来实现这些功能。本文将介绍如何使用VueCLI配置代码压缩、加密和混淆功能,以提高应用程序的性能和安全性。一、配置代......
  • vue 的标签内属性的各使用形式
    标签内属性形式在Vue中,v-xx、@xx和:xx是不同的语法形式,具有不同的用途和语义v-xx形式:这是用于注册或使用Vue提供的内置指令或自定义指令。v-是Vue指令的前缀,后面跟着指令的名称例如,内置指令:v-if可以根据条件控制元素的显示和隐藏,v-for可以用于循环渲染列表,......
  • vue 中初始化 ref
    在Vue中,使用ref函数创建响应式的数据:对象初始化:constaddGoodsDate=ref({});constaddGoodsDate=ref({name:'',price:0});数组初始化:constappGoodsList=ref([]);布尔值初始化:constconfirmDialog=ref(false);字符串初始化:constconfirmDia......
  • 解决Vue处理超过16位数字精度丢失问题
    当我们使用MyBatis-Plus使用ID_WORKER或者ASSIGN_ID(雪花算法) 生成的id作为主键时,因为其长度,为19位,而前端一般能处理16位,如果不处理的话在前端会造成精度丢失,最后两位会变成00,如下图,感觉像是四舍五入后的效果。 处理这种问题有两种方案,要么后端出处理,要么前端处理后端......
  • Vue3+Vite+ElementPlus管理系统常见问题
    本文本记录了使用Vue3+Vite+ElementPlus从0开始搭建一个前端工程会面临的常见问题,没有技术深度,但全都是解决实际问题的干货,可以当作是问题手册以备后用。本人日常工作偏后端开发,因此,文中的一些前端术语描述可能不严谨,敬请谅解。重点是:这里记录的解决方案都是行之有效果的,拿来即......
  • 技术博客:Vue中各种混淆用法汇总
    ​ 技术博客:Vue中各种混淆用法汇总 摘要本文主要介绍了在Vue中使用的一些常见混淆用法,包括newVue()、exportdefault{}、createApp()、Vue.component、Vue3注册全局组件、Vue.use()等,以及如何使用混淆器对代码进行加固,保护应用安全。引言在Vue开发中,对于新手来说,常常会......
  • vue3引入mitt(eventBus)
    版本"mitt":"^3.0.1"1、npminstallmitt2、项目下创建文件夹eventBus建myEventBus.jsimportmittfrom'mitt'exportdefaultmitt() 3、组件里监听组件AimportmyEventBusfrom"../eventBus/myEventBus";myEventBus.on('closeVisit�......
  • Vue使用el-cascader实现地区选择器组件
    1.使用组件-效果展示(推荐)1.2安装组件依赖(默认是V6版本,旧版本V5.02)官方文档地址(二级联动,三级联动包含教程):https://www.npmjs.com/package/element-china-area-datanpminstallelement-china-area-data-Snpminstallelement-china-area-data@5.0.2-S1.3V6版本使用注......